[PATCH vkd3d 08/10] tests: Implement readback for 3D textures.

Józef Kucia joseph.kucia at gmail.com
Mon Aug 27 10:27:36 CDT 2018


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

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 tests/d3d12.c            | 194 ++++++++++++++++++++++-------------------------
 tests/vkd3d_d3d12_test.h |  61 ++++++++++-----
 2 files changed, 132 insertions(+), 123 deletions(-)

diff --git a/tests/d3d12.c b/tests/d3d12.c
index ca83680d36c9..7261e89e82df 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -57,17 +57,6 @@ typedef int HRESULT;
 
 #include "vkd3d_d3d12_test.h"
 
-static void set_box(D3D12_BOX *box, unsigned int left, unsigned int top, unsigned int front,
-        unsigned int right, unsigned int bottom, unsigned int back)
-{
-    box->left = left;
-    box->top = top;
-    box->front = front;
-    box->right = right;
-    box->bottom = bottom;
-    box->back = back;
-}
-
 struct vec2
 {
     float x, y;
@@ -634,6 +623,7 @@ static void get_buffer_readback_with_command_list(ID3D12Resource *buffer, DXGI_F
 
     rb->width = resource_desc.Width / format_size(format);
     rb->height = 1;
+    rb->depth = 1;
     rb->resource = rb_buffer;
     rb->row_pitch = resource_desc.Width;
     rb->data = NULL;
@@ -646,32 +636,32 @@ static void get_buffer_readback_with_command_list(ID3D12Resource *buffer, DXGI_F
 
 static uint8_t get_readback_uint8(struct resource_readback *rb, unsigned int x, unsigned int y)
 {
-    return *(uint8_t *)get_readback_data(rb, x, y, sizeof(uint8_t));
+    return *(uint8_t *)get_readback_data(rb, x, y, 0, sizeof(uint8_t));
 }
 
 static uint16_t get_readback_uint16(struct resource_readback *rb, unsigned int x, unsigned int y)
 {
-    return *(uint16_t *)get_readback_data(rb, x, y, sizeof(uint16_t));
+    return *(uint16_t *)get_readback_data(rb, x, y, 0, sizeof(uint16_t));
 }
 
 static UINT64 get_readback_uint64(struct resource_readback *rb, unsigned int x, unsigned int y)
 {
-    return *(UINT64 *)get_readback_data(rb, x, y, sizeof(UINT64));
+    return *(UINT64 *)get_readback_data(rb, x, y, 0, sizeof(UINT64));
 }
 
 static float get_readback_float(struct resource_readback *rb, unsigned int x, unsigned int y)
 {
-    return *(float *)get_readback_data(rb, x, y, sizeof(float));
+    return *(float *)get_readback_data(rb, x, y, 0, sizeof(float));
 }
 
 static const struct vec4 *get_readback_vec4(struct resource_readback *rb, unsigned int x, unsigned int y)
 {
-    return get_readback_data(rb, x, y, sizeof(struct vec4));
+    return get_readback_data(rb, x, y, 0, sizeof(struct vec4));
 }
 
 static const struct uvec4 *get_readback_uvec4(struct resource_readback *rb, unsigned int x, unsigned int y)
 {
-    return get_readback_data(rb, x, y, sizeof(struct uvec4));
+    return get_readback_data(rb, x, y, 0, sizeof(struct uvec4));
 }
 
 #define check_readback_data_float(a, b, c, d) check_readback_data_float_(__LINE__, a, b, c, d)
@@ -3416,7 +3406,7 @@ static void test_clear_unordered_access_view(void)
     ID3D12Device *device;
     UINT clear_value[4];
     unsigned int i, j;
-    RECT rect;
+    D3D12_BOX box;
 
 #define BUFFER_SIZE (1024 * 1024)
     static const struct
@@ -3507,20 +3497,19 @@ static void test_clear_unordered_access_view(void)
                 get_cpu_descriptor_handle(&context, cpu_heap, 0),
                 buffer, tests[i].values, 0, NULL);
 
-        rect.top = 0;
-        rect.bottom = 1;
+        set_box(&box, 0, 0, 0, 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_TYPELESS, &rb, queue, command_list);
-        rect.left = 0;
-        rect.right = uav_desc.Buffer.FirstElement;
-        check_readback_data_uint(&rb, &rect, clear_value[0], 0);
-        rect.left = uav_desc.Buffer.FirstElement;
-        rect.right = uav_desc.Buffer.FirstElement + uav_desc.Buffer.NumElements;
-        check_readback_data_uint(&rb, &rect, tests[i].values[0], 0);
-        rect.left = uav_desc.Buffer.FirstElement + uav_desc.Buffer.NumElements;
-        rect.right = BUFFER_SIZE / format_size(uav_desc.Format);
-        check_readback_data_uint(&rb, &rect, clear_value[0], 0);
+        box.left = 0;
+        box.right = uav_desc.Buffer.FirstElement;
+        check_readback_data_uint(&rb, &box, clear_value[0], 0);
+        box.left = uav_desc.Buffer.FirstElement;
+        box.right = uav_desc.Buffer.FirstElement + uav_desc.Buffer.NumElements;
+        check_readback_data_uint(&rb, &box, tests[i].values[0], 0);
+        box.left = uav_desc.Buffer.FirstElement + uav_desc.Buffer.NumElements;
+        box.right = BUFFER_SIZE / format_size(uav_desc.Format);
+        check_readback_data_uint(&rb, &box, clear_value[0], 0);
         release_resource_readback(&rb);
 
         reset_command_list(command_list, context.allocator);
@@ -3994,13 +3983,13 @@ static void test_append_aligned_element(void)
     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);
-    color = get_readback_uint(&rb, 80, 16);
+    color = get_readback_uint(&rb, 80, 16, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 240, 16);
+    color = get_readback_uint(&rb, 240, 16, 0);
     ok(compare_color(color, 0xff00ff00, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 400, 16);
+    color = get_readback_uint(&rb, 400, 16, 0);
     ok(compare_color(color, 0xffff0000, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 560, 16);
+    color = get_readback_uint(&rb, 560, 16, 0);
     ok(compare_color(color, 0xffff00ff, 1), "Got unexpected color 0x%08x.\n", color);
     release_resource_readback(&rb);
 
@@ -4414,15 +4403,15 @@ static void test_scissor(void)
             D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
 
     get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
-    color = get_readback_uint(&rb, 320, 60);
+    color = get_readback_uint(&rb, 320, 60, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 80, 240);
+    color = get_readback_uint(&rb, 80, 240, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 320, 240);
+    color = get_readback_uint(&rb, 320, 240, 0);
     ok(compare_color(color, 0xff00ff00, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 560, 240);
+    color = get_readback_uint(&rb, 560, 240, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 320, 420);
+    color = get_readback_uint(&rb, 320, 420, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
     release_resource_readback(&rb);
 
@@ -5117,7 +5106,7 @@ static void test_bundle_state_inheritance(void)
     {
         for (x = 0; x < rb.width; ++x)
         {
-           unsigned int v = get_readback_uint(&rb, x, y);
+           unsigned int v = get_readback_uint(&rb, x, y, 0);
            /* This works on AMD. */
            ok(v == 0xffffffff || v == 0xff00ff00, "Got unexpected value 0x%08x at (%u, %u).\n", v, x, y);
         }
@@ -5154,7 +5143,7 @@ static void test_bundle_state_inheritance(void)
     {
         for (x = 0; x < rb.width; ++x)
         {
-           unsigned int v = get_readback_uint(&rb, x, y);
+           unsigned int v = get_readback_uint(&rb, x, y, 0);
            /* This works on AMD, even though the debug layer says that the primitive topology is undefined. */
            ok(v == 0xffffffff || v == 0xff00ff00, "Got unexpected value 0x%08x at (%u, %u).\n", v, x, y);
         }
@@ -8505,7 +8494,7 @@ static void test_constant_buffer_relative_addressing(void)
     get_buffer_readback_with_command_list(uav, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
     for (i = 0; i < rb.width; ++i)
     {
-        unsigned int got = get_readback_uint(&rb, i, 0);
+        unsigned int got = get_readback_uint(&rb, i, 0, 0);
         const unsigned int *expected = &cb_data[1].x;
         ok(got == expected[i], "Got %#x, expected %#x at %u.\n", got, expected[i], i);
     }
@@ -9148,7 +9137,7 @@ static void test_texture(void)
         {
             for (x = 0; x < tests[i].width; ++x)
             {
-                unsigned int color = get_readback_uint(&rb, x * x_step + x_step / 2, y * y_step + y_step / 2);
+                unsigned int color = get_readback_uint(&rb, x * x_step + x_step / 2, y * y_step + y_step / 2, 0);
                 ok(compare_color(color, tests[i].expected_data[tests[i].width * y + x], 1),
                         "Got color 0x%08x, expected 0x%08x at (%u, %u).\n",
                         color, tests[i].expected_data[tests[i].width * y + x], x, y);
@@ -10210,7 +10199,7 @@ static void test_descriptor_tables_overlapping_bindings(void)
     get_buffer_readback_with_command_list(output_buffers[0], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
     for (i = 0; i < ARRAY_SIZE(buffer_data); ++i)
     {
-        unsigned int value = get_readback_uint(&rb, i, 0);
+        unsigned int value = get_readback_uint(&rb, i, 0, 0);
         ok(value == buffer_data[i], "Got %#x, expected %#x.\n", value, buffer_data[i]);
     }
     release_resource_readback(&rb);
@@ -10218,7 +10207,7 @@ static void test_descriptor_tables_overlapping_bindings(void)
     get_buffer_readback_with_command_list(output_buffers[1], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
     for (i = 0; i < ARRAY_SIZE(buffer_data2); ++i)
     {
-        unsigned int value = get_readback_uint(&rb, i, 0);
+        unsigned int value = get_readback_uint(&rb, i, 0, 0);
         ok(value == buffer_data2[i], "Got %#x, expected %#x.\n", value, buffer_data2[i]);
     }
     release_resource_readback(&rb);
@@ -10336,7 +10325,7 @@ static void test_update_root_descriptors(void)
     for (i = 0; i < ARRAY_SIZE(input); ++i)
     {
         unsigned int offset = input[i].uav_offset + input[i].offset;
-        unsigned int value = get_readback_uint(&rb, offset, 0);
+        unsigned int value = get_readback_uint(&rb, offset, 0, 0);
         ok(value == input[i].value, "Got %#x, expected %#x.\n", value, input[i].value);
     }
     release_resource_readback(&rb);
@@ -10364,6 +10353,7 @@ static void test_update_descriptor_tables(void)
     ID3D12Resource *textures[3];
     ID3D12CommandQueue *queue;
     unsigned int i;
+    D3D12_BOX box;
     HRESULT hr;
     RECT rect;
 
@@ -10505,10 +10495,10 @@ static void test_update_descriptor_tables(void)
     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);
-    set_rect(&rect, 0, 0, 16, 32);
-    check_readback_data_uint(&rb, &rect, 0xff00407f, 1);
-    set_rect(&rect, 16, 0, 32, 32);
-    check_readback_data_uint(&rb, &rect, 0xff007f40, 1);
+    set_box(&box, 0, 0, 0, 16, 32, 1);
+    check_readback_data_uint(&rb, &box, 0xff00407f, 1);
+    set_box(&box, 16, 0, 0, 32, 32, 1);
+    check_readback_data_uint(&rb, &box, 0xff007f40, 1);
     release_resource_readback(&rb);
 
     for (i = 0; i < ARRAY_SIZE(textures); ++i)
@@ -10634,7 +10624,7 @@ static void test_update_descriptor_heap_after_closing_command_list(void)
     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);
-    value = get_readback_uint(&rb, 0, 0);
+    value = get_readback_uint(&rb, 0, 0, 0);
     todo(value == 0xff00ff00, "Got unexpected value %#x.\n", value);
     release_resource_readback(&rb);
 
@@ -11153,7 +11143,7 @@ static void test_update_compute_descriptor_tables(void)
     get_buffer_readback_with_command_list(output_buffers[0], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
     for (i = 0; i < ARRAY_SIZE(expected_output0); ++i)
     {
-        data = get_readback_uint(&rb, i, 0);
+        data = get_readback_uint(&rb, i, 0, 0);
         ok(data == expected_output0[i], "Got %#x, expected %#x at %u.\n", data, expected_output0[i], i);
     }
     release_resource_readback(&rb);
@@ -11164,7 +11154,7 @@ static void test_update_compute_descriptor_tables(void)
     get_buffer_readback_with_command_list(output_buffers[1], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
     for (i = 0; i < ARRAY_SIZE(expected_output1); ++i)
     {
-        data = get_readback_uint(&rb, i, 0);
+        data = get_readback_uint(&rb, i, 0, 0);
         ok(data == expected_output1[i], "Got %#x, expected %#x at %u.\n", data, expected_output1[i], i);
     }
     release_resource_readback(&rb);
@@ -11669,7 +11659,7 @@ static void test_copy_descriptors(void)
     transition_sub_resource_state(command_list, u[2], 0,
             D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
     get_buffer_readback_with_command_list(u[2], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
-    result = get_readback_data(&rb, 0, 0, sizeof(*result));
+    result = get_readback_data(&rb, 0, 0, 0, sizeof(*result));
     ok(result[ 0] == cb0_data, "Got unexpected value %#x.\n", result[0]);
     ok(result[ 1] == cb1_data, "Got unexpected value %#x.\n", result[1]);
     ok(result[ 2] == cb2_data, "Got unexpected value %#x.\n", result[2]);
@@ -11747,7 +11737,7 @@ static void test_copy_descriptors_range_sizes(void)
     ID3D12CommandQueue *queue;
     ID3D12Device *device;
     unsigned int i;
-    RECT rect;
+    D3D12_BOX box;
 
     static const DWORD ps_code[] =
     {
@@ -11883,8 +11873,8 @@ static void test_copy_descriptors_range_sizes(void)
     get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
     for (i = 0; i < desc.rt_width; ++i)
     {
-        set_rect(&rect, i, 0, i + 1, desc.rt_height);
-        check_readback_data_uint(&rb, &rect, i % 2 ? 0xffff0000 : 0xff00ff00, 0);
+        set_box(&box, i, 0, 0, i + 1, desc.rt_height, 1);
+        check_readback_data_uint(&rb, &box, i % 2 ? 0xffff0000 : 0xff00ff00, 0);
     }
     release_resource_readback(&rb);
 
@@ -13838,7 +13828,7 @@ static void test_tgsm(void)
     get_buffer_readback_with_command_list(buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
     for (i = 0; i < 64; ++i)
     {
-        data = get_readback_uint(&rb, i, 0);
+        data = get_readback_uint(&rb, i, 0, 0);
         expected = 33 * i;
         ok(data == expected, "Got %u, expected %u (index %u).\n", data, expected, i);
     }
@@ -13887,7 +13877,7 @@ static void test_tgsm(void)
     for (i = 0; i < 32; ++i)
     {
         expected = 64 * i + 32;
-        data = get_readback_uint(&rb, i, 0);
+        data = get_readback_uint(&rb, i, 0, 0);
         ok(data == expected, "Got %u, expected %u (index %u).\n", data, expected, i);
     }
     release_resource_readback(&rb);
@@ -13896,7 +13886,7 @@ static void test_tgsm(void)
     for (i = 0; i < 32; ++i)
     {
         expected = 64 * i + 32;
-        data = get_readback_uint(&rb, i, 0);
+        data = get_readback_uint(&rb, i, 0, 0);
         ok(data == expected || !data, "Got %u, expected %u (index %u).\n", data, expected, i);
     }
     release_resource_readback(&rb);
@@ -13945,7 +13935,7 @@ static void test_tgsm(void)
     for (i = 0; i < 96; ++i)
     {
         expected = (i % 32 + 1) * (i / 32);
-        data = get_readback_uint(&rb, i, 0);
+        data = get_readback_uint(&rb, i, 0, 0);
         ok(data == expected, "Got %u, expected %u (index %u).\n", data, expected, i);
     }
     release_resource_readback(&rb);
@@ -14352,7 +14342,7 @@ static void test_uav_load(void)
             for (x = 0; x < 4; ++x)
             {
                 unsigned int expected = test->expected_colors[y * 4 + x];
-                unsigned int color = get_readback_uint(&rb, 80 + x * 160, 60 + y * 120);
+                unsigned int color = get_readback_uint(&rb, 80 + x * 160, 60 + y * 120, 0);
                 ok(compare_color(color, expected, 0),
                         "Test %u: Got 0x%08x, expected 0x%08x at (%u, %u).\n",
                         i, color, expected, x, y);
@@ -14770,7 +14760,7 @@ static unsigned int read_uav_counter(const struct test_context *context,
             D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
     get_buffer_readback_with_command_list(counter_buffer, DXGI_FORMAT_R32_UINT, &rb,
             context->queue, context->list);
-    counter = get_readback_uint(&rb, offset / sizeof(counter), 0);
+    counter = get_readback_uint(&rb, offset / sizeof(counter), 0, 0);
     release_resource_readback(&rb);
     reset_command_list(context->list, context->allocator);
     transition_sub_resource_state(context->list, counter_buffer, 0,
@@ -14989,7 +14979,7 @@ static void test_uav_counters(void)
     get_buffer_readback_with_command_list(out_buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
     for (i = 0; i < 8; ++i)
     {
-        data = get_readback_uint(&rb, i, 0);
+        data = get_readback_uint(&rb, i, 0, 0);
         ok(data == 0xdeadbeef, "Got data %u at %u.\n", data, i);
     }
     release_resource_readback(&rb);
@@ -15359,7 +15349,7 @@ static void test_atomic_instructions(void)
         get_buffer_readback_with_command_list(ps_buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
         for (j = 0; j < ARRAY_SIZE(instructions); ++j)
         {
-            unsigned int value = get_readback_uint(&rb, j, 0);
+            unsigned int value = get_readback_uint(&rb, j, 0, 0);
             unsigned int expected = test->expected_result[j];
 
             if (test->i.x < 0
@@ -15384,7 +15374,7 @@ static void test_atomic_instructions(void)
         {
             BOOL todo_instruction = !strcmp(imm_instructions[j], "imm_atomic_imax")
                     || !strcmp(imm_instructions[j], "imm_atomic_imin");
-            unsigned int value = get_readback_uint(&rb, j, 0);
+            unsigned int value = get_readback_uint(&rb, j, 0, 0);
             unsigned int expected = test->expected_result[j];
 
             if (test->i.x < 0 && todo_instruction)
@@ -15406,7 +15396,7 @@ static void test_atomic_instructions(void)
         get_buffer_readback_with_command_list(cs_buffer2, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
         for (j = 0; j < ARRAY_SIZE(instructions); ++j)
         {
-            unsigned int out_value = get_readback_uint(&rb, j, 0);
+            unsigned int out_value = get_readback_uint(&rb, j, 0, 0);
             ok(out_value == test->input[j], "Got original value %u, expected %u for '%s'.\n",
                     out_value, test->input[j], imm_instructions[j]);
         }
@@ -15708,7 +15698,7 @@ static void test_buffer_srv(void)
         {
             for (x = 0; x < 4; ++x)
             {
-                color = get_readback_uint(&rb, 80 + x * 160, 60 + y * 120);
+                color = get_readback_uint(&rb, 80 + x * 160, 60 + y * 120, 0);
                 expected_color = test->expected_colors[y * 4 + x];
                 ok(compare_color(color, expected_color, 1),
                         "Test %u: Got 0x%08x, expected 0x%08x at (%u, %u).\n",
@@ -15905,7 +15895,7 @@ static void test_query_pipeline_statistics(void)
         ok(!value, "Element %d: Got %"PRIu64", expected 0.\n", i, value);
     }
 
-    pipeline_statistics = get_readback_data(&rb, 1, 0, sizeof(*pipeline_statistics));
+    pipeline_statistics = get_readback_data(&rb, 1, 0, 0, sizeof(*pipeline_statistics));
 
     /* We read 3 vertices that formed one primitive. */
     ok(pipeline_statistics->IAVertices == 3, "IAVertices: Got %"PRIu64", expected 3.\n",
@@ -16118,7 +16108,7 @@ static void test_resolve_non_issued_query_data(void)
             D3D12_QUERY_TYPE_TIMESTAMP, 0, 4, readback_buffer, 0);
 
     get_buffer_readback_with_command_list(readback_buffer, DXGI_FORMAT_UNKNOWN, &rb, queue, command_list);
-    timestamps = get_readback_data(&rb, 0, 0, sizeof(*timestamps));
+    timestamps = get_readback_data(&rb, 0, 0, 0, sizeof(*timestamps));
     ok(timestamps[0] != initial_data[0] && timestamps[0] > 0,
             "Got unexpected timestamp %#"PRIx64".\n", timestamps[0]);
     ok(!timestamps[1], "Got unexpected timestamp %#"PRIx64".\n", timestamps[1]);
@@ -16405,7 +16395,7 @@ static void test_execute_indirect(void)
     get_buffer_readback_with_command_list(uav, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
     for (i = 0; i < rb.width; ++i)
     {
-        unsigned int ret = get_readback_uint(&rb, i, 0);
+        unsigned int ret = get_readback_uint(&rb, i, 0, 0);
         ok(ret == i, "Got unexpected result %#x at index %u.\n", ret, i);
     }
     release_resource_readback(&rb);
@@ -16533,9 +16523,9 @@ static void test_dispatch_zero_thread_groups(void)
     transition_sub_resource_state(command_list, uav, 0,
             D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
     get_buffer_readback_with_command_list(uav, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
-    ret = get_readback_uint(&rb, 0, 0);
+    ret = get_readback_uint(&rb, 0, 0, 0);
     ok(ret == 10, "Got unexpected result %#x.\n", ret);
-    ret = get_readback_uint(&rb, 64, 0);
+    ret = get_readback_uint(&rb, 64, 0, 0);
     ok(ret == 50, "Got unexpected result %#x.\n", ret);
     release_resource_readback(&rb);
 
@@ -16685,29 +16675,29 @@ static void test_instance_id(void)
     };
     static const struct
     {
-        RECT rect;
+        D3D12_BOX box;
         unsigned int color;
         unsigned int instance_id;
     }
     expected_results[] =
     {
-        {{ 0, 0, 10, 10}, 0xfff0f0f0, 0},
-        {{10, 0, 20, 10}, 0xff808080, 1},
-        {{20, 0, 30, 10}, 0xff101010, 2},
-        {{30, 0, 40, 10}, 0xff404040, 3},
-        {{40, 0, 50, 10}, 0xffaaaaaa, 0},
-        {{50, 0, 60, 10}, 0xffbbbbbb, 1},
-        {{60, 0, 70, 10}, 0xffcccccc, 2},
-        {{70, 0, 80, 10}, 0xff909090, 3},
+        {{ 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},
         /* indirect draws results */
-        {{ 0, 10, 10, 20}, 0xfff0f0f0, 0},
-        {{10, 10, 20, 20}, 0xff808080, 1},
-        {{20, 10, 30, 20}, 0xff101010, 2},
-        {{30, 10, 40, 20}, 0xff404040, 3},
-        {{40, 10, 50, 20}, 0xffaaaaaa, 0},
-        {{50, 10, 60, 20}, 0xffbbbbbb, 1},
-        {{60, 10, 70, 20}, 0xffcccccc, 2},
-        {{70, 10, 80, 20}, 0xff909090, 3},
+        {{ 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},
     };
     static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
 
@@ -16779,14 +16769,14 @@ static void test_instance_id(void)
             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].rect, expected_results[i].color, 1);
+        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].rect, expected_results[i].instance_id, 0);
+        check_readback_data_uint(&rb, &expected_results[i].box, expected_results[i].instance_id, 0);
     release_resource_readback(&rb);
 
     ID3D12CommandSignature_Release(command_signature);
@@ -16910,7 +16900,7 @@ static void test_copy_texture_region(void)
         {
             for (x = 0; x < 4; ++x)
             {
-                unsigned int color = get_readback_uint(&rb, x, y);
+                unsigned int color = get_readback_uint(&rb, x, y, 0);
                 unsigned int expected = result_data[y * 4 + x];
 
                 ok(color == expected,
@@ -17895,29 +17885,29 @@ static void test_geometry_shader(void)
             D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
 
     get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
-    color = get_readback_uint(&rb, 320, 190);
+    color = get_readback_uint(&rb, 320, 190, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 255, 240);
+    color = get_readback_uint(&rb, 255, 240, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 320, 240);
+    color = get_readback_uint(&rb, 320, 240, 0);
     ok(compare_color(color, 0xffffff00, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 385, 240);
+    color = get_readback_uint(&rb, 385, 240, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 320, 290);
+    color = get_readback_uint(&rb, 320, 290, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
     release_resource_readback(&rb);
 
     reset_command_list(command_list, context.allocator);
     get_texture_readback_with_command_list(texture, 0, &rb, queue, command_list);
-    color = get_readback_uint(&rb, 320, 190);
+    color = get_readback_uint(&rb, 320, 190, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 255, 240);
+    color = get_readback_uint(&rb, 255, 240, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 320, 240);
+    color = get_readback_uint(&rb, 320, 240, 0);
     ok(compare_color(color, 0xffffff00, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 385, 240);
+    color = get_readback_uint(&rb, 385, 240, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
-    color = get_readback_uint(&rb, 320, 290);
+    color = get_readback_uint(&rb, 320, 290, 0);
     ok(compare_color(color, 0xff0000ff, 1), "Got unexpected color 0x%08x.\n", color);
     release_resource_readback(&rb);
 
diff --git a/tests/vkd3d_d3d12_test.h b/tests/vkd3d_d3d12_test.h
index 67e4ddb3aae2..b7fd5ebcc4eb 100644
--- a/tests/vkd3d_d3d12_test.h
+++ b/tests/vkd3d_d3d12_test.h
@@ -31,6 +31,17 @@ static void set_rect(RECT *rect, int left, int top, int right, int bottom)
     rect->bottom = bottom;
 }
 
+static inline void set_box(D3D12_BOX *box, unsigned int left, unsigned int top, unsigned int front,
+        unsigned int right, unsigned int bottom, unsigned int back)
+{
+    box->left = left;
+    box->top = top;
+    box->front = front;
+    box->right = right;
+    box->bottom = bottom;
+    box->back = back;
+}
+
 static void set_viewport(D3D12_VIEWPORT *vp, float x, float y,
         float width, float height, float min_depth, float max_depth)
 {
@@ -197,6 +208,7 @@ struct resource_readback
 {
     unsigned int width;
     unsigned int height;
+    unsigned int depth;
     ID3D12Resource *resource;
     unsigned int row_pitch;
     void *data;
@@ -219,18 +231,18 @@ static void get_texture_readback_with_command_list(ID3D12Resource *texture, unsi
     resource_desc = ID3D12Resource_GetDesc(texture);
     ok(resource_desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER,
             "Resource %p is not texture.\n", texture);
-    ok(resource_desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D,
-            "Readback not implemented for 3D textures.\n");
 
     miplevel = sub_resource % resource_desc.MipLevels;
     rb->width = max(1, resource_desc.Width >> miplevel);
     rb->height = max(1, resource_desc.Height >> miplevel);
+    rb->depth = resource_desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D
+            ? resource_desc.DepthOrArraySize : 1;
     rb->row_pitch = align(rb->width * format_size(resource_desc.Format), D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
     rb->data = NULL;
 
     format = resource_desc.Format;
 
-    rb->resource = create_readback_buffer(device, rb->row_pitch * rb->height);
+    rb->resource = create_readback_buffer(device, rb->row_pitch * rb->height * rb->depth);
 
     dst_location.pResource = rb->resource;
     dst_location.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
@@ -238,7 +250,7 @@ static void get_texture_readback_with_command_list(ID3D12Resource *texture, unsi
     dst_location.PlacedFootprint.Footprint.Format = format;
     dst_location.PlacedFootprint.Footprint.Width = rb->width;
     dst_location.PlacedFootprint.Footprint.Height = rb->height;
-    dst_location.PlacedFootprint.Footprint.Depth = 1;
+    dst_location.PlacedFootprint.Footprint.Depth = rb->depth;
     dst_location.PlacedFootprint.Footprint.RowPitch = rb->row_pitch;
 
     src_location.pResource = texture;
@@ -259,15 +271,17 @@ static void get_texture_readback_with_command_list(ID3D12Resource *texture, unsi
     ok(SUCCEEDED(hr), "Failed to map readback buffer, hr %#x.\n", hr);
 }
 
-static void *get_readback_data(struct resource_readback *rb, unsigned int x, unsigned int y,
-        size_t element_size)
+static void *get_readback_data(struct resource_readback *rb,
+        unsigned int x, unsigned int y, unsigned int z, size_t element_size)
 {
-    return &((BYTE *)rb->data)[rb->row_pitch * y + x * element_size];
+    unsigned int slice_pitch = rb->row_pitch * rb->depth;
+    return &((BYTE *)rb->data)[slice_pitch * z + rb->row_pitch * y + x * element_size];
 }
 
-static unsigned int get_readback_uint(struct resource_readback *rb, unsigned int x, unsigned int y)
+static unsigned int get_readback_uint(struct resource_readback *rb,
+        unsigned int x, unsigned int y, unsigned int z)
 {
-    return *(unsigned int *)get_readback_data(rb, x, y, sizeof(unsigned int));
+    return *(unsigned int *)get_readback_data(rb, x, y, z, sizeof(unsigned int));
 }
 
 static void release_resource_readback(struct resource_readback *rb)
@@ -279,31 +293,36 @@ static void release_resource_readback(struct resource_readback *rb)
 
 #define check_readback_data_uint(a, b, c, d) check_readback_data_uint_(__LINE__, a, b, c, d)
 static void check_readback_data_uint_(unsigned int line, struct resource_readback *rb,
-        const RECT *rect, unsigned int expected, unsigned int max_diff)
+        const D3D12_BOX *box, unsigned int expected, unsigned int max_diff)
 {
-    RECT r = {0, 0, rb->width, rb->height};
-    unsigned int x = 0, y;
+    D3D12_BOX b = {0, 0, 0, rb->width, rb->height, rb->depth};
+    unsigned int x = 0, y = 0, z;
     bool all_match = true;
     unsigned int got = 0;
 
-    if (rect)
-        r = *rect;
+    if (box)
+        b = *box;
 
-    for (y = r.top; y < r.bottom; ++y)
+    for (z = b.front; z < b.back; ++z)
     {
-        for (x = r.left; x < r.right; ++x)
+        for (y = b.top; y < b.bottom; ++y)
         {
-            got = get_readback_uint(rb, x, y);
-            if (!compare_color(got, expected, max_diff))
+            for (x = b.left; x < b.right; ++x)
             {
-                all_match = false;
-                break;
+                got = get_readback_uint(rb, x, y, z);
+                if (!compare_color(got, expected, max_diff))
+                {
+                    all_match = false;
+                    break;
+                }
             }
+            if (!all_match)
+                break;
         }
         if (!all_match)
             break;
     }
-    ok_(line)(all_match, "Got 0x%08x, expected 0x%08x at (%u, %u).\n", got, expected, x, y);
+    ok_(line)(all_match, "Got 0x%08x, expected 0x%08x at (%u, %u, %u).\n", got, expected, x, y, z);
 }
 
 #define check_sub_resource_uint(a, b, c, d, e, f) check_sub_resource_uint_(__LINE__, a, b, c, d, e, f)
-- 
2.16.4




More information about the wine-devel mailing list