=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: tests: Add tests for atomic_iadd on TGSM.

Alexandre Julliard julliard at winehq.org
Mon Oct 1 20:40:45 CDT 2018


Module: vkd3d
Branch: master
Commit: 296833e5ab0e9a42ca329908a3253049cbf2a021
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=296833e5ab0e9a42ca329908a3253049cbf2a021

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Mon Oct  1 13:57:09 2018 +0200

tests: Add tests for atomic_iadd on TGSM.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tests/d3d12.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 187 insertions(+)

diff --git a/tests/d3d12.c b/tests/d3d12.c
index c40ce12..c7f4977 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);




More information about the wine-cvs mailing list