From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)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