From 7cdcdfea08ad9d63466286a6f94783cbf5fc3717 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Thu, 12 May 2022 11:16:13 +0000 Subject: [PATCH] xwayland: Add -force-xrandr-emulation switch Adds a -force-xrandr-emulation cmdline switch that always exposes extra modes when viewporter isn't exposed by the Wayland compositor. Having the additional modes exposed by the X server is important for games to function and be configured Compositors, such as Gamescope (the compositor for Steam Deck), support only a single window that is rendered in the centre of the screen that is scaled up to fill the screen by the compositor based on some user scaling settings. Exposing viewporter, wouldn't make sense here, and could mislead native Wayland clients, so exposing dummy modesets in X is preferred here. Signed-off-by: Joshua Ashton Reviewed-by: Olivier Fourdan --- hw/xwayland/man/Xwayland.man | 4 ++++ hw/xwayland/xwayland-output.c | 2 +- hw/xwayland/xwayland-screen.c | 3 +++ hw/xwayland/xwayland-screen.h | 1 + hw/xwayland/xwayland.c | 1 + hw/xwayland/xwayland.pc.in | 1 + 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hw/xwayland/man/Xwayland.man b/hw/xwayland/man/Xwayland.man index 15eb7f5f48..2ceec94325 100644 --- a/hw/xwayland/man/Xwayland.man +++ b/hw/xwayland/man/Xwayland.man @@ -71,6 +71,10 @@ Disable touch pointer emulation. This allows the Wayland compositor to implement its own pointer emulation mechanism for X11 clients that don't support touch input. .TP 8 +.B \-force-xrandr-emulation +Force additional non-native modes to be exposed when viewporter is not +supported by the Wayland compositor. +.TP 8 .B \-rootless Run \fIXwayland\fP rootless, so that X clients integrate seamlessly with Wayland clients in a Wayland desktop. That requires the Wayland server diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c index 927d971947..58764b7c34 100644 --- a/hw/xwayland/xwayland-output.c +++ b/hw/xwayland/xwayland-output.c @@ -355,7 +355,7 @@ output_get_rr_modes(struct xwl_output *xwl_output, *count = 1; - if (!xwl_screen_has_resolution_change_emulation(xwl_screen)) + if (!xwl_screen_has_resolution_change_emulation(xwl_screen) && !xwl_screen->force_xrandr_emulation) return rr_modes; /* Add fake modes */ diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c index 5c8b388f0f..d6e19282c4 100644 --- a/hw/xwayland/xwayland-screen.c +++ b/hw/xwayland/xwayland-screen.c @@ -643,6 +643,9 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) ErrorF("xwayland glamor: this build does not have EGLStream support\n"); #endif } + else if (strcmp(argv[i], "-force-xrandr-emulation") == 0) { + xwl_screen->force_xrandr_emulation = 1; + } } #ifdef XWL_HAS_GLAMOR diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h index f04d431c74..f8aee2bdc5 100644 --- a/hw/xwayland/xwayland-screen.h +++ b/hw/xwayland/xwayland-screen.h @@ -56,6 +56,7 @@ struct xwl_screen { int rootless; int glamor; int present; + int force_xrandr_emulation; CreateScreenResourcesProcPtr CreateScreenResources; CloseScreenProcPtr CloseScreen; diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c index 603e8be4fa..6cc5f8e0fc 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c @@ -102,6 +102,7 @@ ddxUseMsg(void) ErrorF("-verbose [n] verbose startup messages\n"); ErrorF("-version show the server version and exit\n"); ErrorF("-noTouchPointerEmulation disable touch pointer emulation\n"); + ErrorF("-force-xrandr-emulation force non-native modes to be exposed when viewporter is not exposed by the compositor\n"); } static int init_fd = -1; diff --git a/hw/xwayland/xwayland.pc.in b/hw/xwayland/xwayland.pc.in index 9d727b002c..e2c06b8013 100644 --- a/hw/xwayland/xwayland.pc.in +++ b/hw/xwayland/xwayland.pc.in @@ -12,3 +12,4 @@ have_listenfd=true have_verbose=true have_terminate_delay=true have_no_touch_pointer_emulation=true +have_force_xrandr_emulation=true