Signed-off-by: Brendan Shanks bshanks@codeweavers.com --- include/wingdi.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/include/wingdi.h b/include/wingdi.h index de028f5212..d989fb6f71 100644 --- a/include/wingdi.h +++ b/include/wingdi.h @@ -3637,10 +3637,30 @@ typedef struct DISPLAYCONFIG_SDR_WHITE_LEVEL { ULONG SDRWhiteLevel; } DISPLAYCONFIG_SDR_WHITE_LEVEL;
+#define DISPLAYCONFIG_PATH_MODE_IDX_INVALID 0xffffffff +#define DISPLAYCONFIG_PATH_TARGET_MODE_IDX_INVALID 0xffff +#define DISPLAYCONFIG_PATH_DESKTOP_IMAGE_IDX_INVALID 0xffff +#define DISPLAYCONFIG_PATH_SOURCE_MODE_IDX_INVALID 0xffff +#define DISPLAYCONFIG_PATH_CLONE_GROUP_INVALID 0xffff + +#define DISPLAYCONFIG_SOURCE_IN_USE 0x00000001 + +#define DISPLAYCONFIG_TARGET_IN_USE 0x00000001 +#define DISPLAYCONFIG_TARGET_FORCIBLE 0x00000002 +#define DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_BOOT 0x00000004 +#define DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_PATH 0x00000008 +#define DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_SYSTEM 0x00000010 +#define DISPLAYCONFIG_TARGET_IS_HMD 0x00000020 + +#define DISPLAYCONFIG_PATH_ACTIVE 0x00000001 +#define DISPLAYCONFIG_PATH_SUPPORT_VIRTUAL_MODE 0x00000008 + /* For GetDisplayConfigBufferSizes */ #define QDC_ALL_PATHS 0x00000001 #define QDC_ONLY_ACTIVE_PATHS 0x00000002 #define QDC_DATABASE_CURRENT 0x00000004 +#define QDC_VIRTUAL_MODE_AWARE 0x00000010 +#define QDC_INCLUDE_HMD 0x00000020
#define GDI_ERROR (~0u) #define HGDI_ERROR ((HANDLE)~(ULONG_PTR)0)
Signed-off-by: Brendan Shanks bshanks@codeweavers.com --- dlls/user32/tests/monitor.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c index fb5e331c25..c3c43d6f60 100644 --- a/dlls/user32/tests/monitor.c +++ b/dlls/user32/tests/monitor.c @@ -1107,7 +1107,7 @@ static void test_work_area(void) DestroyWindow(hwnd); }
-static void test_get_display_config_buffer_sizes(void) +static void test_GetDisplayConfigBufferSizes(void) { UINT32 paths, modes; LONG ret; @@ -1268,7 +1268,7 @@ static void test_EnumDisplayMonitors(void) } }
-static void test_query_display_config(void) +static void test_QueryDisplayConfig(void) { UINT32 paths, modes; DISPLAYCONFIG_PATH_INFO pi[10]; @@ -1324,7 +1324,7 @@ static void test_query_display_config(void) ok (modes == 1, "got %u\n", modes); }
-static void test_display_config_get_device_info(void) +static void test_DisplayConfigGetDeviceInfo(void) { LONG ret; DISPLAYCONFIG_SOURCE_DEVICE_NAME source_name; @@ -1422,9 +1422,9 @@ static void test_display_config(void) return; }
- test_get_display_config_buffer_sizes(); - test_query_display_config(); - test_display_config_get_device_info(); + test_GetDisplayConfigBufferSizes(); + test_QueryDisplayConfig(); + test_DisplayConfigGetDeviceInfo(); }
START_TEST(monitor)
Signed-off-by: Brendan Shanks bshanks@codeweavers.com --- dlls/user32/tests/monitor.c | 111 +++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c index c3c43d6f60..205df1c293 100644 --- a/dlls/user32/tests/monitor.c +++ b/dlls/user32/tests/monitor.c @@ -1268,6 +1268,98 @@ static void test_EnumDisplayMonitors(void) } }
+static void test_QueryDisplayConfig_result(UINT32 paths, const DISPLAYCONFIG_PATH_INFO *pi, UINT32 modes, const DISPLAYCONFIG_MODE_INFO *mi) +{ + UINT32 i; + LONG ret; + DISPLAYCONFIG_SOURCE_DEVICE_NAME source_name; + DISPLAYCONFIG_TARGET_DEVICE_NAME target_name; + DISPLAYCONFIG_TARGET_PREFERRED_MODE preferred_mode; + DISPLAYCONFIG_ADAPTER_NAME adapter_name; + + for (i = 0; i < paths; i++) + { + source_name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME; + source_name.header.size = sizeof(source_name); + source_name.header.adapterId = pi[i].sourceInfo.adapterId; + source_name.header.id = pi[i].sourceInfo.id; + source_name.viewGdiDeviceName[0] = '\0'; + ret = pDisplayConfigGetDeviceInfo(&source_name.header); + ok(!ret, "Expected 0, got %d\n", ret); + ok(source_name.viewGdiDeviceName[0] != '\0', "Expected GDI device name, got empty string\n"); + + target_name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME; + target_name.header.size = sizeof(target_name); + target_name.header.adapterId = pi[i].targetInfo.adapterId; + target_name.header.id = pi[i].targetInfo.id; + target_name.monitorDevicePath[0] = '\0'; + ret = pDisplayConfigGetDeviceInfo(&target_name.header); + ok(!ret, "Expected 0, got %d\n", ret); + ok(target_name.monitorDevicePath[0] != '\0', "Expected monitor device path, got empty string\n"); + + preferred_mode.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE; + preferred_mode.header.size = sizeof(preferred_mode); + preferred_mode.header.adapterId = pi[i].targetInfo.adapterId; + preferred_mode.header.id = pi[i].targetInfo.id; + preferred_mode.width = preferred_mode.height = 0; + ret = pDisplayConfigGetDeviceInfo(&preferred_mode.header); + ok(!ret, "Expected 0, got %d\n", ret); + ok(preferred_mode.width > 0 && preferred_mode.height > 0, "Expected non-zero height/width, got %ux%u\n", + preferred_mode.width, preferred_mode.height); + + adapter_name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME; + adapter_name.header.size = sizeof(adapter_name); + adapter_name.header.adapterId = pi[i].sourceInfo.adapterId; + adapter_name.adapterDevicePath[0] = '\0'; + ret = pDisplayConfigGetDeviceInfo(&adapter_name.header); + ok(!ret, "Expected 0, got %d\n", ret); + ok(adapter_name.adapterDevicePath[0] != '\0', "Expected adapter device path, got empty string\n"); + + /* Check corresponding modes */ + if (pi[i].sourceInfo.modeInfoIdx == DISPLAYCONFIG_PATH_MODE_IDX_INVALID) + { + skip("Path doesn't contain source modeInfoIdx"); + continue; + } + ok(pi[i].sourceInfo.modeInfoIdx < modes, "Expected index <%d, got %d\n", modes, pi[i].sourceInfo.modeInfoIdx); + if (pi[i].sourceInfo.modeInfoIdx >= modes) + continue; + + ok(mi[pi[i].sourceInfo.modeInfoIdx].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE, "Expected infoType %d, got %d\n", + DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE, mi[pi[i].sourceInfo.modeInfoIdx].infoType); + ok(pi[i].sourceInfo.id == mi[pi[i].sourceInfo.modeInfoIdx].id, "Expected id %u, got %u\n", + pi[i].sourceInfo.id, mi[pi[i].sourceInfo.modeInfoIdx].id); + ok(pi[i].sourceInfo.adapterId.HighPart == mi[pi[i].sourceInfo.modeInfoIdx].adapterId.HighPart && + pi[i].sourceInfo.adapterId.LowPart == mi[pi[i].sourceInfo.modeInfoIdx].adapterId.LowPart, + "Expected LUID %08x:%08x, got %08x:%08x\n", + pi[i].sourceInfo.adapterId.HighPart, pi[i].sourceInfo.adapterId.LowPart, + mi[pi[i].sourceInfo.modeInfoIdx].adapterId.HighPart, mi[pi[i].sourceInfo.modeInfoIdx].adapterId.LowPart); + ok(mi[pi[i].sourceInfo.modeInfoIdx].sourceMode.width > 0 && mi[pi[i].sourceInfo.modeInfoIdx].sourceMode.height > 0, + "Expected non-zero height/width, got %ux%u\n", + mi[pi[i].sourceInfo.modeInfoIdx].sourceMode.width, mi[pi[i].sourceInfo.modeInfoIdx].sourceMode.height); + + + if (pi[i].targetInfo.modeInfoIdx == DISPLAYCONFIG_PATH_MODE_IDX_INVALID) + { + skip("Path doesn't contain target modeInfoIdx"); + continue; + } + ok(pi[i].targetInfo.modeInfoIdx < modes, "Expected index <%d, got %d\n", modes, pi[i].targetInfo.modeInfoIdx); + if (pi[i].targetInfo.modeInfoIdx >= modes) + continue; + + ok(mi[pi[i].targetInfo.modeInfoIdx].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_TARGET, "Expected infoType %d, got %d\n", + DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE, mi[pi[i].targetInfo.modeInfoIdx].infoType); + ok(pi[i].targetInfo.id == mi[pi[i].targetInfo.modeInfoIdx].id, "Expected id %u, got %u\n", + pi[i].targetInfo.id, mi[pi[i].targetInfo.modeInfoIdx].id); + ok(pi[i].targetInfo.adapterId.HighPart == mi[pi[i].targetInfo.modeInfoIdx].adapterId.HighPart && + pi[i].targetInfo.adapterId.LowPart == mi[pi[i].targetInfo.modeInfoIdx].adapterId.LowPart, + "Expected LUID %08x:%08x, got %08x:%08x\n", + pi[i].targetInfo.adapterId.HighPart, pi[i].targetInfo.adapterId.LowPart, + mi[pi[i].targetInfo.modeInfoIdx].adapterId.HighPart, mi[pi[i].targetInfo.modeInfoIdx].adapterId.LowPart); + } +} + static void test_QueryDisplayConfig(void) { UINT32 paths, modes; @@ -1315,13 +1407,30 @@ static void test_QueryDisplayConfig(void) ret = pQueryDisplayConfig(0, &paths, pi, &modes, mi, NULL); ok(ret == ERROR_INVALID_PARAMETER, "got %d\n", ret);
+ /* Below this point, test functionality that requires a WDDM driver on Windows */ paths = modes = 1; memset(pi, 0xFF, sizeof(pi[0])); memset(mi, 0xFF, sizeof(mi[0])); ret = pQueryDisplayConfig(QDC_ALL_PATHS, &paths, pi, &modes, mi, NULL); - ok(ret == ERROR_INSUFFICIENT_BUFFER || ret == ERROR_NOT_SUPPORTED, "got %d\n", ret); + if (ret == ERROR_NOT_SUPPORTED) + { + todo_wine + win_skip("QueryDisplayConfig() functionality is unsupported\n"); + return; + } + ok(ret == ERROR_INSUFFICIENT_BUFFER, "got %d\n", ret); ok (paths == 1, "got %u\n", paths); ok (modes == 1, "got %u\n", modes); + + paths = ARRAY_SIZE(pi); + modes = ARRAY_SIZE(mi); + memset(pi, 0xFF, sizeof(pi)); + memset(mi, 0xFF, sizeof(mi)); + ret = pQueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &paths, pi, &modes, mi, NULL); + ok(!ret, "got %d\n", ret); + ok(paths > 0 && modes > 0, "got %u, %u\n", paths, modes); + if (!ret && paths > 0 && modes > 0) + test_QueryDisplayConfig_result(paths, pi, modes, mi); }
static void test_DisplayConfigGetDeviceInfo(void)