feat(gamescope): add legion, cherry hotkey patch, fix externals on Intel rotation (#2153)

* Revert "chore: Remove stb from fallbacks"

This reverts commit 0f6d85ef1037945c3fea3a139e06f4e8fc1d39f5.

* Revert "fix(gamescope): add more fallbacks, remove force fallback, use latest again (#2062)"

This reverts commit 06bec935d796435bb9b777f2c5bff5d0a5d85458.

* Revert "chore: Update gamescope commit"

This reverts commit 1fece8b72edcc283a6a6f1e07ff147945583dad8.

* feat(gamescope): add legion, cherry hotkey patch, fix externals on Intel rotation
This commit is contained in:
Antheas Kapenekakis 2025-01-19 18:09:48 +01:00 committed by GitHub
parent 9665cbcca5
commit 6f326d7c06
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 291 additions and 139 deletions

View File

@ -3,12 +3,12 @@
%global _default_patch_fuzz 2 %global _default_patch_fuzz 2
%global build_timestamp %(date +"%Y%m%d") %global build_timestamp %(date +"%Y%m%d")
#global gamescope_tag 3.15.11 #global gamescope_tag 3.15.11
%global gamescope_commit 4da5e4a37560f9b3c85af2679330f9ec292c8ee1 %global gamescope_commit d3174928d47f7e353e7daca63cf882d65660cc7c
%define short_commit %(echo %{gamescope_commit} | cut -c1-8) %define short_commit %(echo %{gamescope_commit} | cut -c1-8)
Name: gamescope Name: gamescope
#Version: 100.%{gamescope_tag} #Version: 100.%{gamescope_tag}
Version: 105.%{short_commit} Version: 106.%{short_commit}
Release: 1.bazzite Release: 1.bazzite
Summary: Micro-compositor for video games on Wayland Summary: Micro-compositor for video games on Wayland
@ -113,7 +113,8 @@ sed -i 's^../thirdparty/SPIRV-Headers/include/spirv/^/usr/include/spirv/^' src/m
cd gamescope cd gamescope
export PKG_CONFIG_PATH=pkgconfig export PKG_CONFIG_PATH=pkgconfig
%meson \ %meson \
-Dforce_fallback_for=libdisplay-info,libliftoff,wlroots,vkroots --auto-features=enabled \
-Dforce_fallback_for=vkroots,wlroots,libliftoff,libdisplay-info
%meson_build %meson_build
%install %install

View File

@ -10,7 +10,7 @@ Subject: [NA] add dev script
diff --git a/sync.sh b/sync.sh diff --git a/sync.sh b/sync.sh
new file mode 100755 new file mode 100755
index 0000000..676d652 index 0000000..878bf6c
--- /dev/null --- /dev/null
+++ b/sync.sh +++ b/sync.sh
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
@ -30,13 +30,13 @@ index 0000000..676d652
+scp build/src/gamescope ${HOST}:gamescope +scp build/src/gamescope ${HOST}:gamescope
+ +
+ssh $HOST /bin/bash << EOF +ssh $HOST /bin/bash << EOF
+ sudo rpm-ostree usroverlay + sudo rpm-ostree usroverlay --hotfix
+ sudo mv ~/gamescope /usr/bin/gamescope + sudo mv ~/gamescope /usr/bin/gamescope
+ bazzite-session-select gamescope + bazzite-session-select gamescope
+ # sudo reboot + # sudo reboot
+EOF +EOF
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -155,7 +155,7 @@ index 2e6fb83..390c04a 100644
enum class GamescopeUpscaleFilter : uint32_t enum class GamescopeUpscaleFilter : uint32_t
{ {
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -171,7 +171,7 @@ This reverts commit 299bc3410dcfd46da5e3c988354b60ed3a356900.
2 files changed, 24 insertions(+), 16 deletions(-) 2 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index 18be94d..cd7e8ac 100644 index 11a7cad..df7616d 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -3299,7 +3299,7 @@ found:; @@ -3299,7 +3299,7 @@ found:;
@ -183,7 +183,7 @@ index 18be94d..cd7e8ac 100644
// Always update X's idea of focus, but still dirty // Always update X's idea of focus, but still dirty
// the it being outdated so we can resolve that globally later. // the it being outdated so we can resolve that globally later.
@@ -6050,28 +6050,37 @@ bool handle_done_commit( steamcompmgr_win_t *w, xwayland_ctx_t *ctx, uint64_t co @@ -6044,28 +6044,37 @@ bool handle_done_commit( steamcompmgr_win_t *w, xwayland_ctx_t *ctx, uint64_t co
// Window just got a new available commit, determine if that's worth a repaint // Window just got a new available commit, determine if that's worth a repaint
// If this is an overlay that we're presenting, repaint // If this is an overlay that we're presenting, repaint
@ -248,7 +248,7 @@ index 095694e..e41fad9 100644
bool hasHwndStyle = false; bool hasHwndStyle = false;
uint32_t hwndStyle = 0; uint32_t hwndStyle = 0;
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -309,7 +309,7 @@ index 78a86ee..99df8aa 100644
wlserver_keyboardfocus( old_kb_surf, false ); wlserver_keyboardfocus( old_kb_surf, false );
return; return;
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -348,7 +348,7 @@ index 8381889..a76b51b 100644
" --prefer-vk-device prefer Vulkan device for compositing (ex: 1002:7300)\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-orientation rotate the internal display (left, right, normal, upsidedown)\n"
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index cd7e8ac..3f3d499 100644 index df7616d..4a17499 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -197,6 +197,7 @@ update_runtime_info(); @@ -197,6 +197,7 @@ update_runtime_info();
@ -368,7 +368,7 @@ index cd7e8ac..3f3d499 100644
{ {
gamescope::cv_touch_click_mode = (gamescope::TouchClickMode) get_prop(ctx, ctx->root, ctx->atoms.steamTouchClickModeAtom, 0u ); gamescope::cv_touch_click_mode = (gamescope::TouchClickMode) get_prop(ctx, ctx->root, ctx->atoms.steamTouchClickModeAtom, 0u );
} }
@@ -7482,6 +7483,8 @@ steamcompmgr_main(int argc, char **argv) @@ -7476,6 +7477,8 @@ steamcompmgr_main(int argc, char **argv)
g_reshade_technique_idx = atoi(optarg); g_reshade_technique_idx = atoi(optarg);
} else if (strcmp(opt_name, "mura-map") == 0) { } else if (strcmp(opt_name, "mura-map") == 0) {
set_mura_overlay(optarg); set_mura_overlay(optarg);
@ -378,7 +378,7 @@ index cd7e8ac..3f3d499 100644
break; break;
case '?': case '?':
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -413,7 +413,7 @@ index a76b51b..84e05a9 100644
" --xwayland-count create N xwayland servers\n" " --xwayland-count create N xwayland servers\n"
" --prefer-vk-device prefer Vulkan device for compositing (ex: 1002:7300)\n" " --prefer-vk-device prefer Vulkan device for compositing (ex: 1002:7300)\n"
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index 3f3d499..5345b55 100644 index 4a17499..da3115f 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -147,6 +147,7 @@ static lut3d_t g_tmpLut3d; @@ -147,6 +147,7 @@ static lut3d_t g_tmpLut3d;
@ -433,7 +433,7 @@ index 3f3d499..5345b55 100644
{ {
auto tex = vulkan_get_hacky_blank_texture(); auto tex = vulkan_get_hacky_blank_texture();
if ( tex != nullptr ) if ( tex != nullptr )
@@ -7485,6 +7486,8 @@ steamcompmgr_main(int argc, char **argv) @@ -7479,6 +7480,8 @@ steamcompmgr_main(int argc, char **argv)
set_mura_overlay(optarg); set_mura_overlay(optarg);
} else if (strcmp(opt_name, "disable-touch-click") == 0) { } else if (strcmp(opt_name, "disable-touch-click") == 0) {
cv_disable_touch_click = true; cv_disable_touch_click = true;
@ -443,7 +443,7 @@ index 3f3d499..5345b55 100644
break; break;
case '?': case '?':
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -479,7 +479,7 @@ index 84e05a9..2398535 100644
} else if (strcmp(opt_name, "custom-refresh-rates") == 0) { } else if (strcmp(opt_name, "custom-refresh-rates") == 0) {
g_customRefreshRates = parse_custom_refresh_rates( optarg ); g_customRefreshRates = parse_custom_refresh_rates( optarg );
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -511,7 +511,7 @@ index 99df8aa..5e8f516 100644
default: default:
case GAMESCOPE_PANEL_ORIENTATION_AUTO: case GAMESCOPE_PANEL_ORIENTATION_AUTO:
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -549,7 +549,7 @@ index 2398535..0621c65 100644
" --prefer-vk-device prefer Vulkan device for compositing (ex: 1002:7300)\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-orientation rotate the internal display (left, right, normal, upsidedown)\n"
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index 5345b55..6544cf0 100644 index da3115f..69fd348 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -148,6 +148,7 @@ extern int g_nDynamicRefreshHz; @@ -148,6 +148,7 @@ extern int g_nDynamicRefreshHz;
@ -578,7 +578,7 @@ index 5345b55..6544cf0 100644
return false; return false;
if ( g_bChangeDynamicRefreshBasedOnGameOpenRatherThanActive ) if ( g_bChangeDynamicRefreshBasedOnGameOpenRatherThanActive )
@@ -7486,6 +7487,8 @@ steamcompmgr_main(int argc, char **argv) @@ -7480,6 +7481,8 @@ steamcompmgr_main(int argc, char **argv)
set_mura_overlay(optarg); set_mura_overlay(optarg);
} else if (strcmp(opt_name, "disable-touch-click") == 0) { } else if (strcmp(opt_name, "disable-touch-click") == 0) {
cv_disable_touch_click = true; cv_disable_touch_click = true;
@ -588,7 +588,7 @@ index 5345b55..6544cf0 100644
g_bHackyEnabled = true; g_bHackyEnabled = true;
} }
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -650,10 +650,10 @@ index 0621c65..056e1c1 100644
g_customRefreshRates = parse_custom_refresh_rates( optarg ); g_customRefreshRates = parse_custom_refresh_rates( optarg );
} else if (strcmp(opt_name, "sharpness") == 0 || } else if (strcmp(opt_name, "sharpness") == 0 ||
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index 6544cf0..d541f70 100644 index 69fd348..3dd64f8 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -7198,7 +7198,7 @@ void update_mode_atoms(xwayland_ctx_t *root_ctx, bool* needs_flush = nullptr) @@ -7192,7 +7192,7 @@ void update_mode_atoms(xwayland_ctx_t *root_ctx, bool* needs_flush = nullptr)
if (needs_flush) if (needs_flush)
*needs_flush = true; *needs_flush = true;
@ -700,7 +700,7 @@ index 0569472..104f7a2 100644
std::vector<ResListEntry_t> wlserver_xdg_commit_queue(); std::vector<ResListEntry_t> wlserver_xdg_commit_queue();
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -731,7 +731,7 @@ index 75c3258..f014be9 100644
m_Mutable.ValidDynamicRefreshRates = TableToVector<uint32_t>( *otDynamicRefreshRates ); m_Mutable.ValidDynamicRefreshRates = TableToVector<uint32_t>( *otDynamicRefreshRates );
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -746,7 +746,7 @@ disable VRR and use the classic frame limiter.
1 file changed, 28 insertions(+), 2 deletions(-) 1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index d541f70..8e5ad6a 100644 index 3dd64f8..7dacfe7 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -165,6 +165,7 @@ uint32_t g_reshade_technique_idx = 0; @@ -165,6 +165,7 @@ uint32_t g_reshade_technique_idx = 0;
@ -801,7 +801,7 @@ index d541f70..8e5ad6a 100644
if ( ev->atom == ctx->atoms.gamescopeDisplayForceInternal ) if ( ev->atom == ctx->atoms.gamescopeDisplayForceInternal )
{ {
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -815,7 +815,7 @@ Subject: fix(battery): run at half hz while at steamUI and disable VRR V2 +
1 file changed, 32 insertions(+), 11 deletions(-) 1 file changed, 32 insertions(+), 11 deletions(-)
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index 8e5ad6a..bc238e4 100644 index 7dacfe7..4098c44 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -166,6 +166,9 @@ uint32_t g_reshade_technique_idx = 0; @@ -166,6 +166,9 @@ uint32_t g_reshade_technique_idx = 0;
@ -921,7 +921,7 @@ index 8e5ad6a..bc238e4 100644
} }
if ( ev->atom == ctx->atoms.gamescopeDisplayForceInternal ) if ( ev->atom == ctx->atoms.gamescopeDisplayForceInternal )
{ {
@@ -7634,6 +7638,23 @@ steamcompmgr_main(int argc, char **argv) @@ -7628,6 +7632,23 @@ steamcompmgr_main(int argc, char **argv)
// as a question. // as a question.
const bool bIsVBlankFromTimer = vblank; const bool bIsVBlankFromTimer = vblank;
@ -946,7 +946,7 @@ index 8e5ad6a..bc238e4 100644
const bool bVRR = GetBackend()->IsVRRActive(); const bool bVRR = GetBackend()->IsVRRActive();
if ( bVRR ) if ( bVRR )
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -960,7 +960,7 @@ Subject: feat(battery): add atom for controlling frame halving
2 files changed, 8 insertions(+) 2 files changed, 8 insertions(+)
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index bc238e4..d968de5 100644 index 4098c44..6c8ce74 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -5919,6 +5919,10 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) @@ -5919,6 +5919,10 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev)
@ -974,7 +974,7 @@ index bc238e4..d968de5 100644
} }
static int static int
@@ -7095,6 +7099,8 @@ void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_ @@ -7089,6 +7093,8 @@ void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_
ctx->atoms.primarySelection = XInternAtom(ctx->dpy, "PRIMARY", false); ctx->atoms.primarySelection = XInternAtom(ctx->dpy, "PRIMARY", false);
ctx->atoms.targets = XInternAtom(ctx->dpy, "TARGETS", false); ctx->atoms.targets = XInternAtom(ctx->dpy, "TARGETS", false);
@ -997,7 +997,7 @@ index df2af70..e4eec9f 100644
bool HasQueuedEvents(); bool HasQueuedEvents();
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -1068,7 +1068,7 @@ index f014be9..6bb0b88 100644
if ( bNeedsFullComposite ) if ( bNeedsFullComposite )
diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp
index d8a24e9..00f5ece 100644 index b537170..ccabd88 100644
--- a/src/rendervulkan.hpp --- a/src/rendervulkan.hpp
+++ b/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp
@@ -281,6 +281,8 @@ struct FrameInfo_t @@ -281,6 +281,8 @@ struct FrameInfo_t
@ -1081,7 +1081,7 @@ index d8a24e9..00f5ece 100644
struct Layer_t struct Layer_t
{ {
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index d968de5..86773db 100644 index 6c8ce74..dfee904 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -169,6 +169,8 @@ bool g_bVRRRequested = false; @@ -169,6 +169,8 @@ bool g_bVRRRequested = false;
@ -1121,7 +1121,7 @@ index d968de5..86773db 100644
} }
static int static int
@@ -7100,6 +7107,7 @@ void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_ @@ -7094,6 +7101,7 @@ void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_
ctx->atoms.targets = XInternAtom(ctx->dpy, "TARGETS", false); ctx->atoms.targets = XInternAtom(ctx->dpy, "TARGETS", false);
ctx->atoms.gamescopeFrameHalveAtom = XInternAtom( ctx->dpy, "GAMESCOPE_STEAMUI_HALFHZ", false );; ctx->atoms.gamescopeFrameHalveAtom = XInternAtom( ctx->dpy, "GAMESCOPE_STEAMUI_HALFHZ", false );;
@ -1129,7 +1129,7 @@ index d968de5..86773db 100644
ctx->root_width = DisplayWidth(ctx->dpy, ctx->scr); ctx->root_width = DisplayWidth(ctx->dpy, ctx->scr);
ctx->root_height = DisplayHeight(ctx->dpy, ctx->scr); ctx->root_height = DisplayHeight(ctx->dpy, ctx->scr);
@@ -8067,9 +8075,10 @@ steamcompmgr_main(int argc, char **argv) @@ -8061,9 +8069,10 @@ steamcompmgr_main(int argc, char **argv)
bShouldPaint = false; bShouldPaint = false;
} }
@ -1155,7 +1155,7 @@ index e4eec9f..2347cbb 100644
bool HasQueuedEvents(); bool HasQueuedEvents();
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
@ -1164,7 +1164,7 @@ Date: Fri, 6 Dec 2024 16:51:02 +0800
Subject: feat: add rotation shader for rotating output Subject: feat: add rotation shader for rotating output
--- ---
src/Backends/DRMBackend.cpp | 29 +++++++- src/Backends/DRMBackend.cpp | 37 +++++++++-
src/main.cpp | 6 ++ src/main.cpp | 6 ++
src/main.hpp | 1 + src/main.hpp | 1 +
src/meson.build | 1 + src/meson.build | 1 +
@ -1172,27 +1172,58 @@ Subject: feat: add rotation shader for rotating output
src/rendervulkan.hpp | 6 +- src/rendervulkan.hpp | 6 +-
src/shaders/cs_rotation.comp | 53 +++++++++++++++ src/shaders/cs_rotation.comp | 53 +++++++++++++++
src/wlserver.cpp | 5 ++ src/wlserver.cpp | 5 ++
8 files changed, 208 insertions(+), 19 deletions(-) 8 files changed, 216 insertions(+), 19 deletions(-)
create mode 100644 src/shaders/cs_rotation.comp create mode 100644 src/shaders/cs_rotation.comp
diff --git a/src/Backends/DRMBackend.cpp b/src/Backends/DRMBackend.cpp diff --git a/src/Backends/DRMBackend.cpp b/src/Backends/DRMBackend.cpp
index 6bb0b88..506963d 100644 index 6bb0b88..2fbc090 100644
--- a/src/Backends/DRMBackend.cpp --- a/src/Backends/DRMBackend.cpp
+++ b/src/Backends/DRMBackend.cpp +++ b/src/Backends/DRMBackend.cpp
@@ -1752,7 +1752,7 @@ LiftoffStateCacheEntry FrameInfoToLiftoffStateCacheEntry( struct drm_t *drm, con @@ -56,6 +56,8 @@
static constexpr bool k_bUseCursorPlane = false;
+bool l_bEnableRotationShader = false;
+
extern int g_nPreferredOutputWidth;
extern int g_nPreferredOutputHeight;
@@ -1528,6 +1530,10 @@ static void update_drm_effective_orientations( struct drm_t *drm, const drmModeM
if ( pDRMInternalConnector != drm->pConnector )
pInternalMode = find_mode( pDRMInternalConnector->GetModeConnector(), 0, 0, 0 );
+ if ( g_bUseRotationShader ) {
+ l_bEnableRotationShader = true;
+ }
+
pDRMInternalConnector->UpdateEffectiveOrientation( pInternalMode );
}
@@ -1539,6 +1545,10 @@ static void update_drm_effective_orientations( struct drm_t *drm, const drmModeM
if ( pDRMExternalConnector != drm->pConnector )
pExternalMode = find_mode( pDRMExternalConnector->GetModeConnector(), 0, 0, 0 );
+ if ( g_bUseRotationShader ) {
+ l_bEnableRotationShader = false;
+ }
+
pDRMExternalConnector->UpdateEffectiveOrientation( pExternalMode );
}
}
@@ -1752,7 +1762,7 @@ LiftoffStateCacheEntry FrameInfoToLiftoffStateCacheEntry( struct drm_t *drm, con
uint64_t crtcW = srcWidth / frameInfo->layers[ i ].scale.x; uint64_t crtcW = srcWidth / frameInfo->layers[ i ].scale.x;
uint64_t crtcH = srcHeight / frameInfo->layers[ i ].scale.y; uint64_t crtcH = srcHeight / frameInfo->layers[ i ].scale.y;
- if (g_bRotated) - if (g_bRotated)
+ if (g_bRotated && !g_bUseRotationShader) + if (g_bRotated && !l_bEnableRotationShader)
{ {
int64_t imageH = frameInfo->layers[ i ].tex->contentHeight() / frameInfo->layers[ i ].scale.y; int64_t imageH = frameInfo->layers[ i ].tex->contentHeight() / frameInfo->layers[ i ].scale.y;
@@ -2045,6 +2045,17 @@ namespace gamescope @@ -2045,6 +2055,17 @@ namespace gamescope
void CDRMConnector::UpdateEffectiveOrientation( const drmModeModeInfo *pMode ) void CDRMConnector::UpdateEffectiveOrientation( const drmModeModeInfo *pMode )
{ {
+ if (g_bUseRotationShader) + if (l_bEnableRotationShader)
+ { + {
+ drm_log.infof("Using rotation shader"); + drm_log.infof("Using rotation shader");
+ if (g_DesiredInternalOrientation == GAMESCOPE_PANEL_ORIENTATION_270) { + if (g_DesiredInternalOrientation == GAMESCOPE_PANEL_ORIENTATION_270) {
@ -1206,27 +1237,25 @@ index 6bb0b88..506963d 100644
if ( this->GetScreenType() == GAMESCOPE_SCREEN_TYPE_INTERNAL && g_DesiredInternalOrientation != GAMESCOPE_PANEL_ORIENTATION_AUTO ) if ( this->GetScreenType() == GAMESCOPE_SCREEN_TYPE_INTERNAL && g_DesiredInternalOrientation != GAMESCOPE_PANEL_ORIENTATION_AUTO )
{ {
m_ChosenOrientation = g_DesiredInternalOrientation; m_ChosenOrientation = g_DesiredInternalOrientation;
@@ -3035,6 +3046,15 @@ bool drm_set_mode( struct drm_t *drm, const drmModeModeInfo *mode ) @@ -3035,6 +3056,13 @@ bool drm_set_mode( struct drm_t *drm, const drmModeModeInfo *mode )
g_bRotated = false; g_bRotated = false;
g_nOutputWidth = mode->hdisplay; g_nOutputWidth = mode->hdisplay;
g_nOutputHeight = mode->vdisplay; g_nOutputHeight = mode->vdisplay;
+ +
+ if (g_bUseRotationShader && drm->pConnector->GetScreenType() == gamescope::GAMESCOPE_SCREEN_TYPE_INTERNAL) { + if (l_bEnableRotationShader) {
+ g_bRotated = true; + g_bRotated = true;
+ g_nOutputWidth = mode->vdisplay; + g_nOutputWidth = mode->vdisplay;
+ g_nOutputHeight = mode->hdisplay; + g_nOutputHeight = mode->hdisplay;
+ } else {
+ g_bUseRotationShader = false;
+ } + }
+ +
break; break;
case GAMESCOPE_PANEL_ORIENTATION_90: case GAMESCOPE_PANEL_ORIENTATION_90:
case GAMESCOPE_PANEL_ORIENTATION_270: case GAMESCOPE_PANEL_ORIENTATION_270:
@@ -3294,6 +3314,11 @@ namespace gamescope @@ -3294,6 +3322,11 @@ namespace gamescope
bNeedsFullComposite |= !!(g_uCompositeDebug & CompositeDebugFlag::Heatmap); bNeedsFullComposite |= !!(g_uCompositeDebug & CompositeDebugFlag::Heatmap);
+ if (g_bUseRotationShader) + if (l_bEnableRotationShader)
+ { + {
+ bNeedsFullComposite = true; + bNeedsFullComposite = true;
+ } + }
@ -1234,12 +1263,12 @@ index 6bb0b88..506963d 100644
bool bDoComposite = true; bool bDoComposite = true;
if ( !bNeedsFullComposite && !bWantsPartialComposite ) if ( !bNeedsFullComposite && !bWantsPartialComposite )
{ {
@@ -3384,7 +3409,7 @@ namespace gamescope @@ -3384,7 +3417,7 @@ namespace gamescope
if ( bDefer && !!( g_uCompositeDebug & CompositeDebugFlag::Markers ) ) if ( bDefer && !!( g_uCompositeDebug & CompositeDebugFlag::Markers ) )
g_uCompositeDebug |= CompositeDebugFlag::Markers_Partial; g_uCompositeDebug |= CompositeDebugFlag::Markers_Partial;
- std::optional oCompositeResult = vulkan_composite( &compositeFrameInfo, nullptr, !bNeedsFullComposite ); - std::optional oCompositeResult = vulkan_composite( &compositeFrameInfo, nullptr, !bNeedsFullComposite );
+ std::optional oCompositeResult = vulkan_composite( &compositeFrameInfo, nullptr, !bNeedsFullComposite, nullptr, true, nullptr, g_bUseRotationShader ); + std::optional oCompositeResult = vulkan_composite( &compositeFrameInfo, nullptr, !bNeedsFullComposite, nullptr, true, nullptr, l_bEnableRotationShader );
m_bWasCompositing = true; m_bWasCompositing = true;
@ -1544,7 +1573,7 @@ index 54d7608..10d6c78 100644
if ( pPipewireTexture != nullptr ) if ( pPipewireTexture != nullptr )
diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp
index 00f5ece..8cffcbe 100644 index ccabd88..51a62bc 100644
--- a/src/rendervulkan.hpp --- a/src/rendervulkan.hpp
+++ b/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp
@@ -393,7 +393,7 @@ gamescope::OwningRc<CVulkanTexture> vulkan_create_texture_from_dmabuf( struct wl @@ -393,7 +393,7 @@ gamescope::OwningRc<CVulkanTexture> vulkan_create_texture_from_dmabuf( struct wl
@ -1556,7 +1585,7 @@ index 00f5ece..8cffcbe 100644
void vulkan_wait( uint64_t ulSeqNo, bool bReset ); void vulkan_wait( uint64_t ulSeqNo, bool bReset );
gamescope::Rc<CVulkanTexture> vulkan_get_last_output_image( bool partial, bool defer ); gamescope::Rc<CVulkanTexture> vulkan_get_last_output_image( bool partial, bool defer );
gamescope::Rc<CVulkanTexture> vulkan_acquire_screenshot_texture(uint32_t width, uint32_t height, bool exportable, uint32_t drmFormat, EStreamColorspace colorspace = k_EStreamColorspace_Unknown); gamescope::Rc<CVulkanTexture> vulkan_acquire_screenshot_texture(uint32_t width, uint32_t height, bool exportable, uint32_t drmFormat, EStreamColorspace colorspace = k_EStreamColorspace_Unknown);
@@ -530,6 +530,9 @@ struct VulkanOutput_t @@ -522,6 +522,9 @@ struct VulkanOutput_t
// NIS // NIS
gamescope::OwningRc<CVulkanTexture> nisScalerImage; gamescope::OwningRc<CVulkanTexture> nisScalerImage;
gamescope::OwningRc<CVulkanTexture> nisUsmImage; gamescope::OwningRc<CVulkanTexture> nisUsmImage;
@ -1566,7 +1595,7 @@ index 00f5ece..8cffcbe 100644
}; };
@@ -542,6 +545,7 @@ enum ShaderType { @@ -534,6 +537,7 @@ enum ShaderType {
SHADER_TYPE_RCAS, SHADER_TYPE_RCAS,
SHADER_TYPE_NIS, SHADER_TYPE_NIS,
SHADER_TYPE_RGB_TO_NV12, SHADER_TYPE_RGB_TO_NV12,
@ -1650,81 +1679,13 @@ index 1eeaa25..5aa986a 100644
*y = ty; *y = ty;
} }
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: brainantifreeze <you@example.com>
Date: Thu, 19 Dec 2024 09:16:15 +0000
Subject: fix(nvidia): allow disabling Vulkan extension for nvidia to work
This adds a workaround for #1592 which removes the
VkPhysicalDevicePresentWaitFeaturesKHR extension in
the layer if the environment variable
GAMESCOPE_WSI_HIDE_PRESENT_WAIT_EXT is set.
This resolves the current freezing issue on nVidia
in dx12 (without having to set
VKD3D_DISABLE_EXTENSIONS), dx11 (without having
to patch DXVK not to use the extension) and in
native vulkan games.
---
layer/VkLayer_FROG_gamescope_wsi.cpp | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/layer/VkLayer_FROG_gamescope_wsi.cpp b/layer/VkLayer_FROG_gamescope_wsi.cpp
index 718a260..f33da7f 100644
--- a/layer/VkLayer_FROG_gamescope_wsi.cpp
+++ b/layer/VkLayer_FROG_gamescope_wsi.cpp
@@ -183,6 +183,16 @@ namespace GamescopeWSILayer {
return s_ensureMinImageCount;
}
+ static bool getHidePresentWait() {
+ static bool s_hidePresentWait = []() -> bool {
+ if (auto hide = parseEnv<bool>("GAMESCOPE_WSI_HIDE_PRESENT_WAIT_EXT")) {
+ return *hide;
+ }
+ return false;
+ }();
+ return s_hidePresentWait;
+ }
+
// Taken from Mesa, licensed under MIT.
//
// No real reason to rewrite this code,
@@ -588,7 +598,11 @@ namespace GamescopeWSILayer {
createInfo.ppEnabledExtensionNames = enabledExts.data();
setenv("vk_xwayland_wait_ready", "false", 0);
- setenv("vk_khr_present_wait", "true", 0);
+ if (getHidePresentWait()) {
+ setenv("vk_khr_present_wait", "false", 0);
+ } else {
+ setenv("vk_khr_present_wait", "true", 0);
+ }
VkResult result = pfnCreateInstanceProc(&createInfo, pAllocator, pInstance);
if (result != VK_SUCCESS)
@@ -893,6 +907,10 @@ namespace GamescopeWSILayer {
const vkroots::VkInstanceDispatch* pDispatch,
VkPhysicalDevice physicalDevice,
VkPhysicalDeviceFeatures2* pFeatures) {
+ if (getHidePresentWait()) {
+ fprintf(stderr, "[Gamescope WSI] Removing VkPhysicalDevicePresentWaitFeaturesKHR because GAMESCOPE_WSI_HIDE_PRESENT_WAIT_EXT is set\n");
+ vkroots::RemoveFromChain<VkPhysicalDevicePresentWaitFeaturesKHR>(pFeatures);
+ }
pDispatch->GetPhysicalDeviceFeatures2(physicalDevice, pFeatures);
}
--
2.47.1
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: "Ruan E. Formigoni" <ruanformigoni@gmail.com> From: "Ruan E. Formigoni" <ruanformigoni@gmail.com>
Date: Thu, 2 Jan 2025 17:07:36 +0100 Date: Thu, 2 Jan 2025 17:07:36 +0100
Subject: feat: implemented bicubic downscaling Subject: feat: implement bicubic downscaling
From https://github.com/ValveSoftware/gamescope/pull/740 From https://github.com/ValveSoftware/gamescope/pull/740
--- ---
@ -1761,10 +1722,10 @@ index 97dea45..fefb2a0 100644
* `-S stretch`: use stretch scaling, the game will fill the window. (e.g. 4:3 to 16:9) * `-S stretch`: use stretch scaling, the game will fill the window. (e.g. 4:3 to 16:9)
* `-b`: create a border-less window. * `-b`: create a border-less window.
diff --git a/src/Backends/DRMBackend.cpp b/src/Backends/DRMBackend.cpp diff --git a/src/Backends/DRMBackend.cpp b/src/Backends/DRMBackend.cpp
index 506963d..98bdb71 100644 index 2fbc090..8bde9e9 100644
--- a/src/Backends/DRMBackend.cpp --- a/src/Backends/DRMBackend.cpp
+++ b/src/Backends/DRMBackend.cpp +++ b/src/Backends/DRMBackend.cpp
@@ -3293,6 +3293,7 @@ namespace gamescope @@ -3301,6 +3301,7 @@ namespace gamescope
bNeedsFullComposite |= bWasFirstFrame; bNeedsFullComposite |= bWasFirstFrame;
bNeedsFullComposite |= pFrameInfo->useFSRLayer0; bNeedsFullComposite |= pFrameInfo->useFSRLayer0;
bNeedsFullComposite |= pFrameInfo->useNISLayer0; bNeedsFullComposite |= pFrameInfo->useNISLayer0;
@ -1800,10 +1761,10 @@ index 6d50f8d..c24b864 100644
g_wantedUpscaleFilter = (g_wantedUpscaleFilter == GamescopeUpscaleFilter::FSR) ? g_wantedUpscaleFilter = (g_wantedUpscaleFilter == GamescopeUpscaleFilter::FSR) ?
GamescopeUpscaleFilter::LINEAR : GamescopeUpscaleFilter::FSR; GamescopeUpscaleFilter::LINEAR : GamescopeUpscaleFilter::FSR;
diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp
index f90c096..9f136dd 100644 index 3226400..7ae273f 100644
--- a/src/Backends/WaylandBackend.cpp --- a/src/Backends/WaylandBackend.cpp
+++ b/src/Backends/WaylandBackend.cpp +++ b/src/Backends/WaylandBackend.cpp
@@ -1624,6 +1624,7 @@ namespace gamescope @@ -1614,6 +1614,7 @@ namespace gamescope
bNeedsFullComposite |= cv_composite_force; bNeedsFullComposite |= cv_composite_force;
bNeedsFullComposite |= pFrameInfo->useFSRLayer0; bNeedsFullComposite |= pFrameInfo->useFSRLayer0;
bNeedsFullComposite |= pFrameInfo->useNISLayer0; bNeedsFullComposite |= pFrameInfo->useNISLayer0;
@ -2059,7 +2020,7 @@ index 10d6c78..8b31c1e 100644
uint32_t inputX = frameInfo->layers[0].tex->width(); uint32_t inputX = frameInfo->layers[0].tex->width();
uint32_t inputY = frameInfo->layers[0].tex->height(); uint32_t inputY = frameInfo->layers[0].tex->height();
diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp
index 8cffcbe..91e2af7 100644 index 51a62bc..eeb304c 100644
--- a/src/rendervulkan.hpp --- a/src/rendervulkan.hpp
+++ b/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp
@@ -270,6 +270,7 @@ struct FrameInfo_t @@ -270,6 +270,7 @@ struct FrameInfo_t
@ -2070,7 +2031,7 @@ index 8cffcbe..91e2af7 100644
bool bFadingOut; bool bFadingOut;
BlurMode blurLayer0; BlurMode blurLayer0;
int blurRadius; int blurRadius;
@@ -544,6 +545,7 @@ enum ShaderType { @@ -536,6 +537,7 @@ enum ShaderType {
SHADER_TYPE_EASU, SHADER_TYPE_EASU,
SHADER_TYPE_RCAS, SHADER_TYPE_RCAS,
SHADER_TYPE_NIS, SHADER_TYPE_NIS,
@ -2324,7 +2285,7 @@ index f2b8527..64cc1c9 100644
const int EOTF_Gamma22 = 0; const int EOTF_Gamma22 = 0;
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index 86773db..f88576f 100644 index dfee904..c2111d2 100644
--- a/src/steamcompmgr.cpp --- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp
@@ -906,6 +906,7 @@ gamescope::ConCommand cc_debug_set_fps_limit( "debug_set_fps_limit", "Set refres @@ -906,6 +906,7 @@ gamescope::ConCommand cc_debug_set_fps_limit( "debug_set_fps_limit", "Set refres
@ -2369,7 +2330,7 @@ index 86773db..f88576f 100644
} }
hasRepaint = true; hasRepaint = true;
} }
@@ -7023,6 +7033,7 @@ void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_ @@ -7017,6 +7027,7 @@ void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_
ctx->atoms.gamescopeLowLatency = XInternAtom( ctx->dpy, "GAMESCOPE_LOW_LATENCY", false ); ctx->atoms.gamescopeLowLatency = XInternAtom( ctx->dpy, "GAMESCOPE_LOW_LATENCY", false );
ctx->atoms.gamescopeFSRFeedback = XInternAtom( ctx->dpy, "GAMESCOPE_FSR_FEEDBACK", false ); ctx->atoms.gamescopeFSRFeedback = XInternAtom( ctx->dpy, "GAMESCOPE_FSR_FEEDBACK", false );
@ -2377,7 +2338,7 @@ index 86773db..f88576f 100644
ctx->atoms.gamescopeBlurMode = XInternAtom( ctx->dpy, "GAMESCOPE_BLUR_MODE", false ); ctx->atoms.gamescopeBlurMode = XInternAtom( ctx->dpy, "GAMESCOPE_BLUR_MODE", false );
ctx->atoms.gamescopeBlurRadius = XInternAtom( ctx->dpy, "GAMESCOPE_BLUR_RADIUS", false ); ctx->atoms.gamescopeBlurRadius = XInternAtom( ctx->dpy, "GAMESCOPE_BLUR_RADIUS", false );
@@ -7281,6 +7292,7 @@ extern int g_nPreferredOutputWidth; @@ -7275,6 +7286,7 @@ extern int g_nPreferredOutputWidth;
extern int g_nPreferredOutputHeight; extern int g_nPreferredOutputHeight;
static bool g_bWasFSRActive = false; static bool g_bWasFSRActive = false;
@ -2385,7 +2346,7 @@ index 86773db..f88576f 100644
bool g_bAppWantsHDRCached = false; bool g_bAppWantsHDRCached = false;
@@ -7695,6 +7707,16 @@ steamcompmgr_main(int argc, char **argv) @@ -7689,6 +7701,16 @@ steamcompmgr_main(int argc, char **argv)
flush_root = true; flush_root = true;
} }
@ -2402,7 +2363,7 @@ index 86773db..f88576f 100644
if (global_focus.IsDirty()) if (global_focus.IsDirty())
determine_and_apply_focus(); determine_and_apply_focus();
@@ -7931,6 +7953,7 @@ steamcompmgr_main(int argc, char **argv) @@ -7925,6 +7947,7 @@ steamcompmgr_main(int argc, char **argv)
g_bSteamIsActiveWindow = false; g_bSteamIsActiveWindow = false;
g_upscaleScaler = g_wantedUpscaleScaler; g_upscaleScaler = g_wantedUpscaleScaler;
g_upscaleFilter = g_wantedUpscaleFilter; g_upscaleFilter = g_wantedUpscaleFilter;
@ -2435,5 +2396,195 @@ index 2347cbb..bc38c98 100644
Atom gamescopeBlurMode; Atom gamescopeBlurMode;
Atom gamescopeBlurRadius; Atom gamescopeBlurRadius;
-- --
2.47.1 2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: brainantifreeze <you@example.com>
Date: Thu, 19 Dec 2024 09:16:15 +0000
Subject: fix(nvidia): allow disabling Vulkan extension for nvidia to work
This adds a workaround for #1592 which removes the
VkPhysicalDevicePresentWaitFeaturesKHR extension in
the layer if the environment variable
GAMESCOPE_WSI_HIDE_PRESENT_WAIT_EXT is set.
This resolves the current freezing issue on nVidia
in dx12 (without having to set
VKD3D_DISABLE_EXTENSIONS), dx11 (without having
to patch DXVK not to use the extension) and in
native vulkan games.
---
layer/VkLayer_FROG_gamescope_wsi.cpp | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/layer/VkLayer_FROG_gamescope_wsi.cpp b/layer/VkLayer_FROG_gamescope_wsi.cpp
index c817880..407dae8 100644
--- a/layer/VkLayer_FROG_gamescope_wsi.cpp
+++ b/layer/VkLayer_FROG_gamescope_wsi.cpp
@@ -496,7 +496,11 @@ namespace GamescopeWSILayer {
createInfo.ppEnabledExtensionNames = enabledExts.data();
setenv("vk_xwayland_wait_ready", "false", 0);
- setenv("vk_khr_present_wait", "true", 0);
+ if (getHidePresentWait()) {
+ setenv("vk_khr_present_wait", "false", 0);
+ } else {
+ setenv("vk_khr_present_wait", "true", 0);
+ }
VkResult result = pfnCreateInstanceProc(&createInfo, pAllocator, pInstance);
if (result != VK_SUCCESS)
@@ -801,6 +805,10 @@ namespace GamescopeWSILayer {
const vkroots::VkInstanceDispatch* pDispatch,
VkPhysicalDevice physicalDevice,
VkPhysicalDeviceFeatures2* pFeatures) {
+ if (getHidePresentWait()) {
+ fprintf(stderr, "[Gamescope WSI] Removing VkPhysicalDevicePresentWaitFeaturesKHR because GAMESCOPE_WSI_HIDE_PRESENT_WAIT_EXT is set\n");
+ vkroots::RemoveFromChain<VkPhysicalDevicePresentWaitFeaturesKHR>(pFeatures);
+ }
pDispatch->GetPhysicalDeviceFeatures2(physicalDevice, pFeatures);
}
@@ -1015,6 +1023,16 @@ namespace GamescopeWSILayer {
return value;
}
+ static bool getHidePresentWait() {
+ static bool s_hidePresentWait = []() -> bool {
+ if (auto hide = parseEnv<uint32_t>("GAMESCOPE_WSI_HIDE_PRESENT_WAIT_EXT")) {
+ return *hide == 1;
+ }
+ return false;
+ }();
+ return s_hidePresentWait;
+ }
+
static uint32_t getMinImageCount() {
static uint32_t s_minImageCount = []() -> uint32_t {
if (auto minCount = parseEnv<uint32_t>("GAMESCOPE_WSI_MIN_IMAGE_COUNT")) {
--
2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Matthew Schwartz <matthew.schwartz@linux.dev>
Date: Sat, 14 Dec 2024 20:54:57 -0800
Subject: WaylandBackend: Fix hotkeys failing to bind on Wayland desktops
Per Wayland protocol specsheet regarding keymapping:
"From version 7 onwards, the fd must be mapped with MAP_PRIVATE by the
recipient, as MAP_SHARED may fail."
This matches up exactly with what we're seeing with this error:
[gamescope] [Error] xdg_backend: Failed to map keymap fd.
Changing MAP_SHARED to MAP_PRIVATE per the spec addresses this error.
Fixes: #1658
(hopefully) fixes: #1637
---
src/Backends/WaylandBackend.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp
index 7ae273f..0a3657f 100644
--- a/src/Backends/WaylandBackend.cpp
+++ b/src/Backends/WaylandBackend.cpp
@@ -2709,7 +2709,7 @@ namespace gamescope
defer( close( nFd ) );
assert( uFormat == WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1 );
- char *pMap = (char *)mmap( nullptr, uSize, PROT_READ, MAP_SHARED, nFd, 0 );
+ char *pMap = (char *)mmap( nullptr, uSize, PROT_READ, MAP_PRIVATE, nFd, 0 );
if ( !pMap || pMap == MAP_FAILED )
{
xdg_log.errorf( "Failed to map keymap fd." );
--
2.48.0
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Antheas Kapenekakis <git@antheas.dev>
Date: Sun, 19 Jan 2025 17:52:28 +0100
Subject: feat: add legion go s display (works only with VRR on)
---
.../displays/lenovo.legiongos.lcd.lua | 64 +++++++++++++++++++
1 file changed, 64 insertions(+)
create mode 100644 scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua
diff --git a/scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua b/scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua
new file mode 100644
index 0000000..e522b38
--- /dev/null
+++ b/scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua
@@ -0,0 +1,64 @@
+gamescope.config.known_displays.legiongos_lcd = {
+ pretty_name = "Lenovo Legion Go S LCD",
+ hdr = {
+ -- Setup some fallbacks for undocking with HDR, meant
+ -- for the internal panel. It does not support HDR.
+ supported = false,
+ force_enabled = false,
+ eotf = gamescope.eotf.gamma22,
+ max_content_light_level = 500,
+ max_frame_average_luminance = 500,
+ min_content_light_level = 0.5
+ },
+
+ dynamic_refresh_rates = {
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
+ 118, 119, 120
+ },
+
+ -- Detailed Timing Descriptors:
+ -- DTD 1: 1920x1200 120.002 Hz 8:5 151.683 kHz 315.500 MHz (172 mm x 107 mm)
+ -- Modeline "1920x1200_120.00" 315.500 1920 1968 2000 2080 1200 1254 1260 1264 -HSync -VSync
+ -- DTD 2: 1920x1200 60.001 Hz 8:5 75.841 kHz 157.750 MHz (172 mm x 107 mm)
+ -- Modeline "1920x1200_60.00" 157.750 1920 1968 2000 2080 1200 1254 1260 1264 -HSync -VSync
+ dynamic_modegen = function(base_mode, refresh)
+ debug("Generating mode "..refresh.."Hz with fixed pixel clock")
+ local vfps = {
+ 1950, 1885, 1824, 1764, 1707, 1652, 1599, 1548, 1499, 1451, 1405,
+ 1361, 1318, 1277, 1237, 1198, 1160, 1124, 1088, 1054, 1021, 988,
+ 957, 927, 897, 868, 840, 813, 786, 760, 735, 710, 686, 663, 640,
+ 618, 596, 575, 554, 534, 514, 495, 476, 457, 439, 421, 404, 387,
+ 370, 354, 338, 322, 307, 292, 277, 263, 249, 235, 221, 208, 195,
+ 182, 169, 157, 145, 133, 121, 109, 98, 87, 76, 65, 54
+ }
+ local vfp = vfps[zero_index(refresh - 48)]
+ if vfp == nil then
+ warn("Couldn't do refresh "..refresh.." on ROG Ally")
+ return base_mode
+ end
+
+ local mode = base_mode
+
+ gamescope.modegen.adjust_front_porch(mode, vfp)
+ mode.vrefresh = gamescope.modegen.calc_vrefresh(mode)
+
+ --debug(inspect(mode))
+ return mode
+ end,
+
+
+ matches = function(display)
+ if display.vendor == "CSW" and display.model == "PN8007QB1-1" then
+ debug("[legos_lcd] Matched vendor: "..display.vendor.." model: "..display.model.." product:"..display.product)
+ return 5000
+ end
+ return -1
+ end
+}
+debug("Registered Lenovo Legion Go S LCD as a known display")
\ No newline at end of file
--
2.48.0