Module: wine Branch: master Commit: 2bc608eac5fc160371db13f8e8b4ee55fb9d9d44 URL: https://source.winehq.org/git/wine.git/?a=commit;h=2bc608eac5fc160371db13f8e...
Author: Józef Kucia jkucia@codeweavers.com Date: Fri Jun 1 12:45:10 2018 +0200
dxgi/tests: Run test_swapchain_backbuffer_index() also on D3D12.
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
---
dlls/dxgi/tests/device.c | 172 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 140 insertions(+), 32 deletions(-)
diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c index e67883e..2e68511 100644 --- a/dlls/dxgi/tests/device.c +++ b/dlls/dxgi/tests/device.c @@ -21,6 +21,7 @@ #include "initguid.h" #include "dxgi1_6.h" #include "d3d11.h" +#include "d3d12.h" #include "wine/heap.h" #include "wine/test.h"
@@ -35,6 +36,8 @@ static DEVMODEW registry_mode; static HRESULT (WINAPI *pCreateDXGIFactory1)(REFIID iid, void **factory); static HRESULT (WINAPI *pCreateDXGIFactory2)(UINT flags, REFIID iid, void **factory);
+static PFN_D3D12_CREATE_DEVICE pD3D12CreateDevice; + static ULONG get_refcount(IUnknown *iface) { IUnknown_AddRef(iface); @@ -464,6 +467,64 @@ success: return dxgi_device; }
+static ID3D12Device *create_d3d12_device(void) +{ + IDXGIAdapter *adapter; + ID3D12Device *device; + HRESULT hr; + + if (!pD3D12CreateDevice) + return NULL; + + adapter = create_adapter(); + hr = pD3D12CreateDevice((IUnknown *)adapter, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device); + if (adapter) + IDXGIAdapter_Release(adapter); + if (FAILED(hr)) + return NULL; + + return device; +} + +static ID3D12CommandQueue *create_d3d12_direct_queue(ID3D12Device *device) +{ + D3D12_COMMAND_QUEUE_DESC command_queue_desc; + ID3D12CommandQueue *queue; + HRESULT hr; + + command_queue_desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; + command_queue_desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL; + command_queue_desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; + command_queue_desc.NodeMask = 0; + hr = ID3D12Device_CreateCommandQueue(device, &command_queue_desc, + &IID_ID3D12CommandQueue, (void **)&queue); + ok(hr == S_OK, "Failed to create command queue, hr %#x.\n", hr); + return queue; +} + +#define get_factory(a, b, c) get_factory_(__LINE__, a, b, c) +static void get_factory_(unsigned int line, IUnknown *device, BOOL is_d3d12, IDXGIFactory **factory) +{ + IDXGIDevice *dxgi_device; + IDXGIAdapter *adapter; + HRESULT hr; + + if (is_d3d12) + { + hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)factory); + ok_(__FILE__, line)(hr == S_OK, "Failed to create factory, hr %#x.\n", hr); + } + else + { + dxgi_device = (IDXGIDevice *)device; + hr = IDXGIDevice_GetAdapter(dxgi_device, &adapter); + ok_(__FILE__, line)(hr == S_OK, "Failed to get adapter, hr %#x.\n", hr); + hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)factory); + ok_(__FILE__, line)(hr == S_OK, "Failed to get parent, hr %#x.\n", hr); + IDXGIAdapter_Release(adapter); + } +} + static void test_adapter_desc(void) { DXGI_ADAPTER_DESC1 desc1; @@ -3534,40 +3595,33 @@ static void test_swapchain_present(void) ok(!refcount, "Factory has %u references left.\n", refcount); }
-static void test_swapchain_backbuffer_index(void) +static void test_swapchain_backbuffer_index(IUnknown *device, BOOL is_d3d12) { DXGI_SWAP_CHAIN_DESC swapchain_desc; - unsigned int backbuffer_index; + unsigned int index, expected_index; IDXGISwapChain3 *swapchain3; IDXGISwapChain *swapchain; - IDXGIAdapter *adapter; + HRESULT hr, expected_hr; IDXGIFactory *factory; - IDXGIDevice *device; unsigned int i, j; ULONG refcount; - HRESULT hr; RECT rect; BOOL ret;
- static const DXGI_SWAP_EFFECT swap_effects[] = - { - DXGI_SWAP_EFFECT_DISCARD, - DXGI_SWAP_EFFECT_SEQUENTIAL, - DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, - DXGI_SWAP_EFFECT_FLIP_DISCARD, - }; - - if (!(device = create_device(0))) + static const struct { - skip("Failed to create device.\n"); - return; + DXGI_SWAP_EFFECT swap_effect; + BOOL supported_in_d3d12; } + tests[] = + { + {DXGI_SWAP_EFFECT_DISCARD, FALSE}, + {DXGI_SWAP_EFFECT_SEQUENTIAL, FALSE}, + {DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, TRUE}, + {DXGI_SWAP_EFFECT_FLIP_DISCARD, TRUE}, + };
- hr = IDXGIDevice_GetAdapter(device, &adapter); - ok(hr == S_OK, "Failed to get adapter, hr %#x.\n", hr); - hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory); - ok(hr == S_OK, "Failed to get parent, hr %#x.\n", hr); - IDXGIAdapter_Release(adapter); + get_factory(device, is_d3d12, &factory);
swapchain_desc.BufferDesc.RefreshRate.Numerator = 60; swapchain_desc.BufferDesc.RefreshRate.Denominator = 60; @@ -3588,11 +3642,15 @@ static void test_swapchain_backbuffer_index(void) swapchain_desc.BufferDesc.Width = rect.right; swapchain_desc.BufferDesc.Height = rect.bottom;
- for (i = 0; i < ARRAY_SIZE(swap_effects); ++i) + for (i = 0; i < ARRAY_SIZE(tests); ++i) { - swapchain_desc.SwapEffect = swap_effects[i]; + swapchain_desc.SwapEffect = tests[i].swap_effect; + expected_hr = !is_d3d12 || tests[i].supported_in_d3d12 ? S_OK : DXGI_ERROR_INVALID_CALL; hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain); - ok(hr == S_OK, "Failed to create swapchain, hr %#x.\n", hr); + todo_wine_if(is_d3d12 && tests[i].supported_in_d3d12) + ok(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); + if (FAILED(hr)) + continue;
hr = IDXGISwapChain_QueryInterface(swapchain, &IID_IDXGISwapChain3, (void **)&swapchain3); if (hr == E_NOINTERFACE) @@ -3602,10 +3660,11 @@ static void test_swapchain_backbuffer_index(void) goto done; }
- for (j = 0; j < swapchain_desc.BufferCount; ++j) + for (j = 0; j < 2 * swapchain_desc.BufferCount; ++j) { - backbuffer_index = IDXGISwapChain3_GetCurrentBackBufferIndex(swapchain3); - ok(!backbuffer_index, "Got unexpected back buffer index %u.\n", backbuffer_index); + index = IDXGISwapChain3_GetCurrentBackBufferIndex(swapchain3); + expected_index = is_d3d12 ? j % swapchain_desc.BufferCount : 0; + ok(index == expected_index, "Got back buffer index %u, expected %u.\n", index, expected_index); hr = IDXGISwapChain3_Present(swapchain3, 0, 0); ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); } @@ -3616,11 +3675,9 @@ static void test_swapchain_backbuffer_index(void) }
done: - refcount = IDXGIDevice_Release(device); - ok(!refcount, "Device has %u references left.\n", refcount); DestroyWindow(swapchain_desc.OutputWindow); refcount = IDXGIFactory_Release(factory); - ok(!refcount, "Factory has %u references left.\n", refcount); + ok(refcount == !is_d3d12, "Got unexpected refcount %u.\n", refcount); }
static void test_maximum_frame_latency(void) @@ -3901,10 +3958,49 @@ static void test_object_wrapping(void) ok(!refcount, "Factory has %u references left.\n", refcount); }
+static void run_on_d3d10(void (*test_func)(IUnknown *device, BOOL is_d3d12)) +{ + IDXGIDevice *device; + ULONG refcount; + + if (!(device = create_device(0))) + { + skip("Failed to create Direct3D 10 device.\n"); + return; + } + + test_func((IUnknown *)device, FALSE); + + refcount = IDXGIDevice_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + +static void run_on_d3d12(void (*test_func)(IUnknown *device, BOOL is_d3d12)) +{ + ID3D12CommandQueue *queue; + ID3D12Device *device; + ULONG refcount; + + if (!(device = create_d3d12_device())) + { + skip("Failed to create Direct3D 12 device.\n"); + return; + } + + queue = create_d3d12_direct_queue(device); + + test_func((IUnknown *)queue, TRUE); + + refcount = ID3D12CommandQueue_Release(queue); + ok(!refcount, "Command queue has %u references left.\n", refcount); + refcount = ID3D12Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + START_TEST(device) { + HMODULE dxgi_module, d3d12_module; unsigned int argc, i; - HMODULE dxgi_module; char **argv;
dxgi_module = GetModuleHandleA("dxgi.dll"); @@ -3941,8 +4037,20 @@ START_TEST(device) test_swapchain_resize(); test_swapchain_parameters(); test_swapchain_present(); - test_swapchain_backbuffer_index(); + run_on_d3d10(test_swapchain_backbuffer_index); test_maximum_frame_latency(); test_output_desc(); test_object_wrapping(); + + if (!(d3d12_module = LoadLibraryA("d3d12.dll"))) + { + skip("Direct3D 12 is not available.\n"); + return; + } + + pD3D12CreateDevice = (void *)GetProcAddress(d3d12_module, "D3D12CreateDevice"); + + run_on_d3d12(test_swapchain_backbuffer_index); + + FreeLibrary(d3d12_module); }