[PATCH vkd3d 10/10] tests: Add test for instance data step rate.

Józef Kucia joseph.kucia at gmail.com
Thu Oct 25 04:24:08 CDT 2018


From: Józef Kucia <jkucia at codeweavers.com>

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 tests/d3d12.c | 196 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 119 insertions(+), 77 deletions(-)

diff --git a/tests/d3d12.c b/tests/d3d12.c
index 6801b3b80f3b..b9e4a7004837 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -17692,24 +17692,24 @@ static void test_instance_id(void)
     ID3D12GraphicsCommandList *command_list;
     D3D12_INPUT_LAYOUT_DESC input_layout;
     D3D12_CPU_DESCRIPTOR_HANDLE rtvs[2];
-    D3D12_VERTEX_BUFFER_VIEW vbv[2];
+    D3D12_VERTEX_BUFFER_VIEW vbv[3];
     ID3D12Resource *argument_buffer;
     ID3D12Resource *render_target;
     struct test_context_desc desc;
     struct test_context context;
     struct resource_readback rb;
     ID3D12CommandQueue *queue;
-    ID3D12Resource *vb[2];
-    unsigned int i;
+    ID3D12Resource *vb[3];
+    unsigned int i, j;
     HRESULT hr;
 
-    static const D3D12_INPUT_ELEMENT_DESC layout_desc[] =
+    D3D12_INPUT_ELEMENT_DESC layout_desc[] =
     {
         {"position", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT,
                 D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
         {"color",    0, DXGI_FORMAT_R8_UNORM,           1, D3D12_APPEND_ALIGNED_ELEMENT,
                 D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1},
-        {"v_offset", 0, DXGI_FORMAT_R32_FLOAT,          1, D3D12_APPEND_ALIGNED_ELEMENT,
+        {"v_offset", 0, DXGI_FORMAT_R32_FLOAT,          2, D3D12_APPEND_ALIGNED_ELEMENT,
                 D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1},
     };
     static const DWORD vs_code[] =
@@ -17799,22 +17799,29 @@ static void test_instance_id(void)
         {-0.75f, -1.0f, 0.0f, 1.0f},
         {-0.75f,  0.0f, 0.0f, 1.0f},
     };
-    static const struct
+    static const BYTE stream1[] =
     {
-        BYTE color;
-        float v_offset;
-    }
-    stream1[] =
+        0xf0,
+        0x80,
+        0x10,
+        0x40,
+
+        0xaa,
+        0xbb,
+        0xcc,
+        0x90,
+    };
+    static const float stream2[] =
     {
-        {0xf0, 0.00f},
-        {0x80, 0.25f},
-        {0x10, 0.50f},
-        {0x40, 0.75f},
+        0.00f,
+        0.25f,
+        0.50f,
+        0.75f,
 
-        {0xaa, 1.00f},
-        {0xbb, 1.25f},
-        {0xcc, 1.50f},
-        {0x90, 1.75f},
+        1.00f,
+        1.25f,
+        1.50f,
+        1.75f,
     };
     static const D3D12_DRAW_ARGUMENTS argument_data[] =
     {
@@ -17822,33 +17829,48 @@ static void test_instance_id(void)
         {4, 4, 4, 4},
     };
     static const struct
