[PATCH 3/7] d3d11/tests: Add workaround for bug in AMD Windows driver.

Józef Kucia jkucia at codeweavers.com
Thu Dec 15 06:45:07 CST 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/d3d11/tests/d3d11.c | 59 +++++++++++++++++++++++++++---------------------
 1 file changed, 33 insertions(+), 26 deletions(-)

diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 0edb5dc..1fd690c 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -6290,12 +6290,12 @@ static void test_texture(void)
 static void test_depth_stencil_sampling(void)
 {
     ID3D11PixelShader *ps_cmp, *ps_depth, *ps_stencil, *ps_depth_stencil;
+    ID3D11Texture2D *texture, *rt_texture, *dsv_texture;
     ID3D11ShaderResourceView *depth_srv, *stencil_srv;
     ID3D11SamplerState *cmp_sampler, *sampler;
     D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
     D3D11_DEPTH_STENCIL_VIEW_DESC dsv_desc;
     struct d3d11_test_context test_context;
-    ID3D11Texture2D *texture, *rt_texture;
     D3D11_TEXTURE2D_DESC texture_desc;
     D3D11_SAMPLER_DESC sampler_desc;
     ID3D11DeviceContext *context;
@@ -6307,7 +6307,6 @@ static void test_depth_stencil_sampling(void)
     unsigned int i;
     HRESULT hr;
 
-    static const float black[] = {0.0f, 0.0f, 0.0f, 0.0f};
     static const DWORD ps_compare_code[] =
     {
 #if 0
@@ -6497,7 +6496,14 @@ static void test_depth_stencil_sampling(void)
     for (i = 0; i < sizeof(tests) / sizeof(*tests); ++i)
     {
         texture_desc.Format = tests[i].typeless_format;
-        texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DEPTH_STENCIL;
+        texture_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
+        hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &dsv_texture);
+        ok(SUCCEEDED(hr), "Failed to create texture for format %#x, hr %#x.\n",
+                texture_desc.Format, hr);
+
+        /* We use separate resources for DEPTH_STENCIL and SHADER_RESOURCE in
+         * order to avoid a bug in AMD Windows driver. */
+        texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
         hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &texture);
         ok(SUCCEEDED(hr), "Failed to create texture for format %#x, hr %#x.\n",
                 texture_desc.Format, hr);
@@ -6506,7 +6512,7 @@ static void test_depth_stencil_sampling(void)
         dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
         dsv_desc.Flags = 0;
         U(dsv_desc).Texture2D.MipSlice = 0;
-        hr = ID3D11Device_CreateDepthStencilView(device, (ID3D11Resource *)texture, &dsv_desc, &dsv);
+        hr = ID3D11Device_CreateDepthStencilView(device, (ID3D11Resource *)dsv_texture, &dsv_desc, &dsv);
         ok(SUCCEEDED(hr), "Failed to create depth stencil view for format %#x, hr %#x.\n",
                 dsv_desc.Format, hr);
 
@@ -6527,30 +6533,29 @@ static void test_depth_stencil_sampling(void)
                 NULL, &ps_constant, 0, 0);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH, 1.0f, 0);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 0.0f, 2);
+        todo_wine check_texture_float(rt_texture, 0.0f, 2);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH, 0.0f, 0);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
         check_texture_float(rt_texture, 1.0f, 2);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH, 0.5f, 0);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 0.0f, 2);
+        todo_wine check_texture_float(rt_texture, 0.0f, 2);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH, 0.6f, 0);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 0.0f, 2);
+        todo_wine check_texture_float(rt_texture, 0.0f, 2);
 
         ps_constant.x = 0.7f;
         ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0,
                 NULL, &ps_constant, 0, 0);
 
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
         draw_quad(&test_context);
         check_texture_float(rt_texture, 1.0f, 2);
 
@@ -6558,19 +6563,20 @@ static void test_depth_stencil_sampling(void)
         ID3D11DeviceContext_PSSetSamplers(context, 0, 1, &sampler);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH, 1.0f, 0);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 1.0f, 2);
+        todo_wine check_texture_float(rt_texture, 1.0f, 2);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH, 0.2f, 0);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 0.2f, 2);
+        todo_wine check_texture_float(rt_texture, 0.2f, 2);
 
         if (!tests[i].stencil_view_format)
         {
             ID3D11DepthStencilView_Release(dsv);
             ID3D11ShaderResourceView_Release(depth_srv);
+            ID3D11Texture2D_Release(dsv_texture);
             ID3D11Texture2D_Release(texture);
             continue;
         }
@@ -6584,42 +6590,43 @@ static void test_depth_stencil_sampling(void)
         ID3D11DeviceContext_PSSetShaderResources(context, 0, 1, &stencil_srv);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_STENCIL, 0.0f, 0);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
         check_texture_float(rt_texture, 0.0f, 0);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_STENCIL, 0.0f, 100);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 100.0f, 0);
+        todo_wine check_texture_float(rt_texture, 100.0f, 0);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_STENCIL, 0.0f, 255);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 255.0f, 0);
+        todo_wine check_texture_float(rt_texture, 255.0f, 0);
 
         ID3D11DeviceContext_PSSetShader(context, ps_depth_stencil, NULL, 0);
         ID3D11DeviceContext_PSSetShaderResources(context, 0, 1, &depth_srv);
         ID3D11DeviceContext_PSSetShaderResources(context, 1, 1, &stencil_srv);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.3f, 3);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 3.3f, 2);
+        todo_wine check_texture_float(rt_texture, 3.3f, 2);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 3);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
-        check_texture_float(rt_texture, 4.0f, 2);
+        todo_wine check_texture_float(rt_texture, 4.0f, 2);
 
         ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.0f, 0);
-        ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+        ID3D11DeviceContext_CopyResource(context, (ID3D11Resource *)texture, (ID3D11Resource *)dsv_texture);
         draw_quad(&test_context);
         check_texture_float(rt_texture, 0.0f, 2);
 
         ID3D11DepthStencilView_Release(dsv);
         ID3D11ShaderResourceView_Release(depth_srv);
         ID3D11ShaderResourceView_Release(stencil_srv);
+        ID3D11Texture2D_Release(dsv_texture);
         ID3D11Texture2D_Release(texture);
     }
 
-- 
2.7.3




More information about the wine-patches mailing list