Skip to content

winewayland.drv: part 12: Display mode change emulation

Alexandros Frantzis requested to merge afrantzis/wine:wayland-part-12 into master

This MR uses the existing compositor side surface scaling in the driver (through wp_viewporter, currently used for Hi-DPI scaling) to emulate display mode changes. This works wonderfully in coordination with fullscreen since the compositor is required non only to scale the surface, but also to position it properly and provide opaque surroundings (note: some compositors don't implement the last two features properly!).

Since: 1. Wayland doesn't allow clients to change the actual display configuration, and 2. there is no queryable service that holds the display information in a consistent manner (à la xrandr), the MR uses the win32 device settings as the source of truth for the current display mode. We let win32u handle the display mode change in the default manner (i.e., just updating the registry settings), and provide access to the current mode when updating the display devices through a new gdi_display_manager.get_adapter() function.

In order to be able to consistently (across all processes) associate an adapter device with its corresponding wl_output the MR introduces per-adapter driver data.

Note for people trying this out: many modern games don't change the hardware display settings, but rather scale themselves in right way to achieve the visual effect of a mode change (similarly to how this MR works, but they do it on the application side). To exercise most of the functionality in this MR you need an application that actually uses the ChangeDisplaySettings win32 API.

Thanks!

Merge request reports