+    {
+        unsigned int color_step_rate;
+        unsigned int expected_colors[16];
+    }
+    tests[] =
+    {
+        {0, {0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xffaaaaaa, 0xffaaaaaa, 0xffaaaaaa, 0xffaaaaaa,
+             0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xffaaaaaa, 0xffaaaaaa, 0xffaaaaaa, 0xffaaaaaa}},
+        {1, {0xfff0f0f0, 0xff808080, 0xff101010, 0xff404040, 0xffaaaaaa, 0xffbbbbbb, 0xffcccccc, 0xff909090,
+             0xfff0f0f0, 0xff808080, 0xff101010, 0xff404040, 0xffaaaaaa, 0xffbbbbbb, 0xffcccccc, 0xff909090}},
+        {2, {0xfff0f0f0, 0xfff0f0f0, 0xff808080, 0xff808080, 0xffaaaaaa, 0xffaaaaaa, 0xffbbbbbb, 0xffbbbbbb,
+             0xfff0f0f0, 0xfff0f0f0, 0xff808080, 0xff808080, 0xffaaaaaa, 0xffaaaaaa, 0xffbbbbbb, 0xffbbbbbb}},
+    };
+    static const struct
     {
         D3D12_BOX box;
-        unsigned int color;
         unsigned int instance_id;
     }
     expected_results[] =
     {
-        {{ 0, 0, 0, 10, 10, 1}, 0xfff0f0f0, 0},
-        {{10, 0, 0, 20, 10, 1}, 0xff808080, 1},
-        {{20, 0, 0, 30, 10, 1}, 0xff101010, 2},
-        {{30, 0, 0, 40, 10, 1}, 0xff404040, 3},
-        {{40, 0, 0, 50, 10, 1}, 0xffaaaaaa, 0},
-        {{50, 0, 0, 60, 10, 1}, 0xffbbbbbb, 1},
-        {{60, 0, 0, 70, 10, 1}, 0xffcccccc, 2},
-        {{70, 0, 0, 80, 10, 1}, 0xff909090, 3},
+        {{ 0, 0, 0, 10, 10, 1}, 0},
+        {{10, 0, 0, 20, 10, 1}, 1},
+        {{20, 0, 0, 30, 10, 1}, 2},
+        {{30, 0, 0, 40, 10, 1}, 3},
+        {{40, 0, 0, 50, 10, 1}, 0},
+        {{50, 0, 0, 60, 10, 1}, 1},
+        {{60, 0, 0, 70, 10, 1}, 2},
+        {{70, 0, 0, 80, 10, 1}, 3},
         /* indirect draws results */
-        {{ 0, 10, 0, 10, 20, 1}, 0xfff0f0f0, 0},
-        {{10, 10, 0, 20, 20, 1}, 0xff808080, 1},
-        {{20, 10, 0, 30, 20, 1}, 0xff101010, 2},
-        {{30, 10, 0, 40, 20, 1}, 0xff404040, 3},
-        {{40, 10, 0, 50, 20, 1}, 0xffaaaaaa, 0},
-        {{50, 10, 0, 60, 20, 1}, 0xffbbbbbb, 1},
-        {{60, 10, 0, 70, 20, 1}, 0xffcccccc, 2},
-        {{70, 10, 0, 80, 20, 1}, 0xff909090, 3},
+        {{ 0, 10, 0, 10, 20, 1}, 0},
+        {{10, 10, 0, 20, 20, 1}, 1},
+        {{20, 10, 0, 30, 20, 1}, 2},
+        {{30, 10, 0, 40, 20, 1}, 3},
+        {{40, 10, 0, 50, 20, 1}, 0},
+        {{50, 10, 0, 60, 20, 1}, 1},
+        {{60, 10, 0, 70, 20, 1}, 2},
+        {{70, 10, 0, 80, 20, 1}, 3},
     };
     static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
 
+    assert(ARRAY_SIZE(tests->expected_colors) == ARRAY_SIZE(expected_results));
+
     memset(&desc, 0, sizeof(desc));
     desc.rt_width = 80;
     desc.rt_height = 20;
@@ -17859,24 +17881,15 @@ static void test_instance_id(void)
     command_list = context.list;
     queue = context.queue;
 
+    context.root_signature = create_empty_root_signature(context.device,
+            D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);
+
     rtvs[0] = context.rtv;
     rtvs[1] = get_cpu_rtv_handle(&context, context.rtv_heap, 1);
 
     desc.rt_format = DXGI_FORMAT_R32_UINT;
     create_render_target(&context, &desc, &render_target, &rtvs[1]);
 
-    context.root_signature = create_empty_root_signature(context.device,
-            D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);
-    input_layout.pInputElementDescs = layout_desc;
-    input_layout.NumElements = ARRAY_SIZE(layout_desc);
-    init_pipeline_state_desc(&pso_desc, context.root_signature, 0, &vs, &ps, &input_layout);
-    pso_desc.NumRenderTargets = 2;
-    pso_desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
-    pso_desc.RTVFormats[1] = DXGI_FORMAT_R32_UINT;
-    hr = ID3D12Device_CreateGraphicsPipelineState(context.device, &pso_desc,
-            &IID_ID3D12PipelineState, (void **)&context.pipeline_state);
-    ok(SUCCEEDED(hr), "Failed to create graphics pipeline state, hr %#x.\n", hr);
-
     vb[0] = create_upload_buffer(context.device, sizeof(stream0), stream0);
     vbv[0].BufferLocation = ID3D12Resource_GetGPUVirtualAddress(vb[0]);
     vbv[0].StrideInBytes = sizeof(*stream0);
@@ -17887,18 +17900,10 @@ static void test_instance_id(void)
     vbv[1].StrideInBytes = sizeof(*stream1);
     vbv[1].SizeInBytes = sizeof(stream1);
 
