From 36cc646c3c5f905a9c3c9c37daacb713eb5cfc00 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B3zef=20Kucia?= <jkucia@codeweavers.com>
Date: Tue, 13 Dec 2016 11:13:46 +0100
Subject: [PATCH] d3d11/tests: Work around bug in AMD Windows drivers.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Reply-To: wine-devel <wine-devel@winehq.org>

---
 dlls/d3d11/tests/d3d11.c | 41 ++++++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index a55c074..d24079f 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,22 +6533,22 @@ 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);
 
         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);
 
         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);
 
@@ -6550,7 +6556,6 @@ static void test_depth_stencil_sampling(void)
         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,12 +6563,12 @@ 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);
 
         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);
 
@@ -6571,6 +6576,7 @@ static void test_depth_stencil_sampling(void)
         {
             ID3D11DepthStencilView_Release(dsv);
             ID3D11ShaderResourceView_Release(depth_srv);
+            ID3D11Texture2D_Release(dsv_texture);
             ID3D11Texture2D_Release(texture);
             continue;
         }
@@ -6584,17 +6590,17 @@ 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);
 
         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);
 
@@ -6603,23 +6609,24 @@ static void test_depth_stencil_sampling(void)
         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);
 
         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);
 
         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

