From: Józef Kucia jkucia@codeweavers.com
Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- dlls/dxgi/tests/Makefile.in | 2 +- dlls/dxgi/tests/dxgi.c | 111 ++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-)
diff --git a/dlls/dxgi/tests/Makefile.in b/dlls/dxgi/tests/Makefile.in index 1c99d70957..76f78cc5fd 100644 --- a/dlls/dxgi/tests/Makefile.in +++ b/dlls/dxgi/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = dxgi.dll -IMPORTS = d3d10_1 dxgi user32 +IMPORTS = d3d10_1 dxgi setupapi user32
C_SRCS = \ dxgi.c diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c index b42b76186c..a5f05f247f 100644 --- a/dlls/dxgi/tests/dxgi.c +++ b/dlls/dxgi/tests/dxgi.c @@ -22,6 +22,9 @@ #include "dxgi1_6.h" #include "d3d11.h" #include "d3d12.h" +#include "devguid.h" +#include "devpkey.h" +#include "setupapi.h" #include "wine/heap.h" #include "wine/test.h"
@@ -820,6 +823,113 @@ static void test_adapter_luid(void) ok(!refcount, "Factory has %u references left.\n", refcount); }
+DEFINE_DEVPROPKEY(DEVPROPKEY_DISPLAY_ADAPTER_LUID, + 0x60b193cb, 0x5276, 0x4d0f, 0x96, 0xfc, 0xf1, 0x73, 0xab, 0xad, 0x3e, 0xc6, 2); + +static void test_display_adapters(void) +{ + DXGI_ADAPTER_DESC adapter_desc; + BOOL found_display_adapter; + unsigned int adapter_index; + unsigned int device_index; + DEVPROPTYPE property_type; + IDXGIFactory *factory; + IDXGIAdapter *adapter; + SP_DEVINFO_DATA data; + HDEVINFO dev_info; + DWORD last_error; + ULONG refcount; + void *buffer; + WCHAR *name; + DWORD size; + HRESULT hr; + LUID luid; + BOOL ret; + + hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&factory); + ok(hr == S_OK, "Failed to create DXGI factory, hr %#x.\n", hr); + + for (adapter_index = 0; (hr = IDXGIFactory_EnumAdapters(factory, adapter_index, &adapter)) == S_OK; ++adapter_index) + { + hr = IDXGIAdapter_GetDesc(adapter, &adapter_desc); + ok(hr == S_OK, "Failed to get adapter desc, hr %#x.\n", hr); + refcount = IDXGIAdapter_Release(adapter); + ok(!refcount, "Adapter has %u references left.\n", refcount); + + /* Skip WARP. */ + if ((!adapter_desc.SubSysId && !adapter_desc.Revision && !adapter_desc.VendorId && !adapter_desc.DeviceId) + || (adapter_desc.VendorId == 0x1414 && adapter_desc.DeviceId == 0x008c)) + continue; + + found_display_adapter = FALSE; + + dev_info = SetupDiGetClassDevsW(&GUID_DEVCLASS_DISPLAY, NULL, NULL, DIGCF_PRESENT); + ok(dev_info != INVALID_HANDLE_VALUE, "Failed to get device information set.\n"); + + data.cbSize = sizeof(data); + for (device_index = 0; SetupDiEnumDeviceInfo(dev_info, device_index, &data); ++device_index) + { + /* LUID */ + size = 0; + property_type = DEVPROP_TYPE_EMPTY; + ret = SetupDiGetDevicePropertyW(dev_info, &data, &DEVPROPKEY_DISPLAY_ADAPTER_LUID, + &property_type, NULL, 0, &size, 0); + last_error = GetLastError(); + ok(!ret && last_error == ERROR_INSUFFICIENT_BUFFER, + "Failed to get device property size, ret %#x, last_error %#x.\n", ret, last_error); + ok(property_type == DEVPROP_TYPE_UINT64, "Got unexpected property type %#x.\n", property_type); + ok(size == sizeof(LUID), "Got unexpected size %u.\n", size); + + buffer = heap_alloc(size); + ok(!!buffer, "Failed to allocate memory.\n"); + ret = SetupDiGetDevicePropertyW(dev_info, &data, &DEVPROPKEY_DISPLAY_ADAPTER_LUID, + &property_type, buffer, size, &size, 0); + ok(ret, "Failed to get device property, ret %#x, last_error %#x.\n", ret, GetLastError()); + luid = *(LUID *)buffer; + heap_free(buffer); + + if (equal_luid(luid, adapter_desc.AdapterLuid)) + { + found_display_adapter = TRUE; + + /* name */ + size = 0; + property_type = DEVPROP_TYPE_STRING; + ret = SetupDiGetDevicePropertyW(dev_info, &data, &DEVPKEY_NAME, + &property_type, NULL, 0, &size, 0); + last_error = GetLastError(); + ok(!ret && last_error == ERROR_INSUFFICIENT_BUFFER, + "Failed to get device property size, ret %#x, last_error %#x.\n", ret, last_error); + ok(property_type == DEVPROP_TYPE_STRING, "Got unexpected property type %#x.\n", property_type); + + name = heap_alloc(size); + ok(!!name, "Failed to allocate memory.\n"); + ret = SetupDiGetDevicePropertyW(dev_info, &data, &DEVPKEY_NAME, + &property_type, (void *)name, size, &size, 0); + ok(ret, "Failed to get device property, ret %#x, last_error %#x.\n", ret, GetLastError()); + + ok(!lstrcmpW(adapter_desc.Description, name), + "Adapter names do not match: %s, %s.\n", + wine_dbgstr_w(adapter_desc.Description), wine_dbgstr_w(name)); + + heap_free(name); + break; + } + } + + ret = SetupDiDestroyDeviceInfoList(dev_info); + ok(ret, "Failed to destroy device info list.\n"); + + ok(found_display_adapter, "Failed to find display adapter for IDXGIAdapter %u (%s %04x:%04x).\n", + adapter_index, wine_dbgstr_w(adapter_desc.Description), + adapter_desc.VendorId, adapter_desc.DeviceId); + } + ok(hr == DXGI_ERROR_NOT_FOUND, "Got unexpected hr %#x.\n", hr); + + refcount = IDXGIFactory_Release(factory); + ok(!refcount, "Factory has %u references left.\n", refcount); +} + static void test_query_video_memory_info(void) { DXGI_QUERY_VIDEO_MEMORY_INFO memory_info; @@ -5018,6 +5128,7 @@ START_TEST(dxgi)
queue_test(test_adapter_desc); queue_test(test_adapter_luid); + queue_test(test_display_adapters); queue_test(test_query_video_memory_info); queue_test(test_check_interface_support); queue_test(test_create_surface);
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=45799
Your paranoid android.
=== debian9 (32 bit report) ===
dxgi: dxgi.c:911: Test failed: Adapter names do not match: L"NVIDIA GeForce 8800 GTX", L"Wine X11 Driver".
Report errors: dxgi:dxgi has unaccounted for failure messages dxgi:dxgi returned success despite having failures
=== debian9 (32 bit French report) ===
dxgi: dxgi.c:911: Test failed: Adapter names do not match: L"NVIDIA GeForce 8800 GTX", L"Wine X11 Driver".
Report errors: dxgi:dxgi has unaccounted for failure messages dxgi:dxgi returned success despite having failures
=== debian9 (32 bit Japanese:Japan report) ===
dxgi: dxgi.c:911: Test failed: Adapter names do not match: L"NVIDIA GeForce 8800 GTX", L"Wine X11 Driver".
Report errors: dxgi:dxgi has unaccounted for failure messages dxgi:dxgi returned success despite having failures
=== debian9 (32 bit Chinese:China report) ===
dxgi: dxgi.c:911: Test failed: Adapter names do not match: L"NVIDIA GeForce 8800 GTX", L"Wine X11 Driver".
Report errors: dxgi:dxgi has unaccounted for failure messages dxgi:dxgi returned success despite having failures
=== debian9 (build log) ===
X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 21 (RRSetCrtcConfig) X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 21 (RRSetCrtcConfig) X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 21 (RRSetCrtcConfig) X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 21 (RRSetCrtcConfig)
=== debian9 (32 bit WoW report) ===
dxgi: dxgi.c:911: Test failed: Adapter names do not match: L"NVIDIA GeForce 8800 GTX", L"Wine X11 Driver".
Report errors: dxgi:dxgi has unaccounted for failure messages dxgi:dxgi returned success despite having failures
=== debian9 (64 bit WoW report) ===
dxgi: dxgi.c:911: Test failed: Adapter names do not match: L"NVIDIA GeForce 8800 GTX", L"Wine X11 Driver".
Report errors: dxgi:dxgi has unaccounted for failure messages dxgi:dxgi returned success despite having failures
=== debian9 (build log) ===
X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 21 (RRSetCrtcConfig) X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 21 (RRSetCrtcConfig)