diff --git a/spec_files/gamescope/0001-disable-steam-touch-click-atom.patch b/spec_files/gamescope/0001-disable-steam-touch-click-atom.patch deleted file mode 100644 index c528cead..00000000 --- a/spec_files/gamescope/0001-disable-steam-touch-click-atom.patch +++ /dev/null @@ -1,32 +0,0 @@ -From d98d69ad4238288fa4f79e6563a4cac68cd9c667 Mon Sep 17 00:00:00 2001 -From: antheas -Date: Sun, 31 Mar 2024 21:54:56 +0200 -Subject: [PATCH] disable steam touch click atom - -Steam sets this atom to 4 (which is the default) in certain games. Then sets it -back to 1 when it exits the game. Setting this atom to 1 makes a cursor appear -and breaks touchscreen functionality. So disable steam from being able to -play with the touch screen. - ---- - src/steamcompmgr.cpp | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 3bd958c..3d9ff74 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -3603,7 +3603,9 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) - } - if (ev->atom == ctx->atoms.steamTouchClickModeAtom ) - { -- g_nTouchClickMode = (enum wlserver_touch_click_mode) get_prop(ctx, ctx->root, ctx->atoms.steamTouchClickModeAtom, g_nDefaultTouchClickMode ); -+ // When steam changes this to 1 stuff breaks, make it not shoot itself -+ // in the foot -+ // g_nTouchClickMode = (enum wlserver_touch_click_mode) get_prop(ctx, ctx->root, ctx->atoms.steamTouchClickModeAtom, g_nDefaultTouchClickMode ); - #if HAVE_OPENVR - if (BIsVRSession()) - vrsession_update_touch_mode(); --- -2.44.0 - diff --git a/spec_files/gamescope/3.13.16.9-splitgate.patch b/spec_files/gamescope/3.13.16.9-splitgate.patch deleted file mode 100644 index a2d16dd7..00000000 --- a/spec_files/gamescope/3.13.16.9-splitgate.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 1345e658091848195ace5f94b8662deb49236a6b Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Tue, 9 Apr 2024 23:46:35 +0100 -Subject: [PATCH 1/2] wlserver: use unordered_map for content_overrides - ---- - src/wlserver.hpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/wlserver.hpp b/src/wlserver.hpp -index 852a5a1..6854ebf 100644 ---- a/src/wlserver.hpp -+++ b/src/wlserver.hpp -@@ -84,7 +84,7 @@ private: - - struct wlr_output *output; - -- std::map content_overrides; -+ std::unordered_map content_overrides; - - bool xwayland_ready = false; - _XDisplay *dpy = NULL; --- -2.44.0 - -From c59b09dbc0c100f604ae603c5f0026c42c62d49c Mon Sep 17 00:00:00 2001 -From: Joshua Ashton -Date: Wed, 10 Apr 2024 00:04:06 +0100 -Subject: [PATCH 2/2] wlserver: Clear x11_surface when content override is - destroyed - ---- - src/wlserver.cpp | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/src/wlserver.cpp b/src/wlserver.cpp -index 3fbc4ff..42d20e9 100644 ---- a/src/wlserver.cpp -+++ b/src/wlserver.cpp -@@ -532,6 +532,13 @@ static struct wl_listener new_surface_listener = { .notify = wlserver_new_surfac - - void gamescope_xwayland_server_t::destroy_content_override( struct wlserver_content_override *co ) - { -+ if ( co->surface ) -+ { -+ wlserver_wl_surface_info *wl_surface_info = get_wl_surface_info( co->surface ); -+ if ( wl_surface_info ) -+ wl_surface_info->x11_surface = nullptr; -+ } -+ - wl_list_remove( &co->surface_destroy_listener.link ); - content_overrides.erase( co->x11_window ); - free( co ); --- -2.44.0 - diff --git a/spec_files/gamescope/add_720p_var.patch b/spec_files/gamescope/add_720p_var.patch deleted file mode 100644 index 05ff1c72..00000000 --- a/spec_files/gamescope/add_720p_var.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 19c6635d5e20dd429cb23b4a7c728afa306fae0a Mon Sep 17 00:00:00 2001 -From: Sterophonick -Date: Sat, 10 Feb 2024 22:00:36 -0700 -Subject: [PATCH] steamcompmgr: add env var to enable/disable 720p restriction - ---- - src/steamcompmgr.cpp | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 00c00e9..795898c 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -137,6 +137,9 @@ extern float g_flInternalDisplayBrightnessNits; - extern float g_flHDRItmSdrNits; - extern float g_flHDRItmTargetNits; - -+// define env_to_bool to point to the function in drm: remove in later patches pl0x -+extern bool env_to_bool(const char *env); -+ - uint64_t g_lastWinSeq = 0; - - static std::shared_ptr s_scRGB709To2020Matrix; -@@ -5657,7 +5660,7 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) - int width = xwayland_mode_ctl[ 1 ]; - int height = xwayland_mode_ctl[ 2 ]; - -- if ( g_nOutputWidth != 1280 && width == 1280 ) -+ if ( g_nOutputWidth != 1280 && width == 1280 && !env_to_bool(getenv("GAMESCOPE_ENABLE_720P_RESTRICT")) ) - { - width = g_nOutputWidth; - height = g_nOutputHeight; --- -2.43.0 - diff --git a/spec_files/gamescope/amd_hdr.patch b/spec_files/gamescope/amd_hdr.patch deleted file mode 100644 index 58203a32..00000000 --- a/spec_files/gamescope/amd_hdr.patch +++ /dev/null @@ -1,349 +0,0 @@ -diff --git a/src/drm.cpp b/src/drm.cpp -index c975bfd..686c9b0 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -1044,15 +1044,15 @@ static bool refresh_state( drm_t *drm ) - crtc->has_vrr_enabled = crtc->props.contains( "VRR_ENABLED" ); - if (!crtc->has_vrr_enabled) - drm_log.infof("CRTC %" PRIu32 " has no VRR_ENABLED support", crtc->id); -- crtc->has_valve1_regamma_tf = crtc->props.contains( "VALVE1_CRTC_REGAMMA_TF" ); -- if (!crtc->has_valve1_regamma_tf) -- drm_log.infof("CRTC %" PRIu32 " has no VALVE1_CRTC_REGAMMA_TF support", crtc->id); -+ crtc->has_amd_regamma_tf = crtc->props.contains( "AMD_CRTC_REGAMMA_TF" ); -+ if (!crtc->has_amd_regamma_tf) -+ drm_log.infof("CRTC %" PRIu32 " has no AMD_CRTC_REGAMMA_TF support", crtc->id); - - crtc->current.active = crtc->initial_prop_values["ACTIVE"]; - if (crtc->has_vrr_enabled) - drm->current.vrr_enabled = crtc->initial_prop_values["VRR_ENABLED"]; -- if (crtc->has_valve1_regamma_tf) -- drm->current.output_tf = (drm_valve1_transfer_function) crtc->initial_prop_values["VALVE1_CRTC_REGAMMA_TF"]; -+ if (crtc->has_amd_regamma_tf) -+ drm->current.output_tf = (amdgpu_transfer_function) crtc->initial_prop_values["AMD_CRTC_REGAMMA_TF"]; - } - - for (size_t i = 0; i < drm->planes.size(); i++) { -@@ -1060,7 +1060,7 @@ static bool refresh_state( drm_t *drm ) - if (!get_object_properties(drm, plane->id, DRM_MODE_OBJECT_PLANE, plane->props, plane->initial_prop_values)) { - return false; - } -- plane->has_color_mgmt = plane->props.contains( "VALVE1_PLANE_BLEND_TF" ); -+ plane->has_color_mgmt = plane->props.contains( "AMD_PLANE_BLEND_TF" ); - } - - return true; -@@ -1597,8 +1597,8 @@ void finish_drm(struct drm_t *drm) - add_crtc_property(req, &drm->crtcs[i], "CTM", 0); - if ( drm->crtcs[i].has_vrr_enabled ) - add_crtc_property(req, &drm->crtcs[i], "VRR_ENABLED", 0); -- if ( drm->crtcs[i].has_valve1_regamma_tf ) -- add_crtc_property(req, &drm->crtcs[i], "VALVE1_CRTC_REGAMMA_TF", 0); -+ if ( drm->crtcs[i].has_amd_regamma_tf ) -+ add_crtc_property(req, &drm->crtcs[i], "AMD_CRTC_REGAMMA_TF", 0); - add_crtc_property(req, &drm->crtcs[i], "ACTIVE", 0); - } - for ( size_t i = 0; i < drm->planes.size(); i++ ) { -@@ -1617,22 +1617,22 @@ void finish_drm(struct drm_t *drm) - add_plane_property(req, plane, "rotation", DRM_MODE_ROTATE_0); - if (plane->props.count("alpha") > 0) - add_plane_property(req, plane, "alpha", 0xFFFF); -- if (plane->props.count("VALVE1_PLANE_DEGAMMA_TF") > 0) -- add_plane_property(req, plane, "VALVE1_PLANE_DEGAMMA_TF", DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT ); -- if (plane->props.count("VALVE1_PLANE_HDR_MULT") > 0) -- add_plane_property(req, plane, "VALVE1_PLANE_HDR_MULT", 0x100000000ULL); -- if (plane->props.count("VALVE1_PLANE_SHAPER_TF") > 0) -- add_plane_property(req, plane, "VALVE1_PLANE_SHAPER_TF", DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT ); -- if (plane->props.count("VALVE1_PLANE_SHAPER_LUT") > 0) -- add_plane_property(req, plane, "VALVE1_PLANE_SHAPER_LUT", 0 ); -- if (plane->props.count("VALVE1_PLANE_LUT3D") > 0) -- add_plane_property(req, plane, "VALVE1_PLANE_LUT3D", 0 ); -- if (plane->props.count("VALVE1_PLANE_BLEND_TF") > 0) -- add_plane_property(req, plane, "VALVE1_PLANE_BLEND_TF", DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT ); -- if (plane->props.count("VALVE1_PLANE_BLEND_LUT") > 0) -- add_plane_property(req, plane, "VALVE1_PLANE_BLEND_LUT", 0 ); -- if (plane->props.count("VALVE1_PLANE_CTM") > 0) -- add_plane_property(req, plane, "VALVE1_PLANE_CTM", 0 ); -+ if (plane->props.count("AMD_PLANE_DEGAMMA_TF") > 0) -+ add_plane_property(req, plane, "AMD_PLANE_DEGAMMA_TF", AMDGPU_TRANSFER_FUNCTION_DEFAULT ); -+ if (plane->props.count("AMD_PLANE_HDR_MULT") > 0) -+ add_plane_property(req, plane, "AMD_PLANE_HDR_MULT", 0x100000000ULL); -+ if (plane->props.count("AMD_PLANE_SHAPER_TF") > 0) -+ add_plane_property(req, plane, "AMD_PLANE_SHAPER_TF", AMDGPU_TRANSFER_FUNCTION_DEFAULT ); -+ if (plane->props.count("AMD_PLANE_SHAPER_LUT") > 0) -+ add_plane_property(req, plane, "AMD_PLANE_SHAPER_LUT", 0 ); -+ if (plane->props.count("AMD_PLANE_LUT3D") > 0) -+ add_plane_property(req, plane, "AMD_PLANE_LUT3D", 0 ); -+ if (plane->props.count("AMD_PLANE_BLEND_TF") > 0) -+ add_plane_property(req, plane, "AMD_PLANE_BLEND_TF", AMDGPU_TRANSFER_FUNCTION_DEFAULT ); -+ if (plane->props.count("AMD_PLANE_BLEND_LUT") > 0) -+ add_plane_property(req, plane, "AMD_PLANE_BLEND_LUT", 0 ); -+ if (plane->props.count("AMD_PLANE_CTM") > 0) -+ add_plane_property(req, plane, "AMD_PLANE_CTM", 0 ); - } - // We can't do a non-blocking commit here or else risk EBUSY in case the - // previous page-flip is still in flight. -@@ -2222,37 +2222,37 @@ struct LiftoffStateCacheEntryKasher - - std::unordered_set g_LiftoffStateCache; - --static inline drm_valve1_transfer_function colorspace_to_plane_degamma_tf(GamescopeAppTextureColorspace colorspace) -+static inline amdgpu_transfer_function colorspace_to_plane_degamma_tf(GamescopeAppTextureColorspace colorspace) - { - switch ( colorspace ) - { - default: // Linear in this sense is SRGB. Linear = sRGB image view doing automatic sRGB -> Linear which doesn't happen on DRM side. - case GAMESCOPE_APP_TEXTURE_COLORSPACE_SRGB: -- return DRM_VALVE1_TRANSFER_FUNCTION_SRGB; -+ return AMDGPU_TRANSFER_FUNCTION_SRGB_EOTF; - case GAMESCOPE_APP_TEXTURE_COLORSPACE_PASSTHRU: - case GAMESCOPE_APP_TEXTURE_COLORSPACE_SCRGB: - // Use LINEAR TF for scRGB float format as 80 nit = 1.0 in scRGB, which matches - // what PQ TF decodes to/encodes from. - // AMD internal format is FP16, and generally expected for 1.0 -> 80 nit. - // which just so happens to match scRGB. -- return DRM_VALVE1_TRANSFER_FUNCTION_LINEAR; -+ return AMDGPU_TRANSFER_FUNCTION_IDENTITY; - case GAMESCOPE_APP_TEXTURE_COLORSPACE_HDR10_PQ: -- return DRM_VALVE1_TRANSFER_FUNCTION_PQ; -+ return AMDGPU_TRANSFER_FUNCTION_PQ_EOTF; - } - } - --static inline drm_valve1_transfer_function colorspace_to_plane_shaper_tf(GamescopeAppTextureColorspace colorspace) -+static inline amdgpu_transfer_function colorspace_to_plane_shaper_tf(GamescopeAppTextureColorspace colorspace) - { - switch ( colorspace ) - { - default: - case GAMESCOPE_APP_TEXTURE_COLORSPACE_SRGB: -- return DRM_VALVE1_TRANSFER_FUNCTION_SRGB; -+ return AMDGPU_TRANSFER_FUNCTION_SRGB_INV_EOTF; - case GAMESCOPE_APP_TEXTURE_COLORSPACE_SCRGB: // scRGB Linear -> PQ for shaper + 3D LUT - case GAMESCOPE_APP_TEXTURE_COLORSPACE_HDR10_PQ: -- return DRM_VALVE1_TRANSFER_FUNCTION_PQ; -+ return AMDGPU_TRANSFER_FUNCTION_PQ_INV_EOTF; - case GAMESCOPE_APP_TEXTURE_COLORSPACE_PASSTHRU: -- return DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT; -+ return AMDGPU_TRANSFER_FUNCTION_DEFAULT; - } - } - -@@ -2403,8 +2403,8 @@ drm_prepare_liftoff( struct drm_t *drm, const struct FrameInfo_t *frameInfo, boo - - if ( drm_supports_color_mgmt( drm ) ) - { -- drm_valve1_transfer_function degamma_tf = colorspace_to_plane_degamma_tf( entry.layerState[i].colorspace ); -- drm_valve1_transfer_function shaper_tf = colorspace_to_plane_shaper_tf( entry.layerState[i].colorspace ); -+ amdgpu_transfer_function degamma_tf = colorspace_to_plane_degamma_tf( entry.layerState[i].colorspace ); -+ amdgpu_transfer_function shaper_tf = colorspace_to_plane_shaper_tf( entry.layerState[i].colorspace ); - - if ( entry.layerState[i].ycbcr ) - { -@@ -2416,27 +2416,27 @@ drm_prepare_liftoff( struct drm_t *drm, const struct FrameInfo_t *frameInfo, boo - // - // Doing LINEAR/DEFAULT here introduces banding so... this is the best way. - // (sRGB DEGAMMA does NOT work on YUV planes!) -- degamma_tf = DRM_VALVE1_TRANSFER_FUNCTION_BT709; -- shaper_tf = DRM_VALVE1_TRANSFER_FUNCTION_BT709; -+ degamma_tf = AMDGPU_TRANSFER_FUNCTION_BT709_OETF; -+ shaper_tf = AMDGPU_TRANSFER_FUNCTION_BT709_INV_OETF; - } - - if (!g_bDisableDegamma) -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_DEGAMMA_TF", degamma_tf ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_DEGAMMA_TF", degamma_tf ); - else -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_DEGAMMA_TF", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_DEGAMMA_TF", 0 ); - - if ( !g_bDisableShaperAnd3DLUT ) - { -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_SHAPER_LUT", drm->pending.shaperlut_id[ ColorSpaceToEOTFIndex( entry.layerState[i].colorspace ) ] ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_SHAPER_TF", shaper_tf ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_LUT3D", drm->pending.lut3d_id[ ColorSpaceToEOTFIndex( entry.layerState[i].colorspace ) ] ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_SHAPER_LUT", drm->pending.shaperlut_id[ ColorSpaceToEOTFIndex( entry.layerState[i].colorspace ) ] ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_SHAPER_TF", shaper_tf ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_LUT3D", drm->pending.lut3d_id[ ColorSpaceToEOTFIndex( entry.layerState[i].colorspace ) ] ); - // Josh: See shaders/colorimetry.h colorspace_blend_tf if you have questions as to why we start doing sRGB for BLEND_TF despite potentially working in Gamma 2.2 space prior. - } - else - { -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_SHAPER_LUT", 0 ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_SHAPER_TF", 0 ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_LUT3D", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_SHAPER_LUT", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_SHAPER_TF", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_LUT3D", 0 ); - } - } - } -@@ -2444,25 +2444,25 @@ drm_prepare_liftoff( struct drm_t *drm, const struct FrameInfo_t *frameInfo, boo - { - if ( drm_supports_color_mgmt( drm ) ) - { -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_DEGAMMA_TF", DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_SHAPER_LUT", 0 ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_SHAPER_TF", 0 ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_LUT3D", 0 ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_CTM", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_DEGAMMA_TF", AMDGPU_TRANSFER_FUNCTION_DEFAULT ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_SHAPER_LUT", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_SHAPER_TF", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_LUT3D", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_CTM", 0 ); - } - } - - if ( drm_supports_color_mgmt( drm ) ) - { - if (!g_bDisableBlendTF && !bSinglePlane) -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_BLEND_TF", drm->pending.output_tf ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_BLEND_TF", AMDGPU_TRANSFER_FUNCTION_DEFAULT ); - else -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_BLEND_TF", DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_BLEND_TF", AMDGPU_TRANSFER_FUNCTION_DEFAULT ); - - if (frameInfo->layers[i].ctm != nullptr) -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_CTM", frameInfo->layers[i].ctm->blob ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_CTM", frameInfo->layers[i].ctm->blob ); - else -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_CTM", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_CTM", 0 ); - } - } - else -@@ -2474,12 +2474,12 @@ drm_prepare_liftoff( struct drm_t *drm, const struct FrameInfo_t *frameInfo, boo - - if ( drm_supports_color_mgmt( drm ) ) - { -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_DEGAMMA_TF", DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_SHAPER_LUT", 0 ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_SHAPER_TF", 0 ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_LUT3D", 0 ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_BLEND_TF", DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT ); -- liftoff_layer_set_property( drm->lo_layers[ i ], "VALVE1_PLANE_CTM", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_DEGAMMA_TF", AMDGPU_TRANSFER_FUNCTION_DEFAULT ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_SHAPER_LUT", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_SHAPER_TF", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_LUT3D", 0 ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_BLEND_TF", AMDGPU_TRANSFER_FUNCTION_DEFAULT ); -+ liftoff_layer_set_property( drm->lo_layers[ i ], "AMD_PLANE_CTM", 0 ); - } - } - } -@@ -2575,17 +2575,17 @@ int drm_prepare( struct drm_t *drm, bool async, const struct FrameInfo_t *frameI - if ( !g_bDisableRegamma && !bSinglePlane ) - { - drm->pending.output_tf = g_bOutputHDREnabled -- ? DRM_VALVE1_TRANSFER_FUNCTION_PQ -- : DRM_VALVE1_TRANSFER_FUNCTION_SRGB; -+ ? AMDGPU_TRANSFER_FUNCTION_PQ_EOTF -+ : AMDGPU_TRANSFER_FUNCTION_SRGB_EOTF; - } - else - { -- drm->pending.output_tf = DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT; -+ drm->pending.output_tf = AMDGPU_TRANSFER_FUNCTION_DEFAULT; - } - } - else - { -- drm->pending.output_tf = DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT; -+ drm->pending.output_tf = AMDGPU_TRANSFER_FUNCTION_DEFAULT; - } - - uint32_t flags = DRM_MODE_ATOMIC_NONBLOCK; -@@ -2666,9 +2666,9 @@ int drm_prepare( struct drm_t *drm, bool async, const struct FrameInfo_t *frameI - if (ret < 0) - return ret; - } -- if (crtc->has_valve1_regamma_tf) -+ if (crtc->has_amd_regamma_tf) - { -- int ret = add_crtc_property(drm->req, crtc, "VALVE1_CRTC_REGAMMA_TF", 0); -+ int ret = add_crtc_property(drm->req, crtc, "AMD_CRTC_REGAMMA_TF", 0); - if (ret < 0) - return ret; - } -@@ -2719,9 +2719,9 @@ int drm_prepare( struct drm_t *drm, bool async, const struct FrameInfo_t *frameI - return ret; - } - -- if (drm->crtc->has_valve1_regamma_tf) -+ if (drm->crtc->has_amd_regamma_tf) - { -- ret = add_crtc_property(drm->req, drm->crtc, "VALVE1_CRTC_REGAMMA_TF", drm->pending.output_tf); -+ ret = add_crtc_property(drm->req, drm->crtc, "AMD_CRTC_REGAMMA_TF", drm->pending.output_tf); - if (ret < 0) - return ret; - } -@@ -2763,9 +2763,9 @@ int drm_prepare( struct drm_t *drm, bool async, const struct FrameInfo_t *frameI - return ret; - } - -- if ( drm->crtc->has_valve1_regamma_tf && drm->pending.output_tf != drm->current.output_tf ) -+ if ( drm->crtc->has_amd_regamma_tf && drm->pending.output_tf != drm->current.output_tf ) - { -- int ret = add_crtc_property(drm->req, drm->crtc, "VALVE1_CRTC_REGAMMA_TF", drm->pending.output_tf ); -+ int ret = add_crtc_property(drm->req, drm->crtc, "AMD_CRTC_REGAMMA_TF", drm->pending.output_tf ); - if (ret < 0) - return ret; - } -diff --git a/src/drm.hpp b/src/drm.hpp -index 6810797..bc0befb 100644 ---- a/src/drm.hpp -+++ b/src/drm.hpp -@@ -150,7 +150,7 @@ struct crtc { - bool has_degamma_lut; - bool has_ctm; - bool has_vrr_enabled; -- bool has_valve1_regamma_tf; -+ bool has_amd_regamma_tf; - - struct { - bool active; -@@ -212,19 +212,22 @@ struct fb { - std::atomic< uint32_t > n_refs; - }; - --enum drm_valve1_transfer_function { -- DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT, -- -- DRM_VALVE1_TRANSFER_FUNCTION_SRGB, -- DRM_VALVE1_TRANSFER_FUNCTION_BT709, -- DRM_VALVE1_TRANSFER_FUNCTION_PQ, -- DRM_VALVE1_TRANSFER_FUNCTION_LINEAR, -- DRM_VALVE1_TRANSFER_FUNCTION_UNITY, -- DRM_VALVE1_TRANSFER_FUNCTION_HLG, -- DRM_VALVE1_TRANSFER_FUNCTION_GAMMA22, -- DRM_VALVE1_TRANSFER_FUNCTION_GAMMA24, -- DRM_VALVE1_TRANSFER_FUNCTION_GAMMA26, -- DRM_VALVE1_TRANSFER_FUNCTION_MAX, -+enum amdgpu_transfer_function { -+ AMDGPU_TRANSFER_FUNCTION_DEFAULT, -+ AMDGPU_TRANSFER_FUNCTION_SRGB_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_BT709_INV_OETF, -+ AMDGPU_TRANSFER_FUNCTION_PQ_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_IDENTITY, -+ AMDGPU_TRANSFER_FUNCTION_GAMMA22_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_GAMMA24_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_GAMMA26_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_SRGB_INV_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_BT709_OETF, -+ AMDGPU_TRANSFER_FUNCTION_PQ_INV_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_GAMMA22_INV_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_GAMMA24_INV_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_GAMMA26_INV_EOTF, -+ AMDGPU_TRANSFER_FUNCTION_COUNT - }; - - struct drm_t { -@@ -267,7 +270,7 @@ struct drm_t { - uint32_t shaperlut_id[ EOTF_Count ]; - enum drm_screen_type screen_type = DRM_SCREEN_TYPE_INTERNAL; - bool vrr_enabled = false; -- drm_valve1_transfer_function output_tf = DRM_VALVE1_TRANSFER_FUNCTION_DEFAULT; -+ amdgpu_transfer_function output_tf = AMDGPU_TRANSFER_FUNCTION_DEFAULT; - } current, pending; - bool wants_vrr_enabled = false; - diff --git a/spec_files/gamescope/chimeraos.patch b/spec_files/gamescope/chimeraos.patch deleted file mode 100644 index a2018692..00000000 --- a/spec_files/gamescope/chimeraos.patch +++ /dev/null @@ -1,974 +0,0 @@ -From 4cafbd696c342c1f45eea6242dcaadd26e8e4a3d Mon Sep 17 00:00:00 2001 -From: Matthew Anderson -Date: Fri, 6 Oct 2023 17:22:41 -0500 -Subject: [PATCH 1/9] Add initial rotation atom controls - ---- - src/drm.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ - src/drm.hpp | 11 +++++++++++ - src/steamcompmgr.cpp | 32 ++++++++++++++++++++++++++++++++ - src/xwayland_ctx.hpp | 1 + - 4 files changed, 86 insertions(+) - -diff --git a/src/drm.cpp b/src/drm.cpp -index c2694f0..de5e3ca 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -45,6 +45,7 @@ struct drm_t g_DRM = {}; - uint32_t g_nDRMFormat = DRM_FORMAT_INVALID; - uint32_t g_nDRMFormatOverlay = DRM_FORMAT_INVALID; // for partial composition, we may have more limited formats than base planes + alpha. - bool g_bRotated = false; -+bool g_rotate_ctl_enable = false; - bool g_bUseLayers = true; - bool g_bDebugLayers = false; - const char *g_sOutputName = nullptr; -@@ -65,6 +66,7 @@ bool g_bSupportsAsyncFlips = false; - - enum drm_mode_generation g_drmModeGeneration = DRM_MODE_GENERATE_CVT; - enum g_panel_orientation g_drmModeOrientation = PANEL_ORIENTATION_AUTO; -+enum g_rotate_ctl g_drmRotateCTL; - std::atomic g_drmEffectiveOrientation[DRM_SCREEN_TYPE_COUNT]{ {DRM_MODE_ROTATE_0}, {DRM_MODE_ROTATE_0} }; - - bool g_bForceDisableColorMgmt = false; -@@ -2010,6 +2012,27 @@ static void update_drm_effective_orientation(struct drm_t *drm, struct connector - static void update_drm_effective_orientations(struct drm_t *drm, struct connector *conn, const drmModeModeInfo *mode) - { - drm_screen_type screenType = drm_get_connector_type(conn->connector); -+ -+ if (g_rotate_ctl_enable) -+ { -+ switch (g_drmRotateCTL) -+ { -+ default: -+ case NORMAL: -+ g_drmEffectiveOrientation[screenType] = DRM_MODE_ROTATE_0; -+ break; -+ case LEFT_UP: -+ g_drmEffectiveOrientation[screenType] = DRM_MODE_ROTATE_90; -+ break; -+ case UPSIDEDOWN: -+ g_drmEffectiveOrientation[screenType] = DRM_MODE_ROTATE_180; -+ break; -+ case RIGHT_UP: -+ g_drmEffectiveOrientation[screenType] = DRM_MODE_ROTATE_270; -+ break; -+ } -+ return; -+ } - if (screenType == DRM_SCREEN_TYPE_INTERNAL) - { - update_drm_effective_orientation(drm, conn, mode); -@@ -3083,6 +3106,25 @@ bool drm_set_refresh( struct drm_t *drm, int refresh ) - return drm_set_mode(drm, &mode); - } - -+void drm_set_orientation( struct drm_t *drm, bool isRotated) -+{ -+ int width = g_nOutputWidth; -+ int height = g_nOutputHeight; -+ g_bRotated = isRotated; -+ if ( g_bRotated ) { -+ int tmp = width; -+ width = height; -+ height = tmp; -+ } -+ -+ if (!drm->connector || !drm->connector->connector) -+ return; -+ -+ drmModeConnector *connector = drm->connector->connector; -+ const drmModeModeInfo *mode = find_mode(connector, width, height, 0); -+ update_drm_effective_orientations(drm, drm->connector, mode); -+} -+ - bool drm_set_resolution( struct drm_t *drm, int width, int height ) - { - if (!drm->connector || !drm->connector->connector) -diff --git a/src/drm.hpp b/src/drm.hpp -index 6810797..b2ab49f 100644 ---- a/src/drm.hpp -+++ b/src/drm.hpp -@@ -325,13 +325,24 @@ enum g_panel_orientation { - PANEL_ORIENTATION_AUTO, - }; - -+enum g_rotate_ctl{ -+ NORMAL, -+ LEFT_UP, -+ UPSIDEDOWN, -+ RIGHT_UP, -+}; -+ - extern enum drm_mode_generation g_drmModeGeneration; - extern enum g_panel_orientation g_drmModeOrientation; -+extern enum g_rotate_ctl g_drmRotateCTL; -+extern bool g_rotate_ctl_enable; - - extern std::atomic g_drmEffectiveOrientation[DRM_SCREEN_TYPE_COUNT]; // DRM_MODE_ROTATE_* - - extern bool g_bForceDisableColorMgmt; - -+void drm_set_orientation( struct drm_t *drm, bool isRotated ); -+ - bool init_drm(struct drm_t *drm, int width, int height, int refresh, bool wants_adaptive_sync); - void finish_drm(struct drm_t *drm); - int drm_commit(struct drm_t *drm, const struct FrameInfo_t *frameInfo ); -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index b02fa33..277a54c 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -5644,6 +5644,37 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) - if ( g_upscaleFilter == GamescopeUpscaleFilter::FSR || g_upscaleFilter == GamescopeUpscaleFilter::NIS ) - hasRepaint = true; - } -+ if ( ev->atom == ctx->atoms.gamescopeRotateControl ) -+ { -+ std::vector< uint32_t > drm_rot_ctl; -+ bool rotate = get_prop( ctx, ctx->root, ctx->atoms.gamescopeRotateControl, drm_rot_ctl ); -+ bool rotated = false; -+ if ( rotate && drm_rot_ctl.size() == 1 ) -+ { -+ xwm_log.debugf("drm_rot_ctl %d", drm_rot_ctl[0]); -+ g_rotate_ctl_enable = true; -+ switch ( drm_rot_ctl[0] ) -+ { -+ case 0: -+ g_drmRotateCTL = NORMAL; -+ rotated = false; -+ break; -+ case 1: -+ g_drmRotateCTL = LEFT_UP; -+ rotated = true; -+ break; -+ case 2: -+ g_drmRotateCTL = UPSIDEDOWN; -+ rotated = false; -+ break; -+ case 3: -+ g_drmRotateCTL = RIGHT_UP; -+ rotated = true; -+ break; -+ } -+ drm_set_orientation(&g_DRM, rotated); -+ } -+ } - if ( ev->atom == ctx->atoms.gamescopeXWaylandModeControl ) - { - std::vector< uint32_t > xwayland_mode_ctl; -@@ -7248,6 +7279,7 @@ void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_ - ctx->atoms.gamescopeFSRSharpness = XInternAtom( ctx->dpy, "GAMESCOPE_FSR_SHARPNESS", false ); - ctx->atoms.gamescopeSharpness = XInternAtom( ctx->dpy, "GAMESCOPE_SHARPNESS", false ); - -+ ctx->atoms.gamescopeRotateControl = XInternAtom( ctx->dpy, "GAMESCOPE_ROTATE_CONTROL", false ); - ctx->atoms.gamescopeXWaylandModeControl = XInternAtom( ctx->dpy, "GAMESCOPE_XWAYLAND_MODE_CONTROL", false ); - ctx->atoms.gamescopeFPSLimit = XInternAtom( ctx->dpy, "GAMESCOPE_FPS_LIMIT", false ); - ctx->atoms.gamescopeDynamicRefresh[DRM_SCREEN_TYPE_INTERNAL] = XInternAtom( ctx->dpy, "GAMESCOPE_DYNAMIC_REFRESH", false ); -diff --git a/src/xwayland_ctx.hpp b/src/xwayland_ctx.hpp -index 5764c4b..6231007 100644 ---- a/src/xwayland_ctx.hpp -+++ b/src/xwayland_ctx.hpp -@@ -146,6 +146,7 @@ struct xwayland_ctx_t final : public gamescope::IWaitable - Atom gamescopeFSRSharpness; - Atom gamescopeSharpness; - -+ Atom gamescopeRotateControl; - Atom gamescopeXWaylandModeControl; - - Atom gamescopeFPSLimit; --- -2.42.0 - - -From 4d8f1c32f1be873bf009b3d14b1ff3756495da63 Mon Sep 17 00:00:00 2001 -From: Matthew Anderson -Date: Sat, 7 Oct 2023 10:38:09 -0500 -Subject: [PATCH 2/9] Flag drm_out_of_date to ensure rotation logic gets reset - ---- - src/steamcompmgr.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 277a54c..236bba4 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -5673,6 +5673,7 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) - break; - } - drm_set_orientation(&g_DRM, rotated); -+ g_DRM.out_of_date = 2; - } - } - if ( ev->atom == ctx->atoms.gamescopeXWaylandModeControl ) --- -2.42.0 - - -From b145e5cde74d026ffceddee7f4096a23e60e6112 Mon Sep 17 00:00:00 2001 -From: Matthew Anderson -Date: Tue, 25 Apr 2023 06:45:01 -0500 -Subject: [PATCH 3/9] Add --force-panel-type and --force-external-orientation - arguments (#2) - -* Add --force-panel-type and --force-external-orientation arguments. - -* Rotate only the internal display when faked as "external" - -* Try to prevent the external display from being rotated when --force-panel-type external is used. - -* Fixed docking issue when --force-panel-type external is used and you dock/undock the handheld. ---- - src/drm.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++------- - src/drm.hpp | 15 +++++++++++++++ - src/main.cpp | 36 +++++++++++++++++++++++++++++++++++ - 3 files changed, 98 insertions(+), 7 deletions(-) - -diff --git a/src/drm.cpp b/src/drm.cpp -index de5e3ca..f4fe8fd 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -46,6 +46,7 @@ uint32_t g_nDRMFormat = DRM_FORMAT_INVALID; - uint32_t g_nDRMFormatOverlay = DRM_FORMAT_INVALID; // for partial composition, we may have more limited formats than base planes + alpha. - bool g_bRotated = false; - bool g_rotate_ctl_enable = false; -+bool g_bDisplayTypeInternal = false; - bool g_bUseLayers = true; - bool g_bDebugLayers = false; - const char *g_sOutputName = nullptr; -@@ -68,6 +69,8 @@ enum drm_mode_generation g_drmModeGeneration = DRM_MODE_GENERATE_CVT; - enum g_panel_orientation g_drmModeOrientation = PANEL_ORIENTATION_AUTO; - enum g_rotate_ctl g_drmRotateCTL; - std::atomic g_drmEffectiveOrientation[DRM_SCREEN_TYPE_COUNT]{ {DRM_MODE_ROTATE_0}, {DRM_MODE_ROTATE_0} }; -+enum g_panel_external_orientation g_drmModeExternalOrientation = PANEL_EXTERNAL_ORIENTATION_AUTO; -+enum g_panel_type g_drmPanelType = PANEL_TYPE_AUTO; - - bool g_bForceDisableColorMgmt = false; - -@@ -1981,8 +1984,29 @@ static uint64_t determine_drm_orientation(struct drm_t *drm, struct connector *c - static void update_drm_effective_orientation(struct drm_t *drm, struct connector *conn, const drmModeModeInfo *mode) - { - drm_screen_type screenType = drm_get_connector_type(conn->connector); -- -- if (screenType == DRM_SCREEN_TYPE_INTERNAL) -+ if ( screenType == DRM_SCREEN_TYPE_EXTERNAL && g_bDisplayTypeInternal == true ) -+ { -+ switch ( g_drmModeExternalOrientation ) -+ { -+ case PANEL_EXTERNAL_ORIENTATION_0: -+ g_drmEffectiveOrientation[screenType] = DRM_MODE_ROTATE_0; -+ break; -+ case PANEL_EXTERNAL_ORIENTATION_90: -+ g_drmEffectiveOrientation[screenType] = DRM_MODE_ROTATE_90; -+ break; -+ case PANEL_EXTERNAL_ORIENTATION_180: -+ g_drmEffectiveOrientation[screenType] = DRM_MODE_ROTATE_180; -+ break; -+ case PANEL_EXTERNAL_ORIENTATION_270: -+ g_drmEffectiveOrientation[screenType] = DRM_MODE_ROTATE_270; -+ break; -+ case PANEL_EXTERNAL_ORIENTATION_AUTO: -+ g_drmEffectiveOrientation[screenType] = determine_drm_orientation(drm, conn, mode); -+ break; -+ } -+ return; -+ } -+ else if ( screenType == DRM_SCREEN_TYPE_INTERNAL ) - { - switch ( g_drmModeOrientation ) - { -@@ -2933,11 +2957,27 @@ bool drm_get_vrr_in_use(struct drm_t *drm) - - drm_screen_type drm_get_connector_type(drmModeConnector *connector) - { -- if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || -- connector->connector_type == DRM_MODE_CONNECTOR_LVDS || -- connector->connector_type == DRM_MODE_CONNECTOR_DSI) -- return DRM_SCREEN_TYPE_INTERNAL; -- -+ // Set to the default state of false to make sure the external display isn't rotated when a system is docked -+ g_bDisplayTypeInternal = false; -+ switch ( g_drmPanelType ) -+ { -+ case PANEL_TYPE_INTERNAL: -+ return DRM_SCREEN_TYPE_INTERNAL; -+ break; -+ case PANEL_TYPE_EXTERNAL: -+ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || -+ connector->connector_type == DRM_MODE_CONNECTOR_LVDS || -+ connector->connector_type == DRM_MODE_CONNECTOR_DSI) -+ g_bDisplayTypeInternal = true; -+ return DRM_SCREEN_TYPE_EXTERNAL; -+ break; -+ case PANEL_TYPE_AUTO: -+ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || -+ connector->connector_type == DRM_MODE_CONNECTOR_LVDS || -+ connector->connector_type == DRM_MODE_CONNECTOR_DSI) -+ return DRM_SCREEN_TYPE_INTERNAL; -+ break; -+ } - return DRM_SCREEN_TYPE_EXTERNAL; - } - -diff --git a/src/drm.hpp b/src/drm.hpp -index b2ab49f..53fc540 100644 ---- a/src/drm.hpp -+++ b/src/drm.hpp -@@ -331,11 +331,26 @@ enum g_rotate_ctl{ - UPSIDEDOWN, - RIGHT_UP, - }; -+enum g_panel_external_orientation { -+ PANEL_EXTERNAL_ORIENTATION_0, /* NORMAL */ -+ PANEL_EXTERNAL_ORIENTATION_270, /* RIGHT */ -+ PANEL_EXTERNAL_ORIENTATION_90, /* LEFT */ -+ PANEL_EXTERNAL_ORIENTATION_180, /* UPSIDE DOWN */ -+ PANEL_EXTERNAL_ORIENTATION_AUTO, -+}; -+ -+enum g_panel_type { -+ PANEL_TYPE_INTERNAL, -+ PANEL_TYPE_EXTERNAL, -+ PANEL_TYPE_AUTO, -+}; - - extern enum drm_mode_generation g_drmModeGeneration; - extern enum g_panel_orientation g_drmModeOrientation; - extern enum g_rotate_ctl g_drmRotateCTL; - extern bool g_rotate_ctl_enable; -+extern enum g_panel_external_orientation g_drmModeExternalOrientation; -+extern enum g_panel_type g_drmPanelType; - - extern std::atomic g_drmEffectiveOrientation[DRM_SCREEN_TYPE_COUNT]; // DRM_MODE_ROTATE_* - -diff --git a/src/main.cpp b/src/main.cpp -index 76721d6..f6ba34f 100644 ---- a/src/main.cpp -+++ b/src/main.cpp -@@ -118,6 +118,8 @@ const struct option *gamescope_options = (struct option[]){ - { "disable-xres", no_argument, nullptr, 'x' }, - { "fade-out-duration", required_argument, nullptr, 0 }, - { "force-orientation", required_argument, nullptr, 0 }, -+ { "force-external-orientation", required_argument, nullptr, 0 }, -+ { "force-panel-type", required_argument, nullptr, 0 }, - { "force-windows-fullscreen", no_argument, nullptr, 0 }, - - { "disable-color-management", no_argument, nullptr, 0 }, -@@ -167,6 +169,8 @@ const char usage[] = - " --xwayland-count create N xwayland servers\n" - " --prefer-vk-device prefer Vulkan device for compositing (ex: 1002:7300)\n" - " --force-orientation rotate the internal display (left, right, normal, upsidedown)\n" -+ " --force-external-orientation rotate the external display (left, right, normal, upsidedown)\n" -+ " --force-panel-type force gamescope to treat the display as either internal or external\n" - " --force-windows-fullscreen force windows inside of gamescope to be the size of the nested display (fullscreen)\n" - " --cursor-scale-height if specified, sets a base output height to linearly scale the cursor against.\n" - " --hdr-enabled enable HDR output (needs Gamescope WSI layer enabled for support from clients)\n" -@@ -353,6 +357,18 @@ static enum drm_mode_generation parse_drm_mode_generation(const char *str) - } - } - -+static enum g_panel_type force_panel_type(const char *str) -+{ -+ if (strcmp(str, "internal") == 0) { -+ return PANEL_TYPE_INTERNAL; -+ } else if (strcmp(str, "external") == 0) { -+ return PANEL_TYPE_EXTERNAL; -+ } else { -+ fprintf( stderr, "gamescope: invalid value for --force-panel-type\n" ); -+ exit(1); -+ } -+} -+ - static enum g_panel_orientation force_orientation(const char *str) - { - if (strcmp(str, "normal") == 0) { -@@ -408,6 +424,22 @@ static enum GamescopeUpscaleFilter parse_upscaler_filter(const char *str) - struct sigaction handle_signal_action = {}; - extern pid_t child_pid; - -+static enum g_panel_external_orientation force_external_orientation(const char *str) -+{ -+ if (strcmp(str, "normal") == 0) { -+ return PANEL_EXTERNAL_ORIENTATION_0; -+ } else if (strcmp(str, "right") == 0) { -+ return PANEL_EXTERNAL_ORIENTATION_270; -+ } else if (strcmp(str, "left") == 0) { -+ return PANEL_EXTERNAL_ORIENTATION_90; -+ } else if (strcmp(str, "upsidedown") == 0) { -+ return PANEL_EXTERNAL_ORIENTATION_180; -+ } else { -+ fprintf( stderr, "gamescope: invalid value for --force-external-orientation\n" ); -+ exit(1); -+ } -+} -+ - static void handle_signal( int sig ) - { - switch ( sig ) { -@@ -614,6 +646,10 @@ int main(int argc, char **argv) - g_drmModeGeneration = parse_drm_mode_generation( optarg ); - } else if (strcmp(opt_name, "force-orientation") == 0) { - g_drmModeOrientation = force_orientation( optarg ); -+ } else if (strcmp(opt_name, "force-external-orientation") == 0) { -+ g_drmModeExternalOrientation = force_external_orientation( optarg ); -+ } else if (strcmp(opt_name, "force-panel-type") == 0) { -+ g_drmPanelType = force_panel_type( optarg ); - } else if (strcmp(opt_name, "sharpness") == 0 || - strcmp(opt_name, "fsr-sharpness") == 0) { - g_upscaleFilterSharpness = atoi( optarg ); --- -2.42.0 - - -From 4d1f8e34b70fee42e4e30feac16eda7aa2aa63e7 Mon Sep 17 00:00:00 2001 -From: Matthew Anderson -Date: Tue, 25 Jul 2023 18:05:05 -0500 -Subject: [PATCH 4/9] Set default to native resolution of display if Steam - tries to force 720p/800p - -You can select 720p/800p still in game or via Steam's resolution setting -Steam > Settings > Display > Resolution - -This effectively reverts the changes Valve made a year ago forcing us to -720p. ---- - src/steamcompmgr.cpp | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 236bba4..60f9828 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -5685,6 +5685,13 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) - size_t server_idx = size_t{ xwayland_mode_ctl[ 0 ] }; - int width = xwayland_mode_ctl[ 1 ]; - int height = xwayland_mode_ctl[ 2 ]; -+ -+ if ( g_nOutputWidth != 1280 && width == 1280 ) -+ { -+ width = g_nOutputWidth; -+ height = g_nOutputHeight; -+ } -+ - bool allowSuperRes = !!xwayland_mode_ctl[ 3 ]; - - if ( !allowSuperRes ) --- -2.42.0 - - -From 8959ef22543eb94d329ef9c117ec662061a3db6c Mon Sep 17 00:00:00 2001 -From: Matthew Anderson -Date: Wed, 26 Jul 2023 20:46:29 -0500 -Subject: [PATCH 5/9] Fix internal display touchscreen orientation when it's - forced - ---- - src/main.cpp | 6 ++++++ - src/main.hpp | 2 ++ - src/wlserver.cpp | 25 +++++++++++++++++++++++++ - 3 files changed, 33 insertions(+) - -diff --git a/src/main.cpp b/src/main.cpp -index f6ba34f..17409b5 100644 ---- a/src/main.cpp -+++ b/src/main.cpp -@@ -269,6 +269,8 @@ bool g_bHeadless = false; - - bool g_bGrabbed = false; - -+bool g_bExternalForced = false; -+ - GamescopeUpscaleFilter g_upscaleFilter = GamescopeUpscaleFilter::LINEAR; - GamescopeUpscaleScaler g_upscaleScaler = GamescopeUpscaleScaler::AUTO; - -@@ -427,12 +429,16 @@ extern pid_t child_pid; - static enum g_panel_external_orientation force_external_orientation(const char *str) - { - if (strcmp(str, "normal") == 0) { -+ g_bExternalForced = true; - return PANEL_EXTERNAL_ORIENTATION_0; - } else if (strcmp(str, "right") == 0) { -+ g_bExternalForced = true; - return PANEL_EXTERNAL_ORIENTATION_270; - } else if (strcmp(str, "left") == 0) { -+ g_bExternalForced = true; - return PANEL_EXTERNAL_ORIENTATION_90; - } else if (strcmp(str, "upsidedown") == 0) { -+ g_bExternalForced = true; - return PANEL_EXTERNAL_ORIENTATION_180; - } else { - fprintf( stderr, "gamescope: invalid value for --force-external-orientation\n" ); -diff --git a/src/main.hpp b/src/main.hpp -index 7d8e9f1..97ec0a8 100644 ---- a/src/main.hpp -+++ b/src/main.hpp -@@ -23,6 +23,8 @@ extern bool g_bFullscreen; - - extern bool g_bGrabbed; - -+extern bool g_bExternalForced; -+ - enum class GamescopeUpscaleFilter : uint32_t - { - LINEAR = 0, -diff --git a/src/wlserver.cpp b/src/wlserver.cpp -index 3fbc4ff..dc37f97 100644 ---- a/src/wlserver.cpp -+++ b/src/wlserver.cpp -@@ -1976,6 +1976,31 @@ static void apply_touchscreen_orientation(double *x, double *y ) - ty = 1.0 - *x; - break; - } -+ // Rotate screen if it's forced with --force-external-orientation -+ -+ if ( g_bExternalForced == true) -+ { -+ switch ( g_drmEffectiveOrientation[DRM_SCREEN_TYPE_EXTERNAL] ) -+ { -+ default: -+ case DRM_MODE_ROTATE_0: -+ tx = *x; -+ ty = *y; -+ break; -+ case DRM_MODE_ROTATE_90: -+ tx = 1.0 - *y; -+ ty = *x; -+ break; -+ case DRM_MODE_ROTATE_180: -+ tx = 1.0 - *x; -+ ty = 1.0 - *y; -+ break; -+ case DRM_MODE_ROTATE_270: -+ tx = *y; -+ ty = 1.0 - *x; -+ break; -+ } -+ } - - *x = tx; - *y = ty; --- -2.42.0 - - -From 17a8118d9ede790f27fa085a1d287f31e81abb64 Mon Sep 17 00:00:00 2001 -From: Matthew Anderson -Date: Fri, 6 Oct 2023 23:58:17 -0500 -Subject: [PATCH 6/9] Add initial display selection atom - ---- - src/drm.cpp | 20 +++++++++++++ - src/drm.hpp | 1 + - src/steamcompmgr.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++++ - src/xwayland_ctx.hpp | 1 + - 4 files changed, 91 insertions(+) - -diff --git a/src/drm.cpp b/src/drm.cpp -index f4fe8fd..d2f7677 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -50,6 +50,7 @@ bool g_bDisplayTypeInternal = false; - bool g_bUseLayers = true; - bool g_bDebugLayers = false; - const char *g_sOutputName = nullptr; -+char* targetConnector = (char*)"eDP-1"; - - #ifndef DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP - #define DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP 0x15 -@@ -1245,6 +1246,19 @@ static bool setup_best_connector(struct drm_t *drm, bool force, bool initial) - } - } - -+ for (auto &kv : drm->connectors) { -+ struct connector *conn = &kv.second; -+ drm_log.debugf("force set adapter"); -+ drm_log.debugf("conn->name: %s", conn->name); -+ drm_log.debugf("targetConnector: %s", targetConnector); -+ if (strcmp(conn->name, targetConnector) == 0) -+ { -+ drm_log.debugf("target was found!!!"); -+ drm_log.infof(" %s (%s)", conn->name, targetConnector); -+ best = conn; -+ } -+ } -+ - if (!force) { - if ((!best && drm->connector) || (best && best == drm->connector)) { - // Let's keep our current connector -@@ -2907,6 +2921,12 @@ static bool drm_set_crtc( struct drm_t *drm, struct crtc *crtc ) - return true; - } - -+void drm_set_prefered_connector( struct drm_t *drm, char* name ) -+{ -+ drm_log.infof("selecting prefered connector %s", name); -+ targetConnector = name; -+} -+ - bool drm_set_connector( struct drm_t *drm, struct connector *conn ) - { - drm_log.infof("selecting connector %s", conn->name); -diff --git a/src/drm.hpp b/src/drm.hpp -index 53fc540..739f51b 100644 ---- a/src/drm.hpp -+++ b/src/drm.hpp -@@ -368,6 +368,7 @@ uint32_t drm_fbid_from_dmabuf( struct drm_t *drm, struct wlr_buffer *buf, struct - void drm_lock_fbid( struct drm_t *drm, uint32_t fbid ); - void drm_unlock_fbid( struct drm_t *drm, uint32_t fbid ); - void drm_drop_fbid( struct drm_t *drm, uint32_t fbid ); -+void drm_set_prefered_connector( struct drm_t *drm, char* name ); - bool drm_set_connector( struct drm_t *drm, struct connector *conn ); - bool drm_set_mode( struct drm_t *drm, const drmModeModeInfo *mode ); - bool drm_set_refresh( struct drm_t *drm, int refresh ); -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 60f9828..aeef706 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -5719,6 +5719,74 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) - } - } - } -+ if ( ev->atom == ctx->atoms.gamescopeConnectorControl ) -+ { -+ std::vector< uint32_t > connector_ctl; -+ bool hasConnectorCtrl = get_prop( ctx, ctx->root, ctx->atoms.gamescopeConnectorControl, connector_ctl ); -+ char* adapter_type; -+ if ( hasConnectorCtrl && connector_ctl.size() == 1 ) -+ { -+ switch (connector_ctl[0]) -+ { -+ case 0: -+ adapter_type = (char*)"eDP-1"; -+ break; -+ case 1: -+ adapter_type = (char*)"eDP-2"; -+ break; -+ case 2: -+ adapter_type = (char*)"eDP-3"; -+ break; -+ case 3: -+ adapter_type = (char*)"DP-1"; -+ break; -+ case 4: -+ adapter_type = (char*)"DP-2"; -+ break; -+ case 5: -+ adapter_type = (char*)"DP-3"; -+ break; -+ case 6: -+ adapter_type = (char*)"HDMI-A-1"; -+ break; -+ case 7: -+ adapter_type = (char*)"HDMI-A-2"; -+ break; -+ case 8: -+ adapter_type = (char*)"HDMI-A-3"; -+ break; -+ case 9: -+ adapter_type = (char*)"HDMI-B-1"; -+ break; -+ case 10: -+ adapter_type = (char*)"HDMI-B-2"; -+ break; -+ case 11: -+ adapter_type = (char*)"HDMI-B-3"; -+ break; -+ case 12: -+ adapter_type = (char*)"HDMI-C-1"; -+ break; -+ case 13: -+ adapter_type = (char*)"HDMI-C-2"; -+ break; -+ case 14: -+ adapter_type = (char*)"HDMI-C-3"; -+ break; -+ case 15: -+ adapter_type = (char*)"DSI-1"; -+ break; -+ case 16: -+ adapter_type = (char*)"DSI-2"; -+ break; -+ case 17: -+ adapter_type = (char*)"DSI-3"; -+ break; -+ } -+ g_DRM.out_of_date = 2; -+ drm_set_prefered_connector(&g_DRM, adapter_type); -+ } -+ } - if ( ev->atom == ctx->atoms.gamescopeFPSLimit ) - { - g_nSteamCompMgrTargetFPS = get_prop( ctx, ctx->root, ctx->atoms.gamescopeFPSLimit, 0 ); -@@ -7289,6 +7357,7 @@ void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_ - - ctx->atoms.gamescopeRotateControl = XInternAtom( ctx->dpy, "GAMESCOPE_ROTATE_CONTROL", false ); - ctx->atoms.gamescopeXWaylandModeControl = XInternAtom( ctx->dpy, "GAMESCOPE_XWAYLAND_MODE_CONTROL", false ); -+ ctx->atoms.gamescopeConnectorControl = XInternAtom(ctx->dpy, "GAMESCOPE_CONNECTOR_CONTROL", false ); - ctx->atoms.gamescopeFPSLimit = XInternAtom( ctx->dpy, "GAMESCOPE_FPS_LIMIT", false ); - ctx->atoms.gamescopeDynamicRefresh[DRM_SCREEN_TYPE_INTERNAL] = XInternAtom( ctx->dpy, "GAMESCOPE_DYNAMIC_REFRESH", false ); - ctx->atoms.gamescopeDynamicRefresh[DRM_SCREEN_TYPE_EXTERNAL] = XInternAtom( ctx->dpy, "GAMESCOPE_DYNAMIC_REFRESH_EXTERNAL", false ); -diff --git a/src/xwayland_ctx.hpp b/src/xwayland_ctx.hpp -index 6231007..9dbc544 100644 ---- a/src/xwayland_ctx.hpp -+++ b/src/xwayland_ctx.hpp -@@ -149,6 +149,7 @@ struct xwayland_ctx_t final : public gamescope::IWaitable - Atom gamescopeRotateControl; - Atom gamescopeXWaylandModeControl; - -+ Atom gamescopeConnectorControl; - Atom gamescopeFPSLimit; - Atom gamescopeDynamicRefresh[DRM_SCREEN_TYPE_COUNT]; - Atom gamescopeLowLatency; --- -2.42.0 - - -From 8b94b4297324bddf48f3578592cdb6f9fe20e5a4 Mon Sep 17 00:00:00 2001 -From: Matthew Anderson -Date: Mon, 9 Oct 2023 11:21:11 -0500 -Subject: [PATCH 7/9] Use sysfs connector_ids for target device selection. - ---- - src/drm.cpp | 14 +++-------- - src/drm.hpp | 2 +- - src/steamcompmgr.cpp | 60 +------------------------------------------- - 3 files changed, 6 insertions(+), 70 deletions(-) - -diff --git a/src/drm.cpp b/src/drm.cpp -index d2f7677..59516c7 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -50,7 +50,7 @@ bool g_bDisplayTypeInternal = false; - bool g_bUseLayers = true; - bool g_bDebugLayers = false; - const char *g_sOutputName = nullptr; --char* targetConnector = (char*)"eDP-1"; -+uint32_t targetConnector; - - #ifndef DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP - #define DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP 0x15 -@@ -1248,13 +1248,8 @@ static bool setup_best_connector(struct drm_t *drm, bool force, bool initial) - - for (auto &kv : drm->connectors) { - struct connector *conn = &kv.second; -- drm_log.debugf("force set adapter"); -- drm_log.debugf("conn->name: %s", conn->name); -- drm_log.debugf("targetConnector: %s", targetConnector); -- if (strcmp(conn->name, targetConnector) == 0) -+ if ( conn->id == targetConnector) - { -- drm_log.debugf("target was found!!!"); -- drm_log.infof(" %s (%s)", conn->name, targetConnector); - best = conn; - } - } -@@ -2921,10 +2916,9 @@ static bool drm_set_crtc( struct drm_t *drm, struct crtc *crtc ) - return true; - } - --void drm_set_prefered_connector( struct drm_t *drm, char* name ) -+void drm_set_prefered_connector( struct drm_t *drm, uint32_t connector_type_id ) - { -- drm_log.infof("selecting prefered connector %s", name); -- targetConnector = name; -+ targetConnector = connector_type_id; - } - - bool drm_set_connector( struct drm_t *drm, struct connector *conn ) -diff --git a/src/drm.hpp b/src/drm.hpp -index 739f51b..6320bf7 100644 ---- a/src/drm.hpp -+++ b/src/drm.hpp -@@ -368,7 +368,7 @@ uint32_t drm_fbid_from_dmabuf( struct drm_t *drm, struct wlr_buffer *buf, struct - void drm_lock_fbid( struct drm_t *drm, uint32_t fbid ); - void drm_unlock_fbid( struct drm_t *drm, uint32_t fbid ); - void drm_drop_fbid( struct drm_t *drm, uint32_t fbid ); --void drm_set_prefered_connector( struct drm_t *drm, char* name ); -+void drm_set_prefered_connector( struct drm_t *drm, uint32_t connector_type_id ); - bool drm_set_connector( struct drm_t *drm, struct connector *conn ); - bool drm_set_mode( struct drm_t *drm, const drmModeModeInfo *mode ); - bool drm_set_refresh( struct drm_t *drm, int refresh ); -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index aeef706..9a3f495 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -5723,68 +5723,10 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) - { - std::vector< uint32_t > connector_ctl; - bool hasConnectorCtrl = get_prop( ctx, ctx->root, ctx->atoms.gamescopeConnectorControl, connector_ctl ); -- char* adapter_type; - if ( hasConnectorCtrl && connector_ctl.size() == 1 ) - { -- switch (connector_ctl[0]) -- { -- case 0: -- adapter_type = (char*)"eDP-1"; -- break; -- case 1: -- adapter_type = (char*)"eDP-2"; -- break; -- case 2: -- adapter_type = (char*)"eDP-3"; -- break; -- case 3: -- adapter_type = (char*)"DP-1"; -- break; -- case 4: -- adapter_type = (char*)"DP-2"; -- break; -- case 5: -- adapter_type = (char*)"DP-3"; -- break; -- case 6: -- adapter_type = (char*)"HDMI-A-1"; -- break; -- case 7: -- adapter_type = (char*)"HDMI-A-2"; -- break; -- case 8: -- adapter_type = (char*)"HDMI-A-3"; -- break; -- case 9: -- adapter_type = (char*)"HDMI-B-1"; -- break; -- case 10: -- adapter_type = (char*)"HDMI-B-2"; -- break; -- case 11: -- adapter_type = (char*)"HDMI-B-3"; -- break; -- case 12: -- adapter_type = (char*)"HDMI-C-1"; -- break; -- case 13: -- adapter_type = (char*)"HDMI-C-2"; -- break; -- case 14: -- adapter_type = (char*)"HDMI-C-3"; -- break; -- case 15: -- adapter_type = (char*)"DSI-1"; -- break; -- case 16: -- adapter_type = (char*)"DSI-2"; -- break; -- case 17: -- adapter_type = (char*)"DSI-3"; -- break; -- } - g_DRM.out_of_date = 2; -- drm_set_prefered_connector(&g_DRM, adapter_type); -+ drm_set_prefered_connector(&g_DRM, connector_ctl[0]); - } - } - if ( ev->atom == ctx->atoms.gamescopeFPSLimit ) --- -2.42.0 - - -From 40cb952642118fb983ec4e3deedd7410dbf69a07 Mon Sep 17 00:00:00 2001 -From: Matthew Anderson -Date: Tue, 16 Jan 2024 13:57:50 -0600 -Subject: [PATCH 8/9] Add edge gesture support to open Home and QAM - ---- - src/wlserver.cpp | 28 +++++++++++++++++++++++++++- - 1 file changed, 27 insertions(+), 1 deletion(-) - -diff --git a/src/wlserver.cpp b/src/wlserver.cpp -index dc37f97..e7fb7c9 100644 ---- a/src/wlserver.cpp -+++ b/src/wlserver.cpp -@@ -2048,8 +2048,34 @@ void wlserver_touchmotion( double x, double y, int touch_id, uint32_t time ) - - if ( get_effective_touch_mode() == WLSERVER_TOUCH_CLICK_PASSTHROUGH ) - { -+ bool start_gesture = false; - wlr_seat_touch_notify_motion( wlserver.wlr.seat, time, touch_id, wlserver.mouse_surface_cursorx, wlserver.mouse_surface_cursory ); -- } -+ -+ // Round the x-coordinate to the nearest whole number -+ uint32_t roundedCursorX = static_cast(std::round(wlserver.mouse_surface_cursorx)); -+ // Grab 2% of the display to be used for the edge range -+ double edge_range = g_nOutputWidth * 0.02; -+ -+ // if the touch cursor x position is less or equal to the range then start the gesture for left to right -+ if (roundedCursorX <= edge_range) { -+ start_gesture = true; -+ } -+ // if the touch cursor x position is the output width minus the edge range value then we are doing right to left -+ if (roundedCursorX >= g_nOutputWidth - edge_range) { -+ start_gesture = true; -+ } -+ // when the gesture is started and we are moving to the end of the edge range open home -+ if (start_gesture && roundedCursorX >= 1 && roundedCursorX <= edge_range) { -+ wl_log.infof("Detected Home gesture"); -+ wlserver_open_steam_menu(0); -+ start_gesture = false; -+ } -+ // when the gesture is started and we are moving from the output width minus the edge range to the output width open QAM -+ if (start_gesture && roundedCursorX >= g_nOutputWidth - edge_range && roundedCursorX <= g_nOutputWidth ) { -+ wl_log.infof("Detected QAM gesture"); -+ wlserver_open_steam_menu(1); -+ start_gesture = false; -+ } } - else if ( get_effective_touch_mode() == WLSERVER_TOUCH_CLICK_DISABLED ) - { - return; --- -2.42.0 - - -From f975e7a804100bb031fab0526d6714530381ec45 Mon Sep 17 00:00:00 2001 -From: Bouke Sybren Haarsma -Date: Wed, 3 Jan 2024 17:03:04 +0100 -Subject: [PATCH 9/9] remove hacky texture - -This will use more hardware planes, causing some devices to composite yeilding lower framerates ---- - src/steamcompmgr.cpp | 29 ----------------------------- - 1 file changed, 29 deletions(-) - -diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp -index 9a3f495..9e7eee5 100644 ---- a/src/steamcompmgr.cpp -+++ b/src/steamcompmgr.cpp -@@ -2540,35 +2540,6 @@ paint_all(bool async) - if ( overlay == global_focus.inputFocusWindow ) - update_touch_scaling( &frameInfo ); - } -- else -- { -- auto tex = vulkan_get_hacky_blank_texture(); -- if ( !BIsNested() && tex != nullptr ) -- { -- // HACK! HACK HACK HACK -- // To avoid stutter when toggling the overlay on -- int curLayer = frameInfo.layerCount++; -- -- FrameInfo_t::Layer_t *layer = &frameInfo.layers[ curLayer ]; -- -- -- layer->scale.x = g_nOutputWidth == tex->width() ? 1.0f : tex->width() / (float)g_nOutputWidth; -- layer->scale.y = g_nOutputHeight == tex->height() ? 1.0f : tex->height() / (float)g_nOutputHeight; -- layer->offset.x = 0.0f; -- layer->offset.y = 0.0f; -- layer->opacity = 1.0f; // BLAH -- layer->zpos = g_zposOverlay; -- layer->applyColorMgmt = g_ColorMgmt.pending.enabled; -- -- layer->colorspace = GAMESCOPE_APP_TEXTURE_COLORSPACE_LINEAR; -- layer->ctm = nullptr; -- layer->tex = tex; -- layer->fbid = tex->fbid(); -- -- layer->filter = GamescopeUpscaleFilter::NEAREST; -- layer->blackBorder = true; -- } -- } - - if (notification) - { --- -2.42.0 - diff --git a/spec_files/gamescope/crashfix.patch b/spec_files/gamescope/crashfix.patch deleted file mode 100644 index f50180e0..00000000 --- a/spec_files/gamescope/crashfix.patch +++ /dev/null @@ -1,57 +0,0 @@ -From adaa5e064a6149e1f8122cc55589f60b6f58f7ea Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Cl=C3=A9ment=20Gu=C3=A9rin?= -Date: Tue, 19 Dec 2023 16:34:17 -0800 -Subject: [PATCH 1/2] drm: fix NPE while in headless mode - -caused by e810317 ---- - src/drm.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/drm.cpp b/src/drm.cpp -index 59516c7..8759321 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -3337,6 +3337,7 @@ void drm_get_native_colorimetry( struct drm_t *drm, - *displayEOTF = EOTF_Gamma22; - *outputEncodingColorimetry = displaycolorimetry_709; - *outputEncodingEOTF = EOTF_Gamma22; -+ return; - } - - *displayColorimetry = drm->connector->metadata.colorimetry; --- -2.42.0 - - -From 08c56c656539c88b23d243869b00cf3dd33bcb1d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Cl=C3=A9ment=20Gu=C3=A9rin?= -Date: Wed, 20 Dec 2023 17:18:32 -0800 -Subject: [PATCH 2/2] drm: fix other headless NPE - -fixes a980d912 ---- - src/drm.cpp | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/drm.cpp b/src/drm.cpp -index 8759321..d632128 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -2584,10 +2584,10 @@ int drm_prepare( struct drm_t *drm, bool async, const struct FrameInfo_t *frameI - assert( drm->req == nullptr ); - drm->req = drmModeAtomicAlloc(); - -- bool bConnectorSupportsHDR = drm->connector->metadata.supportsST2084; -- bool bConnectorHDR = g_bOutputHDREnabled && bConnectorSupportsHDR; -- - if (drm->connector != nullptr) { -+ bool bConnectorSupportsHDR = drm->connector->metadata.supportsST2084; -+ bool bConnectorHDR = g_bOutputHDREnabled && bConnectorSupportsHDR; -+ - if (drm->connector->has_colorspace) { - drm->connector->pending.colorspace = ( bConnectorHDR ) ? DRM_MODE_COLORIMETRY_BT2020_RGB : DRM_MODE_COLORIMETRY_DEFAULT; - } --- -2.42.0 - diff --git a/spec_files/gamescope/gamescope.spec b/spec_files/gamescope/gamescope.spec index 8abd032b..4d6280ab 100644 --- a/spec_files/gamescope/gamescope.spec +++ b/spec_files/gamescope/gamescope.spec @@ -1,25 +1,26 @@ %global libliftoff_minver 0.4.1 -%global gamescope_version 3.13.19 + +# latest git +%define commit f6cd671cb4ee139f470fc55b580cc6ff3a50384b + +%global shortcommit %(c=%{commit}; echo ${c:0:7}) +%global _default_patch_fuzz 2 +%global build_timestamp %(date +"%Y%m%d") + +%global rel_build 1.git.%{build_timestamp}.%{shortcommit}%{?dist} Name: gamescope -Version: 100.%{gamescope_version} -Release: 1%{?dist}.bazzite.{{{ git_dir_version }}} +Version: 3.14.6 +Release: %{rel_build} Summary: Micro-compositor for video games on Wayland License: BSD URL: https://github.com/ValveSoftware/gamescope # Create stb.pc to satisfy dependency('stb') -Source1: stb.pc -Source2: chimeraos.patch -Source3: crashfix.patch -Source4: add_720p_var.patch -Source5: touch_gestures_env.patch -Source6: legion_go.patch -Source7: loki.patch -Source8: 0001-disable-steam-touch-click-atom.patch -Source9: 3.13.16.9-splitgate.patch -Source10: amd_hdr.patch +Source0: stb.pc + +Patch0: hardware.patch BuildRequires: meson >= 0.54.0 BuildRequires: ninja-build @@ -28,8 +29,11 @@ BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: glm-devel BuildRequires: google-benchmark-devel +BuildRequires: libeis-devel BuildRequires: libXmu-devel +BuildRequires: libXcursor-devel BuildRequires: pkgconfig(libdisplay-info) +BuildRequires: pkgconfig(libeis-1.0) BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(xdamage) BuildRequires: pkgconfig(xcomposite) @@ -47,55 +51,58 @@ BuildRequires: pkgconfig(wayland-protocols) >= 1.17 BuildRequires: pkgconfig(xkbcommon) BuildRequires: pkgconfig(sdl2) BuildRequires: pkgconfig(libpipewire-0.3) -BuildRequires: (pkgconfig(wlroots) >= 0.17.0 with pkgconfig(wlroots) < 0.18.0) +BuildRequires: pkgconfig(libavif) +BuildRequires: (pkgconfig(wlroots) >= 0.18.0 with pkgconfig(wlroots) < 0.19.0) BuildRequires: (pkgconfig(libliftoff) >= 0.4.1 with pkgconfig(libliftoff) < 0.5) BuildRequires: pkgconfig(libcap) BuildRequires: pkgconfig(hwdata) -BuildRequires: pkgconfig(xwayland) -BuildRequires: pkgconfig(xcursor) -BuildRequires: vkroots-devel -BuildRequires: /usr/bin/glslangValidator -BuildRequires: git -BuildRequires: stb_image-devel -BuildRequires: stb_image_write-devel +BuildRequires: spirv-headers-devel +# Enforce the the minimum EVR to contain fixes for all of: +# CVE-2021-28021 CVE-2021-42715 CVE-2021-42716 CVE-2022-28041 CVE-2023-43898 +# CVE-2023-45661 CVE-2023-45662 CVE-2023-45663 CVE-2023-45664 CVE-2023-45666 +# CVE-2023-45667 +BuildRequires: stb_image-devel >= 2.28^20231011gitbeebb24-12 +# Header-only library: -static is for tracking per guidelines +BuildRequires: stb_image-static BuildRequires: stb_image_resize-devel +BuildRequires: stb_image_resize-static +BuildRequires: stb_image_write-devel +BuildRequires: stb_image_write-static +BuildRequires: /usr/bin/glslangValidator +BuildRequires: libdecor-devel +BuildRequires: libXdamage-devel +BuildRequires: xorg-x11-server-Xwayland-devel +BuildRequires: git # libliftoff hasn't bumped soname, but API/ABI has changed for 0.2.0 release Requires: libliftoff%{?_isa} >= %{libliftoff_minver} Requires: xorg-x11-server-Xwayland -Requires: google-benchmark -Requires: gamescope-libs = %{version}-%{release} Recommends: mesa-dri-drivers Recommends: mesa-vulkan-drivers +Provides: gamescope-libs +Obsoletes: gamescope-libs + %description %{name} is the micro-compositor optimized for running video games on Wayland. -%package libs -Summary: libs for %{name} -%description libs -%summary - %prep -git clone --single-branch --branch %{gamescope_version} https://github.com/ValveSoftware/gamescope.git +git clone --single-branch --branch jupiter-3.6 https://github.com/ValveSoftware/gamescope cd gamescope +git checkout %{commit} git submodule update --init --recursive mkdir -p pkgconfig -cp %{SOURCE1} pkgconfig/stb.pc -patch -Np1 < %{SOURCE2} -patch -Np1 < %{SOURCE3} -patch -Np1 < %{SOURCE4} -patch -Np1 < %{SOURCE5} -patch -Np1 < %{SOURCE6} -patch -Np1 < %{SOURCE7} -patch -Np1 < %{SOURCE8} -patch -Np1 < %{SOURCE9} -patch -Np1 < %{SOURCE10} +cp %{SOURCE0} pkgconfig/stb.pc + +# Replace spirv-headers include with the system directory +sed -i 's^../thirdparty/SPIRV-Headers/include/spirv/^/usr/include/spirv/^' src/meson.build + +%autopatch -p1 %build cd gamescope export PKG_CONFIG_PATH=pkgconfig -%meson -Dpipewire=enabled -Denable_gamescope=true -Denable_gamescope_wsi_layer=true -Denable_openvr_support=true -Dforce_fallback_for=[] +%meson -Dpipewire=enabled -Ddrm_backend=enabled -Drt_cap=enabled -Davif_screenshots=enabled -Dinput_emulation=enabled -Dsdl2_backend=enabled -Dforce_fallback_for=vkroots %meson_build %install @@ -105,11 +112,9 @@ cd gamescope %files %license gamescope/LICENSE %doc gamescope/README.md -%attr(0755, root, root) %caps(cap_sys_nice=eip) %{_bindir}/gamescope +%{_bindir}/gamescope +%{_libdir}/libVkLayer_FROG_gamescope_wsi_*.so +%{_datadir}/vulkan/implicit_layer.d/VkLayer_FROG_gamescope_wsi.*.json -%files libs -%{_libdir}/*.so -%{_datadir}/vulkan/implicit_layer.d/ %changelog -{{{ git_dir_changelog }}} diff --git a/spec_files/gamescope/hardware.patch b/spec_files/gamescope/hardware.patch new file mode 100644 index 00000000..5518c1d2 --- /dev/null +++ b/spec_files/gamescope/hardware.patch @@ -0,0 +1,56 @@ +diff --git a/src/drm.cpp b/src/drm.cpp +index 42c67b9..6373e22 100644 +--- a/src/drm.cpp ++++ b/src/drm.cpp +@@ -549,6 +549,19 @@ static constexpr uint32_t s_kSteamDeckOLEDRates[] = + 90, + }; + ++static constexpr uint32_t s_kLegionGoRates[] = ++{ ++ 60, ++ 144, ++} ++ ++static constexpr uint32_t s_kLokiRates[] = ++{ ++ 40, ++ 50, ++ 60, ++} ++ + static void update_connector_display_info_wl(struct drm_t *drm) + { + wlserver_lock(); +@@ -2127,6 +2140,18 @@ namespace gamescope + } + } + ++ if ( m_Mutable.szMakePNP == "LEN"sv && m_Mutable.szModel == "Go Display"sv ) ++ { ++ m_Mutable.eKnownDisplay = GAMESCOPE_KNOWN_DISPLAY_LEGION_GO; ++ m_Mutable.ValidDynamicRefreshRates = std::span( s_kLegionGoRates ); ++ } ++ ++ if ( m_Mutable.szMakePNP == "AYN"sv && m_Mutable.szModel == "LK-GOLDSPV58"sv ) ++ { ++ m_Mutable.eKnownDisplay = GAMESCOPE_KNOWN_DISPLAY_LOKI; ++ m_Mutable.ValidDynamicRefreshRates = std::span( s_kLokiRates ); ++ } ++ + // Colorimetry + const char *pszColorOverride = getenv( "GAMESCOPE_INTERNAL_COLORIMETRY_OVERRIDE" ); + if ( pszColorOverride && *pszColorOverride && GetScreenType() == GAMESCOPE_SCREEN_TYPE_INTERNAL ) +diff --git a/src/gamescope_shared.h b/src/gamescope_shared.h +index f34174e..08e7b17 100644 +--- a/src/gamescope_shared.h ++++ b/src/gamescope_shared.h +@@ -10,6 +10,8 @@ namespace gamescope + GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD, // Jupiter + GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_SDC, // Galileo SDC + GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_BOE, // Galileo BOE ++ GAMESCOPE_KNOWN_DISPLAY_LEGION_GO, // Lenovo Legion Go ++ GAMESCOPE_KNOWN_DISPLAY_LOKI, // Ayn Loki + }; + + enum GamescopeModeGeneration diff --git a/spec_files/gamescope/legion_go.patch b/spec_files/gamescope/legion_go.patch deleted file mode 100644 index e2a3ac8d..00000000 --- a/spec_files/gamescope/legion_go.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/src/drm.cpp b/src/drm.cpp -index acff5e5..fdf58ee 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -101,6 +101,12 @@ static uint32_t galileo_display_rates[] = - 90, - }; - -+static uint32_t legion_go_display_rates[] = -+{ -+ 60, -+ 144, -+}; -+ - static uint32_t get_conn_display_info_flags(struct drm_t *drm, struct connector *connector) - { - if (!connector) -@@ -911,8 +917,11 @@ static void parse_edid( drm_t *drm, struct connector *conn) - conn->valid_display_rates = std::span(galileo_display_rates); - } else { - conn->is_galileo_display = 0; -- if ( conn->is_steam_deck_display ) -+ if ( conn->is_steam_deck_display ) { - conn->valid_display_rates = std::span(steam_deck_display_rates); -+ } else if ( strcmp(conn->make_pnp, "LEN") == 0 && strcmp(conn->model, "Go Display") == 0 ) { -+ conn->valid_display_rates = std::span(legion_go_display_rates); -+ } - } - - drm_hdr_parse_edid(drm, conn, edid); diff --git a/spec_files/gamescope/loki.patch b/spec_files/gamescope/loki.patch deleted file mode 100644 index 80dbe08c..00000000 --- a/spec_files/gamescope/loki.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/src/drm.cpp b/src/drm.cpp -index 745965c..9f8315e 100644 ---- a/src/drm.cpp -+++ b/src/drm.cpp -@@ -107,6 +107,13 @@ static uint32_t legion_go_display_rates[] = - 144, - }; - -+static uint32_t loki_display_rates[] = -+{ -+ 40, -+ 50, -+ 60, -+}; -+ - static uint32_t get_conn_display_info_flags(struct drm_t *drm, struct connector *connector) - { - if (!connector) -@@ -921,6 +928,8 @@ static void parse_edid( drm_t *drm, struct connector *conn) - conn->valid_display_rates = std::span(steam_deck_display_rates); - } else if ( strcmp(conn->make_pnp, "LEN") == 0 && strcmp(conn->model, "Go Display") == 0 ) { - conn->valid_display_rates = std::span(legion_go_display_rates); -+ } else if ( strcmp(conn->make_pnp, "AYN") == 0 && strcmp(conn->model, "LK-GOLDSPV58") == 0 ) { -+ conn->valid_display_rates = std::span(loki_display_rates); - } - } - diff --git a/spec_files/gamescope/touch_gestures_env.patch b/spec_files/gamescope/touch_gestures_env.patch deleted file mode 100644 index 45befc22..00000000 --- a/spec_files/gamescope/touch_gestures_env.patch +++ /dev/null @@ -1,77 +0,0 @@ -diff --git a/src/wlserver.cpp b/src/wlserver.cpp -index d569ee5..0512ab0 100644 ---- a/src/wlserver.cpp -+++ b/src/wlserver.cpp -@@ -66,6 +66,8 @@ extern "C" { - - static LogScope wl_log("wlserver"); - -+extern bool env_to_bool(const char *env); -+ - struct wlserver_t wlserver = { - .touch_down_ids = {} - }; -@@ -2043,34 +2045,38 @@ void wlserver_touchmotion( double x, double y, int touch_id, uint32_t time ) - - if ( get_effective_touch_mode() == WLSERVER_TOUCH_CLICK_PASSTHROUGH ) - { -- bool start_gesture = false; - wlr_seat_touch_notify_motion( wlserver.wlr.seat, time, touch_id, wlserver.mouse_surface_cursorx, wlserver.mouse_surface_cursory ); - -- // Round the x-coordinate to the nearest whole number -- uint32_t roundedCursorX = static_cast(std::round(wlserver.mouse_surface_cursorx)); -- // Grab 2% of the display to be used for the edge range -- double edge_range = g_nOutputWidth * 0.02; -- -- // if the touch cursor x position is less or equal to the range then start the gesture for left to right -- if (roundedCursorX <= edge_range) { -- start_gesture = true; -- } -- // if the touch cursor x position is the output width minus the edge range value then we are doing right to left -- if (roundedCursorX >= g_nOutputWidth - edge_range) { -- start_gesture = true; -- } -- // when the gesture is started and we are moving to the end of the edge range open home -- if (start_gesture && roundedCursorX >= 1 && roundedCursorX <= edge_range) { -- wl_log.infof("Detected Home gesture"); -- wlserver_open_steam_menu(0); -- start_gesture = false; -+ if (!env_to_bool(getenv("GAMESCOPE_DISABLE_TOUCH_GESTURES"))) { -+ bool start_gesture = false; -+ -+ // Round the x-coordinate to the nearest whole number -+ uint32_t roundedCursorX = static_cast(std::round(wlserver.mouse_surface_cursorx)); -+ // Grab 2% of the display to be used for the edge range -+ double edge_range = g_nOutputWidth * 0.02; -+ -+ // if the touch cursor x position is less or equal to the range then start the gesture for left to right -+ if (roundedCursorX <= edge_range) { -+ start_gesture = true; -+ } -+ // if the touch cursor x position is the output width minus the edge range value then we are doing right to left -+ if (roundedCursorX >= g_nOutputWidth - edge_range) { -+ start_gesture = true; -+ } -+ // when the gesture is started and we are moving to the end of the edge range open home -+ if (start_gesture && roundedCursorX >= 1 && roundedCursorX <= edge_range) { -+ wl_log.infof("Detected Home gesture"); -+ wlserver_open_steam_menu(0); -+ start_gesture = false; -+ } -+ // when the gesture is started and we are moving from the output width minus the edge range to the output width open QAM -+ if (start_gesture && roundedCursorX >= g_nOutputWidth - edge_range && roundedCursorX <= g_nOutputWidth ) { -+ wl_log.infof("Detected QAM gesture"); -+ wlserver_open_steam_menu(1); -+ start_gesture = false; -+ } - } -- // when the gesture is started and we are moving from the output width minus the edge range to the output width open QAM -- if (start_gesture && roundedCursorX >= g_nOutputWidth - edge_range && roundedCursorX <= g_nOutputWidth ) { -- wl_log.infof("Detected QAM gesture"); -- wlserver_open_steam_menu(1); -- start_gesture = false; -- } } -+ } - else if ( get_effective_touch_mode() == WLSERVER_TOUCH_CLICK_DISABLED ) - { - return;