Skip to content

Commit 097eec1

Browse files
authored
Merge pull request #3 from OpenGamingCollective/25.3.4
Merge into main to use tags
2 parents 2a43b5e + 2bef3d9 commit 097eec1

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

limiter.patch

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
commit c170b87e4d9753e35b8a57f53d3fe8af949d24c5
2+
Author: Samuel Pitoiset <samuel.pitoiset@gmail.com>
3+
Date: Thu Feb 22 22:32:45 2024 +0100
4+
5+
STEAMOS: Dynamic swapchain override for gamescope limiter for DRI3 only
6+
7+
The original patch (from Bas) contained WSI VK support too but it's
8+
been removed because the Gamescope WSI layer already handles that.
9+
10+
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
11+
12+
diff --git a/src/gallium/frontends/dri/loader_dri3_helper.c b/src/gallium/frontends/dri/loader_dri3_helper.c
13+
index c5f80000862..96bb4062d89 100644
14+
--- a/src/gallium/frontends/dri/loader_dri3_helper.c
15+
+++ b/src/gallium/frontends/dri/loader_dri3_helper.c
16+
@@ -297,6 +297,30 @@ dri3_update_max_num_back(struct loader_dri3_drawable *draw)
17+
}
18+
}
19+
20+
+static unsigned
21+
+gamescope_swapchain_override()
22+
+{
23+
+ const char *path = getenv("GAMESCOPE_LIMITER_FILE");
24+
+ if (!path)
25+
+ return 0;
26+
+
27+
+ static simple_mtx_t mtx = SIMPLE_MTX_INITIALIZER;
28+
+ static int fd = -1;
29+
+
30+
+ simple_mtx_lock(&mtx);
31+
+ if (fd < 0) {
32+
+ fd = open(path, O_RDONLY);
33+
+ }
34+
+ simple_mtx_unlock(&mtx);
35+
+
36+
+ if (fd < 0)
37+
+ return 0;
38+
+
39+
+ uint32_t override_value = 0;
40+
+ pread(fd, &override_value, sizeof(override_value), 0);
41+
+ return override_value;
42+
+}
43+
+
44+
void
45+
loader_dri3_set_swap_interval(struct loader_dri3_drawable *draw, int interval)
46+
{
47+
@@ -311,10 +335,12 @@ loader_dri3_set_swap_interval(struct loader_dri3_drawable *draw, int interval)
48+
* PS. changing from value A to B and A < B won't cause swap out of order but
49+
* may still gets wrong target_msc value at the beginning.
50+
*/
51+
- if (draw->swap_interval != interval)
52+
+ if (draw->orig_swap_interval != interval)
53+
loader_dri3_swapbuffer_barrier(draw);
54+
55+
- draw->swap_interval = interval;
56+
+ draw->orig_swap_interval = interval;
57+
+ if (gamescope_swapchain_override() != 1)
58+
+ draw->swap_interval = interval;
59+
}
60+
61+
static void
62+
@@ -443,6 +469,12 @@ loader_dri3_drawable_init(xcb_connection_t *conn,
63+
64+
draw->swap_interval = dri_get_initial_swap_interval(draw->dri_screen_render_gpu);
65+
66+
+ draw->orig_swap_interval = draw->swap_interval;
67+
+
68+
+ unsigned gamescope_override = gamescope_swapchain_override();
69+
+ if (gamescope_override == 1)
70+
+ draw->swap_interval = 1;
71+
+
72+
dri3_update_max_num_back(draw);
73+
74+
/* Create a new drawable */
75+
@@ -1085,6 +1117,12 @@ loader_dri3_swap_buffers_msc(struct loader_dri3_drawable *draw,
76+
if (draw->type == LOADER_DRI3_DRAWABLE_WINDOW) {
77+
dri3_fence_reset(draw->conn, back);
78+
79+
+ unsigned gamescope_override = gamescope_swapchain_override();
80+
+ if (gamescope_override == 1)
81+
+ draw->swap_interval = 1;
82+
+ else
83+
+ draw->swap_interval = draw->orig_swap_interval;
84+
+
85+
/* Compute when we want the frame shown by taking the last known
86+
* successful MSC and adding in a swap interval for each outstanding swap
87+
* request. target_msc=divisor=remainder=0 means "Use glXSwapBuffers()
88+
diff --git a/src/gallium/frontends/dri/loader_dri3_helper.h b/src/gallium/frontends/dri/loader_dri3_helper.h
89+
index 26f138d1b83..3f0f3f66fac 100644
90+
--- a/src/gallium/frontends/dri/loader_dri3_helper.h
91+
+++ b/src/gallium/frontends/dri/loader_dri3_helper.h
92+
@@ -169,6 +169,7 @@ struct loader_dri3_drawable {
93+
bool block_on_depleted_buffers;
94+
bool queries_buffer_age;
95+
int swap_interval;
96+
+ int orig_swap_interval;
97+
98+
const struct loader_dri3_vtable *vtable;
99+

radv-defaults.patch

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
From 04afaf13b208f5c58c0b057f3dfc2dfa5c19a334 Mon Sep 17 00:00:00 2001
2+
From: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
3+
Date: Fri, 14 Jan 2022 15:58:45 +0100
4+
Subject: STEAMOS: radv: min image count override for FH5
5+
6+
Otherwise in combination with the vblank time reservation in
7+
gamescope the game could get stuck in low power states.
8+
---
9+
src/util/00-radv-defaults.conf | 4 ++++
10+
1 file changed, 4 insertions(+)
11+
12+
diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf
13+
index 1cbb2e087c9..43488ada6bc 100644
14+
--- a/src/util/00-radv-defaults.conf
15+
+++ b/src/util/00-radv-defaults.conf
16+
@@ -311,5 +311,9 @@ Application bugs worked around in this file:
17+
<application name="No Man's Sky" application_name_match="No Man's Sky">
18+
<option name="radv_app_layer" value="no_mans_sky" />
19+
</application>
20+
+
21+
+ <application name="Forza Horizon 5" application_name_match="ForzaHorizon5.exe">
22+
+ <option name="vk_x11_override_min_image_count" value="4" />
23+
+ </application>
24+
</device>
25+
</driconf>
26+
--
27+
2.42.0

0 commit comments

Comments
 (0)