Gamescope payload 20261031.2: FPS limiter on the vblank time grid, shim gate census

Merged
UT
10d ago
+1-1

Description

Points the app at payload gamescope-gamenative-20261031.2.tzst: the shipped 20261030.3 payload with two members replaced, everything else byte-identical (1014 members).

memberfrom
bin/gamescopeGameNative/gamescope gamenative @ ad78177, A52 merged as #22; the binary is the #22 CI build (its merge commit has the same tree)
lib/libadrenotools_gamescope.soGameNative/gamenative-drm master @ 52ed43f, #35 merged: VK_KHR_xcb_surface served, acquire-gate census (cap=[… gate_holds= acq_fps=])

The daemon (jniLibs/libgamenative_drm.so) is unchanged: #35 touches only the ICD shim.

What it fixes. Under gamescope a game is capped in one of two places. A game with a Vulkan swapchain on the shim (DXVK, vkd3d) is held at acquire, exactly. A game without one, which on the shipped stack is every OpenGL game (the container's libGL is Mesa's xlib target presenting with XShmPutImage), is capped only by gamescope's own limiter, which released a frame on every Nth compositor wakeup on the 1200 Hz session grid and lost the wakeups that came late. On a Retroid Pocket 6 that is about 10 % of ticks: a 60 cap read 54 with the CPU and GPU idle, uncapped the same game ran at 330. The limiter now keeps a release grid in time (A52).

Verified on the Retroid Pocket 6 (8 Gen 2 / Adreno 740, Android 13, 120 Hz panel), 30 s per run counted at SurfaceFlinger; the on-screen counter agreed in every run.

gamepathcapshipped 20261030.3this payload's gamescope
SteamWorld Dig 2 (GL via zink)no shim swapchain6054.5 / 54.5 / 53.7 (60 Hz)60.0 / 59.9 / 59.7 (60 Hz) / 59.99 (CI binary)
Dave the Diver (DXVK)shim acquire gate3030.01 / 30.0029.99
Blazing Chrome (DXVK)shim acquire gate6059.8 / 59.560.0

With the #35 shim's new census: Dave the Diver at 30 gate_holds=2992 of 3041 acquires, Blazing Chrome at 30 gate_holds=1676 of 1681 with acq_fps=30.79; SteamWorld Dig 2 prints no cap line at all (no swapchain on the shim), which is why the gamescope-side limiter stays armed. The shim in this payload (52ed43f) is the #35 head (e311cba) plus docs only; the Rust sources are identical, so the device-tested behaviour is the shipped behaviour.

Payload size 14294213, sha256 fd3deaaee7560ef3ce53303a13eb77be31c4473cd26ea17771bd925d07d3347d, on downloads.gamenative.app and the r2.dev fallback (both re-downloaded and checked). Hand-assembled from the merge commits with the testbed repack script, not a packager build.

Recording

None: an FPS counter change. Screenshots with the on-screen counter (54.0 shipped, 60.0 fixed) are in the gamescope #22 notes.

Type of Change

  • Bug fix
  • Performance / stability improvement
  • Compatibility improvements
  • Other (requires prior approval)

Checklist

  • If I have access to #code-changes, I have discussed this change there and it has been green-lighted. If I do not have access, I have still provided clear context in this PR. If I skip both, I accept that this change may face delays in review, may not be reviewed at all, or may be closed.
  • This change aligns with the current project scope (core functionality, stability, or performance). If not, it has been explicitly approved beforehand.
  • I have attached a recording of the change.
  • I have read and agree to the contribution guidelines in CONTRIBUTING.md.