From 296833e5ab0e9a42ca329908a3253049cbf2a021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Mon, 1 Oct 2018 13:57:09 +0200 Subject: [PATCH] tests: Add tests for atomic_iadd on TGSM. 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 --- tests/d3d12.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) diff --git a/tests/d3d12.c b/tests/d3d12.c index c40ce127..c7f4977a 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -7656,6 +7656,192 @@ static void test_shader_instructions(void) destroy_test_context(&context); } +static void test_compute_shader_instructions(void) +{ + D3D12_ROOT_SIGNATURE_DESC root_signature_desc; + const D3D12_SHADER_BYTECODE *current_cs; + ID3D12GraphicsCommandList *command_list; + D3D12_ROOT_PARAMETER root_parameters[2]; + struct resource_readback rb; + struct test_context context; + ID3D12CommandQueue *queue; + ID3D12Resource *buffer; + ID3D12Device *device; + unsigned int i, j; + uint32_t value; + HRESULT hr; + + static const DWORD cs_atomic_iadd_tgsm_raw_code[] = + { +#if 0 + RWByteAddressBuffer buffer; + + groupshared uint m0; + groupshared uint m1; + + uint4 u; + int4 s; + + [numthreads(1, 1, 1)] + void main() + { + m0 = buffer.Load(0 * 4); + m1 = buffer.Load(1 * 4); + + InterlockedAdd(m0, u.x); + InterlockedAdd(m1, s.x); + + GroupMemoryBarrierWithGroupSync(); + + buffer.Store(0 * 4, m0); + buffer.Store(1 * 4, m1); + } +#endif + 0x43425844, 0xcd7bfbec, 0x273e77a4, 0x49b75eb9, 0xe7d291f4, 0x00000001, 0x000001d0, 0x00000003, + 0x0000002c, 0x0000003c, 0x0000004c, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, 0x4e47534f, + 0x00000008, 0x00000000, 0x00000008, 0x58454853, 0x0000017c, 0x00050050, 0x0000005f, 0x0100086a, + 0x04000059, 0x00208e46, 0x00000000, 0x00000002, 0x0300009d, 0x0011e000, 0x00000000, 0x02000068, + 0x00000001, 0x0400009f, 0x0011f000, 0x00000000, 0x00000004, 0x0400009f, 0x0011f000, 0x00000001, + 0x00000004, 0x0400009b, 0x00000001, 0x00000001, 0x00000001, 0x890000a5, 0x800002c2, 0x00199983, + 0x00100012, 0x00000000, 0x00004001, 0x00000000, 0x0011e006, 0x00000000, 0x070000a6, 0x0011f012, + 0x00000000, 0x00004001, 0x00000000, 0x0010000a, 0x00000000, 0x080000ad, 0x0011f000, 0x00000000, + 0x00004001, 0x00000000, 0x0020800a, 0x00000000, 0x00000000, 0x890000a5, 0x800002c2, 0x00199983, + 0x00100012, 0x00000000, 0x00004001, 0x00000004, 0x0011e006, 0x00000000, 0x070000a6, 0x0011f012, + 0x00000001, 0x00004001, 0x00000000, 0x0010000a, 0x00000000, 0x080000ad, 0x0011f000, 0x00000001, + 0x00004001, 0x00000000, 0x0020800a, 0x00000000, 0x00000001, 0x010018be, 0x070000a5, 0x00100022, + 0x00000000, 0x00004001, 0x00000000, 0x0011f006, 0x00000001, 0x070000a5, 0x00100012, 0x00000000, + 0x00004001, 0x00000000, 0x0011f006, 0x00000000, 0x070000a6, 0x0011e032, 0x00000000, 0x00004001, + 0x00000000, 0x00100046, 0x00000000, 0x0100003e, + }; + static D3D12_SHADER_BYTECODE cs_atomic_iadd_tgsm_raw + = {cs_atomic_iadd_tgsm_raw_code, sizeof(cs_atomic_iadd_tgsm_raw_code)}; + static const DWORD cs_atomic_iadd_const_code[] = + { +#if 0 + RWByteAddressBuffer buffer; + + groupshared uint m; + + [numthreads(1, 1, 1)] + void main() + { + m = buffer.Load(0 * 4); + + InterlockedAdd(m, -1); + buffer.InterlockedAdd(1 * 4, -1); + + GroupMemoryBarrierWithGroupSync(); + + buffer.Store(0 * 4, m); + } +#endif + 0x43425844, 0x85f9168a, 0x5fe0c4d5, 0x5989b572, 0xecb6ce3c, 0x00000001, 0x0000014c, 0x00000003, + 0x0000002c, 0x0000003c, 0x0000004c, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, 0x4e47534f, + 0x00000008, 0x00000000, 0x00000008, 0x58454853, 0x000000f8, 0x00050050, 0x0000003e, 0x0100086a, + 0x0300009d, 0x0011e000, 0x00000000, 0x02000068, 0x00000001, 0x0400009f, 0x0011f000, 0x00000000, + 0x00000004, 0x0400009b, 0x00000001, 0x00000001, 0x00000001, 0x890000a5, 0x800002c2, 0x00199983, + 0x00100012, 0x00000000, 0x00004001, 0x00000000, 0x0011e006, 0x00000000, 0x070000a6, 0x0011f012, + 0x00000000, 0x00004001, 0x00000000, 0x0010000a, 0x00000000, 0x070000ad, 0x0011f000, 0x00000000, + 0x00004001, 0x00000000, 0x00004001, 0xffffffff, 0x070000ad, 0x0011e000, 0x00000000, 0x00004001, + 0x00000004, 0x00004001, 0xffffffff, 0x010018be, 0x070000a5, 0x00100012, 0x00000000, 0x00004001, + 0x00000000, 0x0011f006, 0x00000000, 0x070000a6, 0x0011e012, 0x00000000, 0x00004001, 0x00000000, + 0x0010000a, 0x00000000, 0x0100003e, + }; + static const D3D12_SHADER_BYTECODE cs_atomic_iadd_const + = {cs_atomic_iadd_const_code, sizeof(cs_atomic_iadd_const_code)}; + static const struct + { + const D3D12_SHADER_BYTECODE *cs; + struct uvec4 u; + struct ivec4 s; + uint32_t input_data[10]; + uint32_t expected_data[10]; + } + tests[] = + { + {&cs_atomic_iadd_tgsm_raw, { 0}, { 0}, {0, 0}, {0, 0}}, + {&cs_atomic_iadd_tgsm_raw, { 0}, { 0}, {1, 1}, {1, 1}}, + {&cs_atomic_iadd_tgsm_raw, { 1}, { 1}, {0, 0}, {1, 1}}, + {&cs_atomic_iadd_tgsm_raw, {0xffffffff}, {-1}, {1, 1}, {0, 0}}, + {&cs_atomic_iadd_tgsm_raw, {0xffffffff}, {-1}, {4, 4}, {3, 3}}, + + {&cs_atomic_iadd_const, {}, {}, {0x00000000, 0x00000000}, {0xffffffff, 0xffffffff}}, + {&cs_atomic_iadd_const, {}, {}, {0x00000001, 0x00000001}, {0x00000000, 0x00000000}}, + {&cs_atomic_iadd_const, {}, {}, {0xffffffff, 0xffffffff}, {0xfffffffe, 0xfffffffe}}, + }; + + if (!init_compute_test_context(&context)) + return; + device = context.device; + command_list = context.list; + queue = context.queue; + + root_parameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; + root_parameters[0].Descriptor.ShaderRegister = 0; + root_parameters[0].Descriptor.RegisterSpace = 0; + root_parameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; + root_parameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; + root_parameters[1].Constants.ShaderRegister = 0; + root_parameters[1].Constants.RegisterSpace = 0; + root_parameters[1].Constants.Num32BitValues = 8; + root_parameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL; + root_signature_desc.NumParameters = ARRAY_SIZE(root_parameters); + root_signature_desc.pParameters = root_parameters; + root_signature_desc.NumStaticSamplers = 0; + root_signature_desc.pStaticSamplers = NULL; + root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE; + hr = create_root_signature(device, &root_signature_desc, &context.root_signature); + ok(SUCCEEDED(hr), "Failed to create root signature, hr %#x.\n", hr); + + buffer = create_default_buffer(device, 512, + D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_DEST); + + current_cs = NULL; + for (i = 0; i < ARRAY_SIZE(tests); ++i) + { + if (current_cs != tests[i].cs) + { + if (context.pipeline_state) + ID3D12PipelineState_Release(context.pipeline_state); + current_cs = tests[i].cs; + context.pipeline_state = create_compute_pipeline_state(device, + context.root_signature, *current_cs); + } + + upload_buffer_data(buffer, 0, sizeof(tests[i].input_data), tests[i].input_data, + queue, command_list); + reset_command_list(command_list, context.allocator); + transition_resource_state(command_list, buffer, + D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_UNORDERED_ACCESS); + + ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, context.root_signature); + ID3D12GraphicsCommandList_SetComputeRootUnorderedAccessView(command_list, + 0, ID3D12Resource_GetGPUVirtualAddress(buffer)); + ID3D12GraphicsCommandList_SetComputeRoot32BitConstants(command_list, 1, 4, &tests[i].u, 0); + ID3D12GraphicsCommandList_SetComputeRoot32BitConstants(command_list, 1, 4, &tests[i].s, 4); + + ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state); + ID3D12GraphicsCommandList_Dispatch(command_list, 1, 1, 1); + + transition_resource_state(command_list, buffer, + D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE); + get_buffer_readback_with_command_list(buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list); + for (j = 0; j < ARRAY_SIZE(tests[i].expected_data); ++j) + { + value = get_readback_uint(&rb, j, 0, 0); + ok(value == tests[i].expected_data[j], "Test %u: Got 0x%08x, expected 0x%08x at %u.\n", + i, value, tests[i].expected_data[j], j); + } + release_resource_readback(&rb); + reset_command_list(command_list, context.allocator); + transition_resource_state(command_list, buffer, + D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_COPY_DEST); + } + + ID3D12Resource_Release(buffer); + destroy_test_context(&context); +} + static void test_discard_instruction(void) { ID3D12PipelineState *pso_discard_nz, *pso_discard_z; @@ -20261,6 +20447,7 @@ START_TEST(d3d12) run_test(test_map_resource); run_test(test_bundle_state_inheritance); run_test(test_shader_instructions); + run_test(test_compute_shader_instructions); run_test(test_discard_instruction); run_test(test_shader_interstage_interface); run_test(test_incompletely_initialized_shader_outputs);