From aac6b04f39717f7363071f5500a89bb33e01cb33 Mon Sep 17 00:00:00 2001 From: Antheas Kapenekakis Date: Sat, 15 Mar 2025 16:39:08 +0100 Subject: [PATCH 1/9] [BEGIN] SteamOS Changes -- 2.49.0 From 9fc35e8c53fe7e6c84b7da9ddff3d528f22ea4a9 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Fri, 14 Jan 2022 15:58:45 +0100 Subject: [PATCH 2/9] STEAMOS: radv: min image count override for FH5 Otherwise in combination with the vblank time reservation in gamescope the game could get stuck in low power states. --- src/util/00-radv-defaults.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index aef8b9006cd..2a6b0ec84a4 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -223,5 +223,9 @@ Application bugs worked around in this file: + + + -- 2.49.0 From 09299a2cf516078ce9ed9786a49ea6f957ac6527 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 22 Feb 2024 22:32:45 +0100 Subject: [PATCH 3/9] STEAMOS: Dynamic swapchain override for gamescope limiter for DRI3 only The original patch (from Bas) contained WSI VK support too but it's been removed because the Gamescope WSI layer already handles that. Signed-off-by: Samuel Pitoiset --- .../frontends/dri/loader_dri3_helper.c | 42 ++++++++++++++++++- .../frontends/dri/loader_dri3_helper.h | 1 + 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/gallium/frontends/dri/loader_dri3_helper.c b/src/gallium/frontends/dri/loader_dri3_helper.c index 37970f4fa33..f200f2063a2 100644 --- a/src/gallium/frontends/dri/loader_dri3_helper.c +++ b/src/gallium/frontends/dri/loader_dri3_helper.c @@ -297,6 +297,30 @@ dri3_update_max_num_back(struct loader_dri3_drawable *draw) } } +static unsigned +gamescope_swapchain_override() +{ + const char *path = getenv("GAMESCOPE_LIMITER_FILE"); + if (!path) + return 0; + + static simple_mtx_t mtx = SIMPLE_MTX_INITIALIZER; + static int fd = -1; + + simple_mtx_lock(&mtx); + if (fd < 0) { + fd = open(path, O_RDONLY); + } + simple_mtx_unlock(&mtx); + + if (fd < 0) + return 0; + + uint32_t override_value = 0; + pread(fd, &override_value, sizeof(override_value), 0); + return override_value; +} + void loader_dri3_set_swap_interval(struct loader_dri3_drawable *draw, int interval) { @@ -311,10 +335,12 @@ loader_dri3_set_swap_interval(struct loader_dri3_drawable *draw, int interval) * PS. changing from value A to B and A < B won't cause swap out of order but * may still gets wrong target_msc value at the beginning. */ - if (draw->swap_interval != interval) + if (draw->orig_swap_interval != interval) loader_dri3_swapbuffer_barrier(draw); - draw->swap_interval = interval; + draw->orig_swap_interval = interval; + if (gamescope_swapchain_override() != 1) + draw->swap_interval = interval; } static void @@ -443,6 +469,12 @@ loader_dri3_drawable_init(xcb_connection_t *conn, draw->swap_interval = dri_get_initial_swap_interval(draw->dri_screen_render_gpu); + draw->orig_swap_interval = draw->swap_interval; + + unsigned gamescope_override = gamescope_swapchain_override(); + if (gamescope_override == 1) + draw->swap_interval = 1; + dri3_update_max_num_back(draw); /* Create a new drawable */ @@ -1085,6 +1117,12 @@ loader_dri3_swap_buffers_msc(struct loader_dri3_drawable *draw, if (draw->type == LOADER_DRI3_DRAWABLE_WINDOW) { dri3_fence_reset(draw->conn, back); + unsigned gamescope_override = gamescope_swapchain_override(); + if (gamescope_override == 1) + draw->swap_interval = 1; + else + draw->swap_interval = draw->orig_swap_interval; + /* Compute when we want the frame shown by taking the last known * successful MSC and adding in a swap interval for each outstanding swap * request. target_msc=divisor=remainder=0 means "Use glXSwapBuffers() diff --git a/src/gallium/frontends/dri/loader_dri3_helper.h b/src/gallium/frontends/dri/loader_dri3_helper.h index 4da19d73090..819a0e548fc 100644 --- a/src/gallium/frontends/dri/loader_dri3_helper.h +++ b/src/gallium/frontends/dri/loader_dri3_helper.h @@ -170,6 +170,7 @@ struct loader_dri3_drawable { bool block_on_depleted_buffers; bool queries_buffer_age; int swap_interval; + int orig_swap_interval; const struct loader_dri3_vtable *vtable; -- 2.49.0 From d89154279b50afa429848b84624530f9e8771853 Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Sun, 11 May 2025 13:30:57 -0700 Subject: [PATCH 4/9] STEAMOS: Fixes for DOOM: The Dark Ages --- src/util/00-radv-defaults.conf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index 2a6b0ec84a4..b28d9215b59 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -123,6 +123,13 @@ Application bugs worked around in this file: