mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
tests: Add test for instance data step rate.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
ebde6bd229
commit
0cab9e8c9f
198
tests/d3d12.c
198
tests/d3d12.c
@ -17692,24 +17692,24 @@ static void test_instance_id(void)
|
|||||||
ID3D12GraphicsCommandList *command_list;
|
ID3D12GraphicsCommandList *command_list;
|
||||||
D3D12_INPUT_LAYOUT_DESC input_layout;
|
D3D12_INPUT_LAYOUT_DESC input_layout;
|
||||||
D3D12_CPU_DESCRIPTOR_HANDLE rtvs[2];
|
D3D12_CPU_DESCRIPTOR_HANDLE rtvs[2];
|
||||||
D3D12_VERTEX_BUFFER_VIEW vbv[2];
|
D3D12_VERTEX_BUFFER_VIEW vbv[3];
|
||||||
ID3D12Resource *argument_buffer;
|
ID3D12Resource *argument_buffer;
|
||||||
ID3D12Resource *render_target;
|
ID3D12Resource *render_target;
|
||||||
struct test_context_desc desc;
|
struct test_context_desc desc;
|
||||||
struct test_context context;
|
struct test_context context;
|
||||||
struct resource_readback rb;
|
struct resource_readback rb;
|
||||||
ID3D12CommandQueue *queue;
|
ID3D12CommandQueue *queue;
|
||||||
ID3D12Resource *vb[2];
|
ID3D12Resource *vb[3];
|
||||||
unsigned int i;
|
unsigned int i, j;
|
||||||
HRESULT hr;
|
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,
|
{"position", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT,
|
||||||
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
|
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
|
||||||
{"color", 0, DXGI_FORMAT_R8_UNORM, 1, D3D12_APPEND_ALIGNED_ELEMENT,
|
{"color", 0, DXGI_FORMAT_R8_UNORM, 1, D3D12_APPEND_ALIGNED_ELEMENT,
|
||||||
D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1},
|
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},
|
D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1},
|
||||||
};
|
};
|
||||||
static const DWORD vs_code[] =
|
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, -1.0f, 0.0f, 1.0f},
|
||||||
{-0.75f, 0.0f, 0.0f, 1.0f},
|
{-0.75f, 0.0f, 0.0f, 1.0f},
|
||||||
};
|
};
|
||||||
static const struct
|
static const BYTE stream1[] =
|
||||||
{
|
{
|
||||||
BYTE color;
|
0xf0,
|
||||||
float v_offset;
|
0x80,
|
||||||
}
|
0x10,
|
||||||
stream1[] =
|
0x40,
|
||||||
{
|
|
||||||
{0xf0, 0.00f},
|
|
||||||
{0x80, 0.25f},
|
|
||||||
{0x10, 0.50f},
|
|
||||||
{0x40, 0.75f},
|
|
||||||
|
|
||||||
{0xaa, 1.00f},
|
0xaa,
|
||||||
{0xbb, 1.25f},
|
0xbb,
|
||||||
{0xcc, 1.50f},
|
0xcc,
|
||||||
{0x90, 1.75f},
|
0x90,
|
||||||
|
};
|
||||||
|
static const float stream2[] =
|
||||||
|
{
|
||||||
|
0.00f,
|
||||||
|
0.25f,
|
||||||
|
0.50f,
|
||||||
|
0.75f,
|
||||||
|
|
||||||
|
1.00f,
|
||||||
|
1.25f,
|
||||||
|
1.50f,
|
||||||
|
1.75f,
|
||||||
};
|
};
|
||||||
static const D3D12_DRAW_ARGUMENTS argument_data[] =
|
static const D3D12_DRAW_ARGUMENTS argument_data[] =
|
||||||
{
|
{
|
||||||
@ -17822,33 +17829,48 @@ static void test_instance_id(void)
|
|||||||
{4, 4, 4, 4},
|
{4, 4, 4, 4},
|
||||||
};
|
};
|
||||||
static const struct
|
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;
|
D3D12_BOX box;
|
||||||
unsigned int color;
|
|
||||||
unsigned int instance_id;
|
unsigned int instance_id;
|
||||||
}
|
}
|
||||||
expected_results[] =
|
expected_results[] =
|
||||||
{
|
{
|
||||||
{{ 0, 0, 0, 10, 10, 1}, 0xfff0f0f0, 0},
|
{{ 0, 0, 0, 10, 10, 1}, 0},
|
||||||
{{10, 0, 0, 20, 10, 1}, 0xff808080, 1},
|
{{10, 0, 0, 20, 10, 1}, 1},
|
||||||
{{20, 0, 0, 30, 10, 1}, 0xff101010, 2},
|
{{20, 0, 0, 30, 10, 1}, 2},
|
||||||
{{30, 0, 0, 40, 10, 1}, 0xff404040, 3},
|
{{30, 0, 0, 40, 10, 1}, 3},
|
||||||
{{40, 0, 0, 50, 10, 1}, 0xffaaaaaa, 0},
|
{{40, 0, 0, 50, 10, 1}, 0},
|
||||||
{{50, 0, 0, 60, 10, 1}, 0xffbbbbbb, 1},
|
{{50, 0, 0, 60, 10, 1}, 1},
|
||||||
{{60, 0, 0, 70, 10, 1}, 0xffcccccc, 2},
|
{{60, 0, 0, 70, 10, 1}, 2},
|
||||||
{{70, 0, 0, 80, 10, 1}, 0xff909090, 3},
|
{{70, 0, 0, 80, 10, 1}, 3},
|
||||||
/* indirect draws results */
|
/* indirect draws results */
|
||||||
{{ 0, 10, 0, 10, 20, 1}, 0xfff0f0f0, 0},
|
{{ 0, 10, 0, 10, 20, 1}, 0},
|
||||||
{{10, 10, 0, 20, 20, 1}, 0xff808080, 1},
|
{{10, 10, 0, 20, 20, 1}, 1},
|
||||||
{{20, 10, 0, 30, 20, 1}, 0xff101010, 2},
|
{{20, 10, 0, 30, 20, 1}, 2},
|
||||||
{{30, 10, 0, 40, 20, 1}, 0xff404040, 3},
|
{{30, 10, 0, 40, 20, 1}, 3},
|
||||||
{{40, 10, 0, 50, 20, 1}, 0xffaaaaaa, 0},
|
{{40, 10, 0, 50, 20, 1}, 0},
|
||||||
{{50, 10, 0, 60, 20, 1}, 0xffbbbbbb, 1},
|
{{50, 10, 0, 60, 20, 1}, 1},
|
||||||
{{60, 10, 0, 70, 20, 1}, 0xffcccccc, 2},
|
{{60, 10, 0, 70, 20, 1}, 2},
|
||||||
{{70, 10, 0, 80, 20, 1}, 0xff909090, 3},
|
{{70, 10, 0, 80, 20, 1}, 3},
|
||||||
};
|
};
|
||||||
static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
|
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));
|
memset(&desc, 0, sizeof(desc));
|
||||||
desc.rt_width = 80;
|
desc.rt_width = 80;
|
||||||
desc.rt_height = 20;
|
desc.rt_height = 20;
|
||||||
@ -17859,24 +17881,15 @@ static void test_instance_id(void)
|
|||||||
command_list = context.list;
|
command_list = context.list;
|
||||||
queue = context.queue;
|
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[0] = context.rtv;
|
||||||
rtvs[1] = get_cpu_rtv_handle(&context, context.rtv_heap, 1);
|
rtvs[1] = get_cpu_rtv_handle(&context, context.rtv_heap, 1);
|
||||||
|
|
||||||
desc.rt_format = DXGI_FORMAT_R32_UINT;
|
desc.rt_format = DXGI_FORMAT_R32_UINT;
|
||||||
create_render_target(&context, &desc, &render_target, &rtvs[1]);
|
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);
|
vb[0] = create_upload_buffer(context.device, sizeof(stream0), stream0);
|
||||||
vbv[0].BufferLocation = ID3D12Resource_GetGPUVirtualAddress(vb[0]);
|
vbv[0].BufferLocation = ID3D12Resource_GetGPUVirtualAddress(vb[0]);
|
||||||
vbv[0].StrideInBytes = sizeof(*stream0);
|
vbv[0].StrideInBytes = sizeof(*stream0);
|
||||||
@ -17887,18 +17900,10 @@ static void test_instance_id(void)
|
|||||||
vbv[1].StrideInBytes = sizeof(*stream1);
|
vbv[1].StrideInBytes = sizeof(*stream1);
|
||||||
vbv[1].SizeInBytes = sizeof(stream1);
|
vbv[1].SizeInBytes = sizeof(stream1);
|
||||||
|
|
||||||
ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[0], white, 0, NULL);
|
vb[2] = create_upload_buffer(context.device, sizeof(stream2), stream2);
|
||||||
ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[1], white, 0, NULL);
|
vbv[2].BufferLocation = ID3D12Resource_GetGPUVirtualAddress(vb[2]);
|
||||||
|
vbv[2].StrideInBytes = sizeof(*stream2);
|
||||||
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 2, rtvs, FALSE, NULL);
|
vbv[2].SizeInBytes = sizeof(stream2);
|
||||||
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);
|
|
||||||
|
|
||||||
argument_desc.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;
|
argument_desc.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;
|
||||||
signature_desc.ByteStride = sizeof(D3D12_DRAW_ARGUMENTS);
|
signature_desc.ByteStride = sizeof(D3D12_DRAW_ARGUMENTS);
|
||||||
@ -17907,31 +17912,68 @@ static void test_instance_id(void)
|
|||||||
signature_desc.NodeMask = 0;
|
signature_desc.NodeMask = 0;
|
||||||
hr = ID3D12Device_CreateCommandSignature(context.device, &signature_desc,
|
hr = ID3D12Device_CreateCommandSignature(context.device, &signature_desc,
|
||||||
NULL, &IID_ID3D12CommandSignature, (void **)&command_signature);
|
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);
|
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,
|
for (i = 0; i < ARRAY_SIZE(tests); ++i)
|
||||||
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
|
{
|
||||||
get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
|
layout_desc[1].InstanceDataStepRate = tests[i].color_step_rate;
|
||||||
for (i = 0; i < ARRAY_SIZE(expected_results); ++i)
|
input_layout.pInputElementDescs = layout_desc;
|
||||||
check_readback_data_uint(&rb, &expected_results[i].box, expected_results[i].color, 1);
|
input_layout.NumElements = ARRAY_SIZE(layout_desc);
|
||||||
release_resource_readback(&rb);
|
init_pipeline_state_desc(&pso_desc, context.root_signature, 0, &vs, &ps, &input_layout);
|
||||||
reset_command_list(command_list, context.allocator);
|
pso_desc.NumRenderTargets = 2;
|
||||||
transition_resource_state(command_list, render_target,
|
pso_desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
|
pso_desc.RTVFormats[1] = DXGI_FORMAT_R32_UINT;
|
||||||
get_texture_readback_with_command_list(render_target, 0, &rb, queue, command_list);
|
hr = ID3D12Device_CreateGraphicsPipelineState(context.device, &pso_desc,
|
||||||
for (i = 0; i < ARRAY_SIZE(expected_results); ++i)
|
&IID_ID3D12PipelineState, (void **)&context.pipeline_state);
|
||||||
check_readback_data_uint(&rb, &expected_results[i].box, expected_results[i].instance_id, 0);
|
ok(hr == S_OK, "Failed to create graphics pipeline state, hr %#x.\n", hr);
|
||||||
release_resource_readback(&rb);
|
|
||||||
|
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);
|
ID3D12CommandSignature_Release(command_signature);
|
||||||
ID3D12Resource_Release(argument_buffer);
|
ID3D12Resource_Release(argument_buffer);
|
||||||
ID3D12Resource_Release(render_target);
|
ID3D12Resource_Release(render_target);
|
||||||
ID3D12Resource_Release(vb[0]);
|
for (i = 0; i < ARRAY_SIZE(vb); ++i)
|
||||||
ID3D12Resource_Release(vb[1]);
|
ID3D12Resource_Release(vb[i]);
|
||||||
destroy_test_context(&context);
|
destroy_test_context(&context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user