[PATCH] winex11.drv: Support reporting emulated display color depth.
Zhiyi Zhang
zzhang at codeweavers.com
Mon Oct 5 04:25:47 CDT 2020
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/d3drm/tests/d3drm.c | 6 ++--
dlls/user32/tests/monitor.c | 2 --
dlls/winex11.drv/settings.c | 64 +++++++++++++++++++++++++++++++++++++
3 files changed, 67 insertions(+), 5 deletions(-)
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index d854ebcc56d..f1d48639c14 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -4061,7 +4061,7 @@ static void test_create_device_from_clipper1(void)
surface_desc.dwSize = sizeof(surface_desc);
hr = IDirectDrawSurface_GetSurfaceDesc(surface, &surface_desc);
ok(hr == DD_OK, "Cannot get surface desc structure (hr = %x).\n", hr);
- todo_wine ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == 16, "Expected 16bpp, got %ubpp.\n",
+ ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == 16, "Expected 16bpp, got %ubpp.\n",
surface_desc.ddpfPixelFormat.dwRGBBitCount);
hr = IDirectDraw2_RestoreDisplayMode(ddraw);
@@ -4240,7 +4240,7 @@ static void test_create_device_from_clipper2(void)
surface_desc.dwSize = sizeof(surface_desc);
hr = IDirectDrawSurface_GetSurfaceDesc(surface, &surface_desc);
ok(hr == DD_OK, "Cannot get surface desc structure (hr = %x).\n", hr);
- todo_wine ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == 16, "Expected 16bpp, got %ubpp.\n",
+ ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == 16, "Expected 16bpp, got %ubpp.\n",
surface_desc.ddpfPixelFormat.dwRGBBitCount);
hr = IDirectDraw2_RestoreDisplayMode(ddraw);
@@ -4418,7 +4418,7 @@ static void test_create_device_from_clipper3(void)
surface_desc.dwSize = sizeof(surface_desc);
hr = IDirectDrawSurface_GetSurfaceDesc(surface, &surface_desc);
ok(hr == DD_OK, "Cannot get surface desc structure (hr = %x).\n", hr);
- todo_wine ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == 16, "Expected 16bpp, got %ubpp.\n",
+ ok(surface_desc.ddpfPixelFormat.dwRGBBitCount == 16, "Expected 16bpp, got %ubpp.\n",
surface_desc.ddpfPixelFormat.dwRGBBitCount);
hr = IDirectDraw2_RestoreDisplayMode(ddraw);
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 0ce27455a66..7664bed7427 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -297,8 +297,6 @@ static void _expect_dm(INT line, DEVMODEA expected, const CHAR *device, DWORD te
ok_(__FILE__, line)((dm.dmFields & expected.dmFields) == expected.dmFields,
"Device %s test %d expect dmFields to contain %#x, got %#x\n", device, test, expected.dmFields, dm.dmFields);
- /* Wine doesn't support changing color depth yet */
- todo_wine_if(expected.dmFields & DM_BITSPERPEL && expected.dmBitsPerPel != 32 && expected.dmBitsPerPel != 24)
ok_(__FILE__, line)(!(expected.dmFields & DM_BITSPERPEL) || dm.dmBitsPerPel == expected.dmBitsPerPel,
"Device %s test %d expect dmBitsPerPel %u, got %u\n", device, test, expected.dmBitsPerPel, dm.dmBitsPerPel);
ok_(__FILE__, line)(!(expected.dmFields & DM_PELSWIDTH) || dm.dmPelsWidth == expected.dmPelsWidth,
diff --git a/dlls/winex11.drv/settings.c b/dlls/winex11.drv/settings.c
index 0fa5bcf6294..a1b61e9c165 100644
--- a/dlls/winex11.drv/settings.c
+++ b/dlls/winex11.drv/settings.c
@@ -45,6 +45,16 @@ struct x11drv_display_setting
DEVMODEW desired_mode;
};
+struct x11drv_display_depth
+{
+ struct list entry;
+ ULONG_PTR display_id;
+ DWORD depth;
+};
+
+/* Display device emulated depth list, protected by modes_section */
+static struct list x11drv_display_depth_list = LIST_INIT(x11drv_display_depth_list);
+
/* All Windows drivers seen so far either support 32 bit depths, or 24 bit depths, but never both. So if we have
* a 32 bit framebuffer, report 32 bit bpps, otherwise 24 bit ones.
*/
@@ -405,6 +415,54 @@ static int mode_compare(const void *p1, const void *p2)
return a->u1.s2.dmDisplayOrientation - b->u1.s2.dmDisplayOrientation;
}
+static void set_display_depth(ULONG_PTR display_id, DWORD depth)
+{
+ struct x11drv_display_depth *display_depth;
+
+ EnterCriticalSection(&modes_section);
+ LIST_FOR_EACH_ENTRY(display_depth, &x11drv_display_depth_list, struct x11drv_display_depth, entry)
+ {
+ if (display_depth->display_id == display_id)
+ {
+ display_depth->depth = depth;
+ LeaveCriticalSection(&modes_section);
+ return;
+ }
+ }
+
+ display_depth = heap_alloc(sizeof(*display_depth));
+ if (!display_depth)
+ {
+ ERR("Failed to allocate memory.\n");
+ LeaveCriticalSection(&modes_section);
+ return;
+ }
+
+ display_depth->display_id = display_id;
+ display_depth->depth = depth;
+ list_add_head(&x11drv_display_depth_list, &display_depth->entry);
+ LeaveCriticalSection(&modes_section);
+}
+
+static DWORD get_display_depth(ULONG_PTR display_id)
+{
+ struct x11drv_display_depth *display_depth;
+ DWORD depth;
+
+ EnterCriticalSection(&modes_section);
+ LIST_FOR_EACH_ENTRY(display_depth, &x11drv_display_depth_list, struct x11drv_display_depth, entry)
+ {
+ if (display_depth->display_id == display_id)
+ {
+ depth = display_depth->depth;
+ LeaveCriticalSection(&modes_section);
+ return depth;
+ }
+ }
+ LeaveCriticalSection(&modes_section);
+ return screen_bpp;
+}
+
/***********************************************************************
* EnumDisplaySettingsEx (X11DRV.@)
*
@@ -434,6 +492,10 @@ BOOL CDECL X11DRV_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmo
ERR("Failed to get %s current display settings.\n", wine_dbgstr_w(name));
return FALSE;
}
+
+ if (!is_detached_mode(devmode))
+ devmode->dmBitsPerPel = get_display_depth(id);
+
goto done;
}
@@ -842,6 +904,8 @@ static LONG apply_display_settings(struct x11drv_display_setting *displays, INT
full_mode->u1.s2.dmDisplayOrientation);
ret = handler.set_current_mode(displays[display_idx].id, full_mode);
+ if (attached_mode && ret == DISP_CHANGE_SUCCESSFUL)
+ set_display_depth(displays[display_idx].id, full_mode->dmBitsPerPel);
free_full_mode(full_mode);
if (ret != DISP_CHANGE_SUCCESSFUL)
return ret;
--
2.25.1
More information about the wine-devel
mailing list