Skip to content

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

Merged
utkarshdalal merged 2 commits into
masterfrom
gamescope-payload-20261031-1
Oct 31, 2026
Merged

utkarshdalal merged 2 commits into
masterfrom
gamescope-payload-20261031-1

Conversation

@utkarshdalal

@utkarshdalal utkarshdalal commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

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).

member from
bin/gamescope GameNative/gamescope gamenative @ ad78177, A52 merged as #22; the binary is the #22 CI build (its merge commit has the same tree)
lib/libadrenotools_gamescope.so GameNative/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.

game path cap shipped 20261030.3 this payload's gamescope
SteamWorld Dig 2 (GL via zink) no shim swapchain 60 54.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 gate 30 30.01 / 30.00 29.99
Blazing Chrome (DXVK) shim acquire gate 60 59.8 / 59.5 60.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.

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
@coderabbitai

coderabbitai Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Caution

Review failed

The pull request is closed.

No actionable comments were generated in the recent review.

Recent review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 70e23123-1505-4e97-bc6a-725f6de61c62
Commits

Reviewing files that changed from the base of the PR and between 8cfa78c and 0b36761.

Files selected for processing: 1
  • app/src/main/java/app/gamenative/display/GamescopePayload.kt

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.

Walkthrough

GamescopePayload.VERSION changes from 20261030.3 to 20261031.1.

Changes: Gamescope payload

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 GamescopeCommandQueue and GamescopeSettings.

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: Passed 5
Check name Status Explanation
Docstring Coverage Passed 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. Documentat…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed 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…
Description check Passed 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 Recordin…
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.

Share

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 1 file

View guided diff | Turn on auto-fix | Re-trigger cubic

…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
@utkarshdalal utkarshdalal changed the title Gamescope payload 20261031.1 (test): FPS limiter on the vblank time grid Gamescope payload 20261031.2: FPS limiter on the vblank time grid, shim gate census Oct 31, 2026
@utkarshdalal
utkarshdalal merged commit 4c04e42 into master Oct 31, 2026
3 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request Oct 31, 2026
2 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant