[PATCH 2/2] d3d11/tests: Add tests for binding resource as both SRV and DSV.

Paul Gofman gofmanp at gmail.com
Thu Oct 31 08:23:41 CDT 2019


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
 dlls/d3d11/tests/d3d11.c | 97 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 92 insertions(+), 5 deletions(-)

diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 1213bcf49d..47a974e9fc 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -29385,18 +29385,24 @@ static void test_desktop_window(void)
 
 static void test_sample_attached_rtv(void)
 {
-    ID3D11ShaderResourceView *srv, *srv_test;
+    ID3D11ShaderResourceView *srv, *srv_test, *srv_ds;
+    ID3D11Texture2D *texture, *texture2, *dstexture;
+    D3D11_SHADER_RESOURCE_VIEW_DESC srvds_desc;
+    D3D11_DEPTH_STENCIL_VIEW_DESC dsview_desc;
     struct d3d11_test_context test_context;
     ID3D11RenderTargetView *rtv, *rtvs[2];
-    ID3D11Texture2D *texture, *texture2;
     D3D11_TEXTURE2D_DESC texture_desc;
     D3D11_SAMPLER_DESC sampler_desc;
+    ID3D11DepthStencilView *dsview;
+    ID3D11BlendState *blend_state;
     ID3D11DeviceContext *context;
+    D3D11_BLEND_DESC blend_desc;
     ID3D11SamplerState *sampler;
     struct resource_readback rb;
     ID3D11PixelShader *ps;
     ID3D11Device *device;
     unsigned int x, y;
+    unsigned int i;
     DWORD color;
     HRESULT hr;
 
@@ -29440,8 +29446,28 @@ static void test_sample_attached_rtv(void)
         0x00004002, 0x3e800000, 0x3e800000, 0x3e800000, 0x3e800000, 0x05000036, 0x001020f2, 0x00000000,
         0x00100e46, 0x00000000, 0x05000036, 0x001020f2, 0x00000001, 0x00100e46, 0x00000000, 0x0100003e,
     };
-
     static const float red[] = {1.0f, 0.0f, 0.0f, 0.5f};
+    static const struct
+    {
+        DXGI_FORMAT texture_format, dsv_format, srv_format;
+        UINT dsv_flags;
+        BOOL srv_bind_allowed;
+    }
+    ds_tests[] =
+    {
+        {DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_D24_UNORM_S8_UINT, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
+                0, FALSE},
+        {DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_D24_UNORM_S8_UINT, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
+                D3D11_DSV_READ_ONLY_DEPTH, TRUE},
+        {DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_D24_UNORM_S8_UINT, DXGI_FORMAT_X24_TYPELESS_G8_UINT,
+                D3D11_DSV_READ_ONLY_DEPTH, FALSE},
+        {DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_D24_UNORM_S8_UINT, DXGI_FORMAT_X24_TYPELESS_G8_UINT,
+                D3D11_DSV_READ_ONLY_STENCIL, TRUE},
+        {DXGI_FORMAT_R32_TYPELESS, DXGI_FORMAT_D32_FLOAT, DXGI_FORMAT_R32_FLOAT,
+                0, FALSE},
+        {DXGI_FORMAT_R32_TYPELESS, DXGI_FORMAT_D32_FLOAT, DXGI_FORMAT_R32_FLOAT,
+                D3D11_DSV_READ_ONLY_DEPTH, TRUE},
+    };
 
     if (!init_test_context(&test_context, NULL))
         return;
@@ -29486,7 +29512,6 @@ static void test_sample_attached_rtv(void)
 
     texture_desc.Width = 640;
     texture_desc.Height = 480;
-
     hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &texture2);
     ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
 
@@ -29535,11 +29560,26 @@ static void test_sample_attached_rtv(void)
     hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)texture2, NULL, &srv);
     ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
 
