|
| 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 | + |
0 commit comments