From 33c65ed0c57aa50608644911d601df59bf1bc446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Sun, 26 Feb 2017 18:47:59 +0100 Subject: [PATCH] d3d11/tests: Add test for ld_structured instruction. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Józef Kucia Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/d3d11/tests/d3d11.c | 132 +++++++++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 26 deletions(-) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 8f37304b5e1..329acd4805b 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -1042,6 +1042,16 @@ static BOOL is_nvidia_device(ID3D11Device *device) return is_vendor_device(device, 0x10de); } +static BOOL check_compute_shaders_via_sm4_support(ID3D11Device *device) +{ + D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS options; + + if (FAILED(ID3D11Device_CheckFeatureSupport(device, + D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &options, sizeof(options)))) + return FALSE; + return options.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x; +} + static IDXGISwapChain *create_swapchain(ID3D11Device *device, HWND window, const struct swapchain_desc *swapchain_desc) { DXGI_SWAP_CHAIN_DESC dxgi_desc; @@ -14095,17 +14105,26 @@ static void test_render_target_device_mismatch(void) static void test_buffer_srv(void) { + struct shader + { + const DWORD *code; + size_t size; + BOOL requires_raw_and_structured_buffers; + }; struct buffer { unsigned int byte_count; unsigned int data_offset; const void *data; + unsigned int structure_byte_stride; }; + BOOL raw_and_structured_buffers_supported; D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc; struct d3d11_test_context test_context; D3D11_SUBRESOURCE_DATA resource_data; const struct buffer *current_buffer; + const struct shader *current_shader; ID3D11ShaderResourceView *srv; D3D11_BUFFER_DESC buffer_desc; ID3D11DeviceContext *context; @@ -14149,6 +14168,40 @@ static void test_buffer_srv(void) 0x00000000, 0x0010001a, 0x00000000, 0x0500001b, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0700002d, 0x001020f2, 0x00000000, 0x00100006, 0x00000000, 0x00107e46, 0x00000000, 0x0100003e, }; + static const struct shader ps_float4 = {ps_float4_code, sizeof(ps_float4_code)}; + static const DWORD ps_structured_code[] = + { +#if 0 + StructuredBuffer b; + + float2 size; + + float4 main(float4 position : SV_POSITION) : SV_Target + { + float2 p; + int2 coords; + p.x = position.x / 640.0f; + p.y = position.y / 480.0f; + coords = int2(p.x * size.x, p.y * size.y); + return b[coords.y * size.x + coords.x]; + } +#endif + 0x43425844, 0x246caabb, 0xf1e7d6b9, 0xcbe720dc, 0xcdc23036, 0x00000001, 0x000001c0, 0x00000004, + 0x00000030, 0x00000064, 0x00000098, 0x000001b0, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, + 0x00000020, 0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000030f, 0x505f5653, 0x5449534f, + 0x004e4f49, 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, + 0x00000003, 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x00000110, + 0x00000040, 0x00000044, 0x0100486a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x040000a2, + 0x00107000, 0x00000000, 0x00000010, 0x04002064, 0x00101032, 0x00000000, 0x00000001, 0x03000065, + 0x001020f2, 0x00000000, 0x02000068, 0x00000001, 0x08000038, 0x00100032, 0x00000000, 0x00101516, + 0x00000000, 0x00208516, 0x00000000, 0x00000000, 0x0a000038, 0x00100032, 0x00000000, 0x00100046, + 0x00000000, 0x00004002, 0x3b088889, 0x3acccccd, 0x00000000, 0x00000000, 0x05000043, 0x00100032, + 0x00000000, 0x00100046, 0x00000000, 0x0a000032, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, + 0x0020800a, 0x00000000, 0x00000000, 0x0010001a, 0x00000000, 0x0500001c, 0x00100012, 0x00000000, + 0x0010000a, 0x00000000, 0x090000a7, 0x001020f2, 0x00000000, 0x0010000a, 0x00000000, 0x00004001, + 0x00000000, 0x00107e46, 0x00000000, 0x0100003e, 0x30494653, 0x00000008, 0x00000002, 0x00000000, + }; + static const struct shader ps_structured = {ps_structured_code, sizeof(ps_structured_code), TRUE}; static const DWORD rgba16[] = { 0xff0000ff, 0xff00ffff, 0xff00ff00, 0xffffff00, @@ -14166,11 +14219,19 @@ static void test_buffer_srv(void) 0xde, 0xad, 0xba, 0xbe, }; + static const struct vec4 rgba_float[] = + { + {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 0.0f, 0.0f, 1.0f}, + {0.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 1.0f, 0.0f, 1.0f}, + }; static const struct buffer rgba16_buffer = {sizeof(rgba16), 0, &rgba16}; static const struct buffer rgba16_offset_buffer = {256 + sizeof(rgba16), 256, &rgba16}; static const struct buffer rgba4_buffer = {sizeof(rgba4), 0, &rgba4}; static const struct buffer r4_buffer = {sizeof(r4), 0, &r4}; static const struct buffer r4_offset_buffer = {256 + sizeof(r4), 256, &r4}; + static const struct buffer float_buffer = {sizeof(rgba_float), 0, &rgba_float, sizeof(*rgba_float)}; + static const struct buffer float_offset_buffer = {256 + sizeof(rgba_float), 256, + &rgba_float, sizeof(*rgba_float)}; static const DWORD rgba16_colors2x2[] = { 0xff0000ff, 0xff0000ff, 0xff00ffff, 0xff00ffff, @@ -14204,23 +14265,27 @@ static void test_buffer_srv(void) static const struct test { + const struct shader *shader; const struct buffer *buffer; DXGI_FORMAT srv_format; - UINT srv_first_element; - UINT srv_element_count; + unsigned int srv_first_element; + unsigned int srv_element_count; struct vec2 size; const DWORD *expected_colors; } tests[] = { - {&rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 16, {4.0f, 4.0f}, rgba16}, - {&rgba16_offset_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 64, 16, {4.0f, 4.0f}, rgba16}, - {&rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4, {2.0f, 2.0f}, rgba16_colors2x2}, - {&rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 1, {1.0f, 1.0f}, rgba16_colors1x1}, - {&rgba4_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4, {2.0f, 2.0f}, rgba4_colors}, - {&r4_buffer, DXGI_FORMAT_R8_UNORM, 0, 4, {2.0f, 2.0f}, r4_colors}, - {&r4_offset_buffer, DXGI_FORMAT_R8_UNORM, 256, 4, {2.0f, 2.0f}, r4_colors}, - {NULL, 0, 0, 0, {2.0f, 2.0f}, zero_colors}, + {&ps_float4, &rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 16, {4.0f, 4.0f}, rgba16}, + {&ps_float4, &rgba16_offset_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 64, 16, {4.0f, 4.0f}, rgba16}, + {&ps_float4, &rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4, {2.0f, 2.0f}, rgba16_colors2x2}, + {&ps_float4, &rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 1, {1.0f, 1.0f}, rgba16_colors1x1}, + {&ps_float4, &rgba4_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4, {2.0f, 2.0f}, rgba4_colors}, + {&ps_float4, &r4_buffer, DXGI_FORMAT_R8_UNORM, 0, 4, {2.0f, 2.0f}, r4_colors}, + {&ps_float4, &r4_offset_buffer, DXGI_FORMAT_R8_UNORM, 256, 4, {2.0f, 2.0f}, r4_colors}, + {&ps_structured, &float_buffer, DXGI_FORMAT_UNKNOWN, 0, 4, {2.0f, 2.0f}, rgba4_colors}, + {&ps_structured, &float_offset_buffer, DXGI_FORMAT_UNKNOWN, 16, 4, {2.0f, 2.0f}, rgba4_colors}, + {&ps_float4, NULL, 0, 0, 0, {2.0f, 2.0f}, zero_colors}, + {&ps_float4, NULL, 0, 0, 0, {1.0f, 1.0f}, zero_colors}, }; if (!init_test_context(&test_context, NULL)) @@ -14228,22 +14293,46 @@ static void test_buffer_srv(void) device = test_context.device; context = test_context.immediate_context; + raw_and_structured_buffers_supported = ID3D11Device_GetFeatureLevel(device) >= D3D_FEATURE_LEVEL_11_0 + || check_compute_shaders_via_sm4_support(device); cb = create_buffer(device, D3D11_BIND_CONSTANT_BUFFER, sizeof(cb_size), NULL); - - hr = ID3D11Device_CreatePixelShader(device, ps_float4_code, sizeof(ps_float4_code), NULL, &ps); - ok(SUCCEEDED(hr), "Failed to create pixel shader, hr %#x.\n", hr); - - ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0); ID3D11DeviceContext_PSSetConstantBuffers(context, 0, 1, &cb); + ps = NULL; srv = NULL; buffer = NULL; + current_shader = NULL; current_buffer = NULL; for (i = 0; i < sizeof(tests) / sizeof(*tests); ++i) { const struct test *test = &tests[i]; + if (test->shader->requires_raw_and_structured_buffers && !raw_and_structured_buffers_supported) + { + skip("Test %u: Raw and structured buffers are not supported.\n", i); + continue; + } + /* Structured buffer views with an offset don't seem to work on WARP. */ + if (test->srv_format == DXGI_FORMAT_UNKNOWN && test->srv_first_element + && is_warp_device(device)) + { + skip("Test %u: Broken WARP.\n", i); + continue; + } + + if (current_shader != test->shader) + { + if (ps) + ID3D11PixelShader_Release(ps); + + current_shader = test->shader; + + hr = ID3D11Device_CreatePixelShader(device, current_shader->code, current_shader->size, NULL, &ps); + ok(SUCCEEDED(hr), "Test %u: Failed to create pixel shader, hr %#x.\n", i, hr); + ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0); + } + if (current_buffer != test->buffer) { if (buffer) @@ -14259,7 +14348,8 @@ static void test_buffer_srv(void) buffer_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; buffer_desc.CPUAccessFlags = 0; buffer_desc.MiscFlags = 0; - buffer_desc.StructureByteStride = 0; + if ((buffer_desc.StructureByteStride = current_buffer->structure_byte_stride)) + buffer_desc.MiscFlags |= D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; resource_data.SysMemPitch = 0; resource_data.SysMemSlicePitch = 0; if (current_buffer->data_offset) @@ -14332,16 +14422,6 @@ static void test_buffer_srv(void) release_test_context(&test_context); } -static BOOL check_compute_shaders_via_sm4_support(ID3D11Device *device) -{ - D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS options; - - if (FAILED(ID3D11Device_CheckFeatureSupport(device, - D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &options, sizeof(options)))) - return FALSE; - return options.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x; -} - static void test_unaligned_raw_buffer_access(const D3D_FEATURE_LEVEL feature_level) { D3D11_UNORDERED_ACCESS_VIEW_DESC uav_desc;