Repository navigation
Gamescope payload 20261031.2: FPS limiter on the vblank time grid, shim gate census - #2297
Conversation
Payload 20261030.3 with bin/gamescope replaced by the CI build of GameNative/gamescope PR #22 (A52, merge commit 8636e40 of b46a355); everything else byte-identical. Gamescope's non-VRR FPS limiter counted compositor wakeups on the 1200 Hz session grid, and a wakeup more than one tick late skipped ticks that were never counted, so a 60 cap read 54 on the Retroid Pocket 6 with the CPU and GPU idle. The limiter now releases frames on a time grid (previous release plus the target period): 60.0 fps at a 60 cap on the same device. sha256 2b8998691633dc2de3256f9bc24fb937633e564105e19f32d5d62ec5e4fed148
|
Caution Review failedThe pull request is closed. No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
Payload version app/src/main/java/app/gamenative/display/GamescopePayload.kt |
GamescopePayload.VERSION changes from 20261030.3 to 20261031.1. |
Estimated code review effort: 1 (Trivial) | ~3 minutes
Change: Bug fix
Possibly related PRs
- utkarshdalal/GameNative#2220: Adds the Gamescope FPS-limit control path and session refresh-grid argument through
GamescopeCommandQueueandGamescopeSettings.
Suggested reviewers: joshuatam
Merge Risk: 
Minimal · previous review 0b367
-
The payload version update is mergeable with no identified correctness or availability risk.
Pre-merge checks: 
5
-
Full details: Docstring Coverage
-
Explanation
No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 0 functions across 1 files.
Full details: Title check
-
Explanation
The title names the payload version (20261031.2), the FPS limiter change on the vblank time grid, and the shim gate census. It matches the main change in the PR, but the changeset itself is only a one-line VERSION bump in GamescopePayload.kt. The title describes the intent of the payload that the PR points to, so it is related to the change, though it is not a direct match for the single-line diff. The version number in the title (20261031.2) also differs from the code change (20261031.1), which is a mismatch the reviewer should resolve.
Full details: Description check
-
Explanation
The description follows the template sections (Description, Recording, Type of Change, Checklist) and gives a detailed rationale, a verification table, a payload size, and a SHA-256 hash. The Recording section says None, and the recording checkbox is unchecked, which the template asks for. The Checklist marks the Recording item unchecked, and the Type of Change lists both Bug fix and Performance / stability improvement. The description also states the payload is a hand-assembled build, not a packager build, and it refers to a payload version (20261031.2) that differs from the one in the code change (20261031.1). The description and the objectives also list different SHA-256 values for the payload, which should be reconciled.
Resolution
Resolve the mismatch between the payload version in the description (20261031.2) and the version in the code change (20261031.1). Reconcile the SHA-256 value in the description with the value in the PR objectives. Confirm the recording decision, because the template asks for a recording and the description says None.
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
…im gate census Payload 20261030.3 with bin/gamescope from GameNative/gamescope ad78177 (A52, merged #22; byte-identical to the #22 CI build, same tree) and lib/libadrenotools_gamescope.so from GameNative/gamenative-drm 52ed43f (merged #35: VK_KHR_xcb_surface served, acquire-gate census); everything else byte-identical. sha256 fd3deaaee7560ef3ce53303a13eb77be31c4473cd26ea17771bd925d07d3347d
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).bin/gamescopegamenative@ ad78177, A52 merged as #22; the binary is the #22 CI build (its merge commit has the same tree)lib/libadrenotools_gamescope.somaster@ 52ed43f, #35 merged:VK_KHR_xcb_surfaceserved, 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.
With the #35 shim's new census: Dave the Diver at 30
gate_holds=2992of 3041 acquires, Blazing Chrome at 30gate_holds=1676of 1681 withacq_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, ondownloads.gamenative.appand 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
Checklist
#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.CONTRIBUTING.md.