-    ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[0], white, 0, NULL);
-    ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[1], white, 0, NULL);
-
-    ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 2, rtvs, FALSE, NULL);
-    ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
-    ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
-    ID3D12GraphicsCommandList_IASetPrimitiveTopology(command_list, D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
-    ID3D12GraphicsCommandList_IASetVertexBuffers(command_list, 0, ARRAY_SIZE(vbv), vbv);
-    ID3D12GraphicsCommandList_RSSetViewports(command_list, 1, &context.viewport);
-    ID3D12GraphicsCommandList_RSSetScissorRects(command_list, 1, &context.scissor_rect);
-    ID3D12GraphicsCommandList_DrawInstanced(command_list, 4, 4, 0, 0);
-    ID3D12GraphicsCommandList_DrawInstanced(command_list, 4, 4, 0, 4);
+    vb[2] = create_upload_buffer(context.device, sizeof(stream2), stream2);
+    vbv[2].BufferLocation = ID3D12Resource_GetGPUVirtualAddress(vb[2]);
+    vbv[2].StrideInBytes = sizeof(*stream2);
+    vbv[2].SizeInBytes = sizeof(stream2);
 
     argument_desc.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;
     signature_desc.ByteStride = sizeof(D3D12_DRAW_ARGUMENTS);
@@ -17907,31 +17912,68 @@ static void test_instance_id(void)
     signature_desc.NodeMask = 0;
     hr = ID3D12Device_CreateCommandSignature(context.device, &signature_desc,
             NULL, &IID_ID3D12CommandSignature, (void **)&command_signature);
-    ok(SUCCEEDED(hr), "Failed to create command signature, hr %#x.\n", hr);
+    ok(hr == S_OK, "Failed to create command signature, hr %#x.\n", hr);
 
     argument_buffer = create_upload_buffer(context.device, sizeof(argument_data), &argument_data);
-    ID3D12GraphicsCommandList_ExecuteIndirect(command_list, command_signature,
-            2, argument_buffer, 0, NULL, 0);
 
-    transition_resource_state(command_list, context.render_target,
-            D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
-    get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
-    for (i = 0; i < ARRAY_SIZE(expected_results); ++i)
-        check_readback_data_uint(&rb, &expected_results[i].box, expected_results[i].color, 1);
-    release_resource_readback(&rb);
-    reset_command_list(command_list, context.allocator);
-    transition_resource_state(command_list, render_target,
-            D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
-    get_texture_readback_with_command_list(render_target, 0, &rb, queue, command_list);
-    for (i = 0; i < ARRAY_SIZE(expected_results); ++i)
-        check_readback_data_uint(&rb, &expected_results[i].box, expected_results[i].instance_id, 0);
-    release_resource_readback(&rb);
+    for (i = 0; i < ARRAY_SIZE(tests); ++i)
+    {
+        layout_desc[1].InstanceDataStepRate = tests[i].color_step_rate;
+        input_layout.pInputElementDescs = layout_desc;
+        input_layout.NumElements = ARRAY_SIZE(layout_desc);
+        init_pipeline_state_desc(&pso_desc, context.root_signature, 0, &vs, &ps, &input_layout);
+        pso_desc.NumRenderTargets = 2;
+        pso_desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
+        pso_desc.RTVFormats[1] = DXGI_FORMAT_R32_UINT;
+        hr = ID3D12Device_CreateGraphicsPipelineState(context.device, &pso_desc,
+                &IID_ID3D12PipelineState, (void **)&context.pipeline_state);
+        ok(hr == S_OK, "Failed to create graphics pipeline state, hr %#x.\n", hr);
+
+        ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[0], white, 0, NULL);
+        ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[1], white, 0, NULL);
+
+        ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 2, rtvs, FALSE, NULL);
+        ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
+        ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
+        ID3D12GraphicsCommandList_IASetPrimitiveTopology(command_list, D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+        ID3D12GraphicsCommandList_IASetVertexBuffers(command_list, 0, ARRAY_SIZE(vbv), vbv);
+        ID3D12GraphicsCommandList_RSSetViewports(command_list, 1, &context.viewport);
+        ID3D12GraphicsCommandList_RSSetScissorRects(command_list, 1, &context.scissor_rect);
+        ID3D12GraphicsCommandList_DrawInstanced(command_list, 4, 4, 0, 0);
+        ID3D12GraphicsCommandList_DrawInstanced(command_list, 4, 4, 0, 4);
+
+        ID3D12GraphicsCommandList_ExecuteIndirect(command_list, command_signature,
+                2, argument_buffer, 0, NULL, 0);
+
+        transition_resource_state(command_list, context.render_target,
+                D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
+        get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
+        for (j = 0; j < ARRAY_SIZE(expected_results); ++j)
+            check_readback_data_uint(&rb, &expected_results[j].box, tests[i].expected_colors[j], 1);
+        release_resource_readback(&rb);
+        reset_command_list(command_list, context.allocator);
+        transition_resource_state(command_list, render_target,
+                D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
+        get_texture_readback_with_command_list(render_target, 0, &rb, queue, command_list);
+        for (j = 0; j < ARRAY_SIZE(expected_results); ++j)
+            check_readback_data_uint(&rb, &expected_results[j].box, expected_results[j].instance_id, 0);
+        release_resource_readback(&rb);
+
+        reset_command_list(command_list, context.allocator);
+        transition_resource_state(command_list, context.render_target,
+                D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
+        transition_resource_state(command_list, render_target,
+                D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
+
+        ID3D12PipelineState_Release(context.pipeline_state);
+        context.pipeline_state = NULL;
+    }
 
     ID3D12CommandSignature_Release(command_signature);
     ID3D12Resource_Release(argument_buffer);
     ID3D12Resource_Release(render_target);
-    ID3D12Resource_Release(vb[0]);
-    ID3D12Resource_Release(vb[1]);
+    for (i = 0; i < ARRAY_SIZE(vb); ++i)
+        ID3D12Resource_Release(vb[i]);
     destroy_test_context(&context);
 }
 
-- 
2.18.1




More information about the wine-devel mailing list