=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Allow creating SRVs for structured buffers with NULL description.

Alexandre Julliard julliard at winehq.org
Thu Jul 21 09:58:55 CDT 2016


Module: wine
Branch: master
Commit: 3056608fb86618b82ca21b7d5c268e78b0282781
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3056608fb86618b82ca21b7d5c268e78b0282781

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Jul 20 15:49:44 2016 +0200

d3d11: Allow creating SRVs for structured buffers with NULL description.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3d11/tests/d3d11.c | 35 +++++++++++++++++++++++++++++++++++
 dlls/d3d11/view.c        | 27 ++++++++++++++++++++++++++-
 2 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 2ffad87..df45eb5 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -3060,6 +3060,7 @@ static void test_create_shader_resource_view(void)
     ULONG refcount, expected_refcount;
     ID3D11ShaderResourceView *srview;
     D3D_FEATURE_LEVEL feature_level;
+    D3D11_BUFFER_DESC buffer_desc;
     ID3D11Device *device, *tmp;
     ID3D11Texture3D *texture3d;
     ID3D11Texture2D *texture2d;
@@ -3255,6 +3256,40 @@ static void test_create_shader_resource_view(void)
     ID3D11ShaderResourceView_Release(srview);
     ID3D11Buffer_Release(buffer);
 
+    if (feature_level >= D3D_FEATURE_LEVEL_11_0)
+    {
+        buffer_desc.ByteWidth = 1024;
+        buffer_desc.Usage = D3D11_USAGE_DEFAULT;
+        buffer_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
+        buffer_desc.CPUAccessFlags = 0;
+        buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
+        buffer_desc.StructureByteStride = 4;
+
+        hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &buffer);
+        ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr);
+
+        hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)buffer, NULL, &srview);
+        ok(SUCCEEDED(hr), "Got unexpected hr %#x.\n", hr);
+
+        memset(&srv_desc, 0, sizeof(srv_desc));
+        ID3D11ShaderResourceView_GetDesc(srview, &srv_desc);
+
+        ok(srv_desc.Format == DXGI_FORMAT_UNKNOWN, "Got unexpected format %#x.\n", srv_desc.Format);
+        ok(srv_desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFER, "Got unexpected view dimension %#x.\n",
+                srv_desc.ViewDimension);
+        ok(!U(srv_desc).Buffer.FirstElement, "Got unexpected first element %u.\n",
+                U(srv_desc).Buffer.FirstElement);
+        ok(U(srv_desc).Buffer.NumElements == 256, "Got unexpected num elements %u.\n",
+                U(srv_desc).Buffer.NumElements);
+
+        ID3D11ShaderResourceView_Release(srview);
+        ID3D11Buffer_Release(buffer);
+    }
+    else
+    {
+        skip("Structured buffers require feature level 11_0.\n");
+    }
+
     texture2d_desc.Width = 512;
     texture2d_desc.Height = 512;
     texture2d_desc.SampleDesc.Count = 1;
diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c
index 18ec0a2..a13316f 100644
--- a/dlls/d3d11/view.c
+++ b/dlls/d3d11/view.c
@@ -446,6 +446,32 @@ static HRESULT set_srv_desc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc,
 
     switch (dimension)
     {
+        case D3D11_RESOURCE_DIMENSION_BUFFER:
+        {
+            D3D11_BUFFER_DESC buffer_desc;
+            ID3D11Buffer *buffer;
+
+            if (FAILED(ID3D11Resource_QueryInterface(resource, &IID_ID3D11Buffer, (void **)&buffer)))
+            {
+                ERR("Resource of type BUFFER doesn't implement ID3D11Buffer.\n");
+                return E_INVALIDARG;
+            }
+
+            ID3D11Buffer_GetDesc(buffer, &buffer_desc);
+            ID3D11Buffer_Release(buffer);
+
+            if (buffer_desc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED)
+            {
+                desc->Format = DXGI_FORMAT_UNKNOWN;
+                desc->ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
+                desc->u.Buffer.u1.FirstElement = 0;
+                desc->u.Buffer.u2.NumElements = buffer_desc.ByteWidth / buffer_desc.StructureByteStride;
+                return S_OK;
+            }
+
+            return E_INVALIDARG;
+        }
+
         case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
         {
             D3D11_TEXTURE1D_DESC texture_desc;
@@ -552,7 +578,6 @@ static HRESULT set_srv_desc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc,
 
         default:
             ERR("Unhandled resource dimension %#x.\n", dimension);
-        case D3D11_RESOURCE_DIMENSION_BUFFER:
             return E_INVALIDARG;
     }
 }




More information about the wine-cvs mailing list