[PATCH 3/3] dxgi/tests: Add multiple adapters tests.
Zhiyi Zhang
zzhang at codeweavers.com
Wed Feb 5 03:09:00 CST 2020
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/dxgi/tests/dxgi.c | 110 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 110 insertions(+)
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index aaef811364..d52676912d 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -4899,6 +4899,115 @@ static void flush_events(void)
}
}
+struct adapter_info
+{
+ const WCHAR *name;
+ HMONITOR monitor;
+};
+
+static BOOL CALLBACK enum_monitor_proc(HMONITOR monitor, HDC hdc, RECT *rect, LPARAM lparam)
+{
+ struct adapter_info *adapter_info = (struct adapter_info *)lparam;
+ MONITORINFOEXW monitor_info;
+
+ monitor_info.cbSize = sizeof(monitor_info);
+ if (GetMonitorInfoW(monitor, (MONITORINFO *)&monitor_info)
+ && !lstrcmpiW(adapter_info->name, monitor_info.szDevice))
+ {
+ adapter_info->monitor = monitor;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static HMONITOR get_monitor(const WCHAR *adapter_name)
+{
+ struct adapter_info info = {adapter_name, NULL};
+
+ EnumDisplayMonitors(NULL, NULL, enum_monitor_proc, (LPARAM)&info);
+ return info.monitor;
+}
+
+static void test_multi_adapter(void)
+{
+ UINT output_count = 0, expected_output_count = 0;
+ UINT adapter_index, output_index, device_index;
+ DISPLAY_DEVICEW display_device;
+ DXGI_OUTPUT_DESC output_desc;
+ MONITORINFO monitor_info;
+ IDXGIFactory *factory;
+ IDXGIAdapter *adapter;
+ IDXGIOutput *output;
+ HMONITOR monitor;
+ BOOL found;
+ HRESULT hr;
+
+ if (FAILED(hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&factory)))
+ {
+ skip("Failed to create IDXGIFactory, hr %#x.\n", hr);
+ return;
+ }
+
+ hr = IDXGIFactory_EnumAdapters(factory, 0, &adapter);
+ if (hr == DXGI_ERROR_NOT_FOUND)
+ {
+ skip("Could not enumerate adapters.\n");
+ IDXGIFactory_Release(factory);
+ return;
+ }
+ ok(hr == S_OK, "Failed to enumerate adapter, hr %#x.\n", hr);
+
+ for (adapter_index = 0; SUCCEEDED(IDXGIFactory_EnumAdapters(factory, adapter_index, &adapter)); ++adapter_index)
+ {
+ for (output_index = 0; SUCCEEDED(IDXGIAdapter_EnumOutputs(adapter, output_index, &output)); ++output_index)
+ {
+ hr = IDXGIOutput_GetDesc(output, &output_desc);
+ ok(hr == S_OK, "IDXGIOutput_GetDesc failed, hr %#x\n", hr);
+
+ found = FALSE;
+ display_device.cb = sizeof(display_device);
+ for (device_index = 0; EnumDisplayDevicesW(NULL, device_index, &display_device, 0); ++device_index)
+ {
+ if (!lstrcmpiW(display_device.DeviceName, output_desc.DeviceName))
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ ok(found, "%s not found\n", wine_dbgstr_w(output_desc.DeviceName));
+ ok(display_device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP, "%s is detached\n",
+ wine_dbgstr_w(output_desc.DeviceName));
+ if (adapter_index == 0 && output_index == 0)
+ ok(display_device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE, "Expect first output is primary\n");
+ else
+ ok(!(display_device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE), "Expect output is non-primary\n");
+
+ /* Should have the same monitor handle */
+ monitor = get_monitor(display_device.DeviceName);
+ ok(monitor != NULL, "Failed to find monitor %s\n", wine_dbgstr_w(display_device.DeviceName));
+ ok(output_desc.Monitor == monitor, "Expect monitor %p, got %p\n", monitor, output_desc.Monitor);
+
+ /* Should have the same monitor rectangle */
+ monitor_info.cbSize = sizeof(monitor_info);
+ ok(GetMonitorInfoA(monitor, &monitor_info), "GetMonitorInfo failed, error %#x\n", GetLastError());
+ ok(EqualRect(&monitor_info.rcMonitor, &output_desc.DesktopCoordinates), "Expect output rect %s, got %s\n",
+ wine_dbgstr_rect(&monitor_info.rcMonitor), wine_dbgstr_rect(&output_desc.DesktopCoordinates));
+
+ IDXGIOutput_Release(output);
+ ++output_count;
+ }
+
+ IDXGIAdapter_Release(adapter);
+ }
+
+ IDXGIFactory_Release(factory);
+
+ expected_output_count = GetSystemMetrics(SM_CMONITORS);
+ todo_wine_if(expected_output_count > 1)
+ ok(output_count == expected_output_count, "Expect output count %d, got %d\n", expected_output_count, output_count);
+}
+
struct message
{
unsigned int message;
@@ -5824,6 +5933,7 @@ START_TEST(dxgi)
queue_test(test_maximum_frame_latency);
queue_test(test_output_desc);
queue_test(test_object_wrapping);
+ queue_test(test_multi_adapter);
run_queued_tests();
--
2.20.1
More information about the wine-devel
mailing list