[PATCH vkd3d v2 2/2] vkd3d/tests: Add tests for ID3D12GraphicsCommandList2::WriteBufferImmediate().

Conor McCarthy cmccarthy at codeweavers.com
Wed Nov 20 09:11:11 CST 2019


Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
The tests are todo for vkd3d but here they are for future use. Supersedes 173222.
---
 tests/d3d12.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 94 insertions(+)

diff --git a/tests/d3d12.c b/tests/d3d12.c
index 5284138..1485396 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -32684,6 +32684,99 @@ static void test_bufinfo_instruction(void)
     destroy_test_context(&context);
 }
 
+static void test_write_buffer_immediate(void)
+{
+    D3D12_WRITEBUFFERIMMEDIATE_PARAMETER params[2];
+    ID3D12GraphicsCommandList2 *command_list2;
+    D3D12_WRITEBUFFERIMMEDIATE_MODE modes[2];
+    ID3D12GraphicsCommandList *command_list;
+    ID3D12CommandAllocator *allocator;
+    struct resource_readback rb;
+    ID3D12CommandQueue *queue;
+    ID3D12Resource *buffer;
+    ID3D12Device *device;
+    unsigned int value;
+    HRESULT hr;
+
+    static const unsigned int data_values[] = {0xdeadbeef, 0xf00baa};
+
+    hr = D3D12CreateDevice(NULL, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device);
+    ok(hr == S_OK, "Failed to create device, hr %#x.\n", hr);
+
+    queue = create_command_queue(device, D3D12_COMMAND_LIST_TYPE_DIRECT, D3D12_COMMAND_QUEUE_PRIORITY_NORMAL);
+
+    hr = ID3D12Device_CreateCommandAllocator(device, D3D12_COMMAND_LIST_TYPE_DIRECT,
+            &IID_ID3D12CommandAllocator, (void **)&allocator);
+    ok(SUCCEEDED(hr), "Failed to create command allocator, hr %#x.\n", hr);
+
+    hr = ID3D12Device_CreateCommandList(device, 0, D3D12_COMMAND_LIST_TYPE_DIRECT,
+            allocator, NULL, &IID_ID3D12GraphicsCommandList2, (void **)&command_list);
+    if (FAILED(hr))
+    {
+        skip("ID3D12GraphicsCommandList2 not implemented.\n");
+        goto done;
+    }
+    command_list2 = (ID3D12GraphicsCommandList2 *)command_list;
+
+    buffer = create_default_buffer(device, sizeof(data_values),
+            D3D12_RESOURCE_FLAG_NONE, D3D12_RESOURCE_STATE_COPY_DEST);
+    upload_buffer_data(buffer, 0, sizeof(data_values), data_values, queue, command_list);
+    reset_command_list(command_list, allocator);
+
+    params[0].Dest = ID3D12Resource_GetGPUVirtualAddress(buffer);
+    params[0].Value = 0x1020304;
+    params[1].Dest = params[0].Dest + sizeof(data_values[0]);
+    params[1].Value = 0xc0d0e0f;
+    ID3D12GraphicsCommandList2_WriteBufferImmediate(command_list2, ARRAY_SIZE(params), params, NULL);
+    hr = ID3D12GraphicsCommandList_Close(command_list);
+    ok(SUCCEEDED(hr), "Failed to close command list, hr %#x.\n", hr);
+    if (FAILED(hr))
+        goto done1;
+    exec_command_list(queue, command_list);
+    wait_queue_idle(device, queue);
+    reset_command_list(command_list, allocator);
+
+    get_buffer_readback_with_command_list(buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
+    value = get_readback_uint(&rb, 0, 0, 0);
+    todo ok(value == params[0].Value, "Got unexpected readback 0x%#x.\n", value);
+    value = get_readback_uint(&rb, 1, 0, 0);
+    todo ok(value == params[1].Value, "Got unexpected readback 0x%#x.\n", value);
+    release_resource_readback(&rb);
+    reset_command_list(command_list, allocator);
+
+    params[0].Value = 0x2030405;
+    params[1].Value = 0xb0c0d0e;
+    modes[0] = D3D12_WRITEBUFFERIMMEDIATE_MODE_MARKER_IN;
+    modes[1] = D3D12_WRITEBUFFERIMMEDIATE_MODE_MARKER_OUT;
+    ID3D12GraphicsCommandList2_WriteBufferImmediate(command_list2, ARRAY_SIZE(params), params, modes);
+    hr = ID3D12GraphicsCommandList_Close(command_list);
+    ok(SUCCEEDED(hr), "Failed to close command list, hr %#x.\n", hr);
+    exec_command_list(queue, command_list);
+    wait_queue_idle(device, queue);
+    reset_command_list(command_list, allocator);
+
+    get_buffer_readback_with_command_list(buffer, DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
+    value = get_readback_uint(&rb, 0, 0, 0);
+    todo ok(value == params[0].Value, "Got unexpected readback 0x%#x.\n", value);
+    value = get_readback_uint(&rb, 1, 0, 0);
+    todo ok(value == params[1].Value, "Got unexpected readback 0x%#x.\n", value);
+    release_resource_readback(&rb);
+    reset_command_list(command_list, allocator);
+
+    modes[0] = 0x7FFFFFFF;
+    ID3D12GraphicsCommandList2_WriteBufferImmediate(command_list2, ARRAY_SIZE(params), params, modes);
+    hr = ID3D12GraphicsCommandList_Close(command_list);
+    todo ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %#x.\n", hr);
+
+done1:
+    ID3D12Resource_Release(buffer);
+    ID3D12GraphicsCommandList2_Release(command_list2);
+done:
+    ID3D12CommandAllocator_Release(allocator);
+    ID3D12CommandQueue_Release(queue);
+    ID3D12Device_Release(device);
+}
+
 START_TEST(d3d12)
 {
     parse_args(argc, argv);
@@ -32847,4 +32940,5 @@ START_TEST(d3d12)
     run_test(test_early_depth_stencil_tests);
     run_test(test_conditional_rendering);
     run_test(test_bufinfo_instruction);
+    run_test(test_write_buffer_immediate);
 }
-- 
2.24.0




More information about the wine-devel mailing list