-    /* SRV does not get bound if resource is attached as render target. */
+    memset(&blend_desc, 0, sizeof(blend_desc));
+    blend_desc.IndependentBlendEnable = TRUE;
+    blend_desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
+    blend_desc.RenderTarget[1].RenderTargetWriteMask = 0;
+    hr = ID3D11Device_CreateBlendState(device, &blend_desc, &blend_state);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    ID3D11DeviceContext_OMSetBlendState(context, blend_state, NULL, D3D11_DEFAULT_SAMPLE_MASK);
+    ID3D11BlendState_Release(blend_state);
+
+    /* SRV does not get bound if resource is attached as render target, even if write mask is 0. */
     ID3D11DeviceContext_PSSetShaderResources(context, 0, 1, &srv);
     ID3D11DeviceContext_PSGetShaderResources(context, 0, 1, &srv_test);
     ok(!srv_test, "Unexpected SRV %p.\n", srv_test);
 
+    blend_desc.RenderTarget[1].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
+    hr = ID3D11Device_CreateBlendState(device, &blend_desc, &blend_state);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    ID3D11DeviceContext_OMSetBlendState(context, blend_state, NULL, D3D11_DEFAULT_SAMPLE_MASK);
+    ID3D11BlendState_Release(blend_state);
+
     ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, red);
 
     draw_quad(&test_context);
@@ -29594,6 +29634,53 @@ static void test_sample_attached_rtv(void)
     ID3D11DeviceContext_PSGetShaderResources(context, 0, 1, &srv_test);
     ok(!srv_test, "Unexpected SRV %p.\n", srv_test);
 
+    texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DEPTH_STENCIL;
+    memset(&dsview_desc, 0, sizeof(dsview_desc));
+    dsview_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
+
+    memset(&srvds_desc, 0, sizeof(srvds_desc));
+    srvds_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
+    U(srvds_desc).Texture2D.MipLevels = 1;
+
+    for (i = 0; i < ARRAY_SIZE(ds_tests); ++i)
+    {
+        texture_desc.Format = ds_tests[i].texture_format;
+        hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &dstexture);
+        ok(hr == S_OK, "Test %u, got unexpected hr %#x.\n", i, hr);
+        dsview_desc.Format = ds_tests[i].dsv_format;
+        dsview_desc.Flags = ds_tests[i].dsv_flags;
+        hr = ID3D11Device_CreateDepthStencilView(device, (ID3D11Resource *)dstexture, &dsview_desc, &dsview);
+        ok(hr == S_OK, "Test %u, got unexpected hr %#x.\n", i, hr);
+
+        srvds_desc.Format = ds_tests[i].srv_format;
+        hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)dstexture, &srvds_desc, &srv_ds);
+        ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+
+        ID3D11DeviceContext_OMSetRenderTargets(context, 1, rtvs, NULL);
+        ID3D11DeviceContext_PSSetShaderResources(context, 0, 1, &srv_ds);
+        ID3D11DeviceContext_PSGetShaderResources(context, 0, 1, &srv_test);
+        ok(!!srv_test, "Test %u, unexpected SRV %p.\n", i, srv_test);
+        ID3D11ShaderResourceView_Release(srv_test);
+
+        ID3D11DeviceContext_OMSetRenderTargets(context, 1, rtvs, dsview);
+        ID3D11DeviceContext_PSGetShaderResources(context, 0, 1, &srv_test);
+        ok(!!srv_test == ds_tests[i].srv_bind_allowed, "Test %u, unexpected SRV %p.\n", i, srv_test);
+        if (srv_test)
+            ID3D11ShaderResourceView_Release(srv_test);
+
+        ID3D11DeviceContext_PSSetShaderResources(context, 0, 1, &srv_ds);
+        ID3D11DeviceContext_PSGetShaderResources(context, 0, 1, &srv_test);
+        ok(!!srv_test == ds_tests[i].srv_bind_allowed, "Test %u, unexpected SRV %p.\n", i, srv_test);
+        if (srv_test)
+            ID3D11ShaderResourceView_Release(srv_test);
+
+        ID3D11Texture2D_Release(dstexture);
+        ID3D11DepthStencilView_Release(dsview);
+        ID3D11ShaderResourceView_Release(srv_ds);
+    }
+
+    ID3D11DeviceContext_OMSetRenderTargets(context, 2, rtvs, NULL);
+
     ID3D11RenderTargetView_Release(rtv);
     ID3D11ShaderResourceView_Release(srv);
     ID3D11SamplerState_Release(sampler);
-- 
2.23.0




More information about the wine-devel mailing list