=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi/tests: Add test for adapter locally unique identifiers.
Alexandre Julliard
julliard at winehq.org
Wed Jan 24 16:02:33 CST 2018
Module: wine
Branch: master
Commit: b7f6413120944ba862c393629a86c54b15f4cf59
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b7f6413120944ba862c393629a86c54b15f4cf59
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Tue Jan 23 18:15:17 2018 +0100
dxgi/tests: Add test for adapter locally unique identifiers.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dxgi/tests/device.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 164 insertions(+), 2 deletions(-)
diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c
index dfbbab4..714798f 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/device.c
@@ -32,6 +32,7 @@ enum frame_latency
static DEVMODEW registry_mode;
static HRESULT (WINAPI *pCreateDXGIFactory1)(REFIID iid, void **factory);
+static HRESULT (WINAPI *pCreateDXGIFactory2)(UINT flags, REFIID iid, void **factory);
static ULONG get_refcount(IUnknown *iface)
{
@@ -115,6 +116,45 @@ static void check_mode_desc_(unsigned int line, const DXGI_MODE_DESC *desc,
}
}
+static BOOL equal_luid(LUID a, LUID b)
+{
+ return a.LowPart == b.LowPart && a.HighPart == b.HighPart;
+}
+
+#define check_adapter_desc(a, b) check_adapter_desc_(__LINE__, a, b)
+static void check_adapter_desc_(unsigned int line, const DXGI_ADAPTER_DESC *desc,
+ const struct DXGI_ADAPTER_DESC *expected_desc)
+{
+ ok_(__FILE__, line)(!lstrcmpW(desc->Description, expected_desc->Description),
+ "Got description %s, expected %s.\n",
+ wine_dbgstr_w(desc->Description), wine_dbgstr_w(expected_desc->Description));
+ ok_(__FILE__, line)(desc->VendorId == expected_desc->VendorId,
+ "Got vendor id %04x, expected %04x.\n",
+ desc->VendorId, expected_desc->VendorId);
+ ok_(__FILE__, line)(desc->DeviceId == expected_desc->DeviceId,
+ "Got device id %04x, expected %04x.\n",
+ desc->DeviceId, expected_desc->DeviceId);
+ ok_(__FILE__, line)(desc->SubSysId == expected_desc->SubSysId,
+ "Got subsys id %04x, expected %04x.\n",
+ desc->SubSysId, expected_desc->SubSysId);
+ ok_(__FILE__, line)(desc->Revision == expected_desc->Revision,
+ "Got revision %02x, expected %02x.\n",
+ desc->Revision, expected_desc->Revision);
+ ok_(__FILE__, line)(desc->DedicatedVideoMemory == expected_desc->DedicatedVideoMemory,
+ "Got dedicated video memory %lu, expected %lu.\n",
+ desc->DedicatedVideoMemory, expected_desc->DedicatedVideoMemory);
+ ok_(__FILE__, line)(desc->DedicatedSystemMemory == expected_desc->DedicatedSystemMemory,
+ "Got dedicated system memory %lu, expected %lu.\n",
+ desc->DedicatedSystemMemory, expected_desc->DedicatedSystemMemory);
+ ok_(__FILE__, line)(desc->SharedSystemMemory == expected_desc->SharedSystemMemory,
+ "Got shared system memory %lu, expected %lu.\n",
+ desc->SharedSystemMemory, expected_desc->SharedSystemMemory);
+ ok_(__FILE__, line)(equal_luid(desc->AdapterLuid, expected_desc->AdapterLuid),
+ "Got LUID %08x:%08x, expected %08x:%08x.\n",
+ desc->AdapterLuid.HighPart, desc->AdapterLuid.LowPart,
+ expected_desc->AdapterLuid.HighPart, expected_desc->AdapterLuid.LowPart);
+}
+
#define check_output_desc(a, b) check_output_desc_(__LINE__, a, b)
static void check_output_desc_(unsigned int line, const DXGI_OUTPUT_DESC *desc,
const struct DXGI_OUTPUT_DESC *expected_desc)
@@ -416,7 +456,7 @@ static void test_adapter_desc(void)
"Got unexpected dedicated system memory %lu.\n", desc1.DedicatedSystemMemory);
ok(desc1.SharedSystemMemory == desc.SharedSystemMemory,
"Got unexpected shared system memory %lu.\n", desc1.SharedSystemMemory);
- ok(!memcmp(&desc.AdapterLuid, &desc1.AdapterLuid, sizeof(desc.AdapterLuid)),
+ ok(equal_luid(desc1.AdapterLuid, desc.AdapterLuid),
"Got unexpected adapter LUID %08x:%08x.\n", desc1.AdapterLuid.HighPart, desc1.AdapterLuid.LowPart);
trace("Flags: %08x.\n", desc1.Flags);
@@ -428,6 +468,125 @@ done:
ok(!refcount, "Device has %u references left.\n", refcount);
}
+static void test_adapter_luid(void)
+{
+ DXGI_ADAPTER_DESC device_adapter_desc, desc, desc2;
+ static const LUID luid = {0xdeadbeef, 0xdeadbeef};
+ IDXGIAdapter *adapter, *adapter2;
+ unsigned int found_adapter_count;
+ unsigned int adapter_index;
+ BOOL is_null_luid_adapter;
+ IDXGIFactory4 *factory4;
+ IDXGIFactory *factory;
+ BOOL have_unique_luid;
+ IDXGIDevice *device;
+ ULONG refcount;
+ HRESULT hr;
+
+ if (!(device = create_device(0)))
+ {
+ skip("Failed to create device.\n");
+ return;
+ }
+
+ hr = IDXGIDevice_GetAdapter(device, &adapter);
+ ok(hr == S_OK, "Failed to get adapter, hr %#x.\n", hr);
+ hr = IDXGIAdapter_GetDesc(adapter, &device_adapter_desc);
+ ok(hr == S_OK, "Failed to get adapter desc, hr %#x.\n", hr);
+ IDXGIAdapter_Release(adapter);
+ refcount = IDXGIDevice_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+
+ is_null_luid_adapter = !device_adapter_desc.AdapterLuid.HighPart
+ && !device_adapter_desc.AdapterLuid.LowPart;
+
+ hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&factory);
+ ok(hr == S_OK, "Failed to create DXGI factory, hr %#x.\n", hr);
+
+ hr = IDXGIFactory_QueryInterface(factory, &IID_IDXGIFactory4, (void **)&factory4);
+ ok(hr == S_OK || hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr);
+
+ have_unique_luid = TRUE;
+ found_adapter_count = 0;
+ adapter_index = 0;
+ while ((hr = IDXGIFactory_EnumAdapters(factory, adapter_index, &adapter)) == S_OK)
+ {
+ hr = IDXGIAdapter_GetDesc(adapter, &desc);
+ ok(hr == S_OK, "Failed to get adapter desc, hr %#x.\n", hr);
+
+ if (equal_luid(desc.AdapterLuid, device_adapter_desc.AdapterLuid))
+ {
+ check_adapter_desc(&desc, &device_adapter_desc);
+ ++found_adapter_count;
+ }
+
+ if (equal_luid(desc.AdapterLuid, luid))
+ have_unique_luid = FALSE;
+
+ if (factory4)
+ {
+ hr = IDXGIFactory4_EnumAdapterByLuid(factory4, desc.AdapterLuid,
+ &IID_IDXGIAdapter, (void **)&adapter2);
+ ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
+ hr = IDXGIAdapter_GetDesc(adapter2, &desc2);
+ ok(hr == S_OK, "Failed to get adapter desc, hr %#x.\n", hr);
+ check_adapter_desc(&desc2, &desc);
+ ok(adapter2 != adapter, "Expected to get new instance of IDXGIAdapter.\n");
+ refcount = IDXGIAdapter_Release(adapter2);
+ ok(!refcount, "Adapter has %u references left.\n", refcount);
+ }
+
+ refcount = IDXGIAdapter_Release(adapter);
+ ok(!refcount, "Adapter has %u references left.\n", refcount);
+
+ ++adapter_index;
+ }
+ ok(hr == DXGI_ERROR_NOT_FOUND, "Got unexpected hr %#x.\n", hr);
+
+ /* Older versions of WARP aren't enumerated by IDXGIFactory_EnumAdapters(). */
+ todo_wine ok(found_adapter_count == 1 || broken(is_null_luid_adapter),
+ "Found %u adapters for LUID %08x:%08x.\n",
+ found_adapter_count, device_adapter_desc.AdapterLuid.HighPart,
+ device_adapter_desc.AdapterLuid.LowPart);
+
+ if (factory4)
+ IDXGIFactory4_Release(factory4);
+ refcount = IDXGIFactory_Release(factory);
+ ok(!refcount, "Factory has %u references left.\n", refcount);
+
+ if (!pCreateDXGIFactory2
+ || FAILED(hr = pCreateDXGIFactory2(0, &IID_IDXGIFactory4, (void **)&factory4)))
+ {
+ skip("DXGI 1.4 is not available.\n");
+ return;
+ }
+
+ hr = IDXGIFactory4_EnumAdapterByLuid(factory4, device_adapter_desc.AdapterLuid,
+ &IID_IDXGIAdapter, (void **)&adapter);
+ todo_wine ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
+ if (SUCCEEDED(hr))
+ {
+ hr = IDXGIAdapter_GetDesc(adapter, &desc);
+ ok(hr == S_OK, "Failed to get adapter desc, hr %#x.\n", hr);
+ check_adapter_desc(&desc, &device_adapter_desc);
+ refcount = IDXGIAdapter_Release(adapter);
+ ok(!refcount, "Adapter has %u references left.\n", refcount);
+ }
+
+ if (have_unique_luid)
+ {
+ hr = IDXGIFactory4_EnumAdapterByLuid(factory4, luid, &IID_IDXGIAdapter, (void **)&adapter);
+ ok(hr == DXGI_ERROR_NOT_FOUND, "Got unexpected hr %#x.\n", hr);
+ }
+ else
+ {
+ skip("Our LUID is not unique.\n");
+ }
+
+ refcount = IDXGIFactory4_Release(factory4);
+ ok(!refcount, "Factory has %u references left.\n", refcount);
+}
+
static void test_check_interface_support(void)
{
LARGE_INTEGER driver_version;
@@ -3215,12 +3374,15 @@ static void test_output_desc(void)
START_TEST(device)
{
- pCreateDXGIFactory1 = (void *)GetProcAddress(GetModuleHandleA("dxgi.dll"), "CreateDXGIFactory1");
+ HMODULE dxgi_module = GetModuleHandleA("dxgi.dll");
+ pCreateDXGIFactory1 = (void *)GetProcAddress(dxgi_module, "CreateDXGIFactory1");
+ pCreateDXGIFactory2 = (void *)GetProcAddress(dxgi_module, "CreateDXGIFactory2");
registry_mode.dmSize = sizeof(registry_mode);
ok(EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, ®istry_mode), "Failed to get display mode.\n");
test_adapter_desc();
+ test_adapter_luid();
test_check_interface_support();
test_create_surface();
test_parents();
More information about the wine-cvs
mailing list