docs(tested): the committed play profile on a Steam Deck OLED, on the compute path: about 10% fewer instructions a frame #591

Open
p0lux wants to merge 1 commit from p0lux/Longshot:docs/tested-play-profile-deck into main
Contributor

Type: docs · Risk: low · Tested on: Linux (SteamOS), Steam Deck OLED (RADV VANGOGH) · Needs: none

Why

The renderer's play profile (#569) was recorded and measured on an RTX 3090 with mesh shaders, and assets/profiles/README.md lists the compute fallback as not yet covered. A Steam Deck draws its mesh programs through that fallback, so nobody knew whether the committed profile helps there or costs. It helps, by more than on the 3090: this adds the run that says so.

What changed

One run file, no code: main built without the play profile and with the committed one, on a Steam Deck OLED.

  • docs: docs/tested/2026-11-14-play-profile-deck-p0lux-run01.md (new), the run's row in the format of docs/tested/README.md.

Measurements

Verdict: the committed profile helps on a Steam Deck: 9.8% fewer instructions and 12.8% fewer cycles a frame on the replay thread, 4.4 ms less replay, 28.5 to 31.5 fps in a heavy view.

Baseline: both columns are main @ 414f56e2, the back end built alone with the same flags; the only difference is RX_VK_PGO=<the committed profile, unpacked> for the second. This PR adds no code, so main against this PR would compare a build with itself. Main is at 25726217 now: assets/profiles/longshot_vk.profdata.xz is the same file there, and the record is of the commit it names.
Hardware: SteamOS 3.9.5 (kernel 7.2.7-valve2), Steam Deck OLED: AMD Custom APU 0932 (4 cores, 8 threads), RADV VANGOGH, Mesa 26.2.0-devel, 16 GB shared with the GPU; the GPU's clock fixed at 1600 MHz
Scene: a heavy view from a save, standing still, about 2,150 draws a frame; no screen (headless), handheld profile, Minimum preset, the game's own upscaler, no frame generation, no cap; no mesh shaders (vk: no mesh shaders: task and mesh programs run as compute shaders), no VRAM mirrors
Method: the game and host built from main 9c9d69ed; the back end built alone from main 414f56e2 (nothing under gpu/ differs from 9c9d69ed) with the Linux builder's clang (LLVM 23.1.5), and swapped in that game folder. Each run starts the game, loads the save by script, waits 3 log windows, then measures 720 presents: fps by the clock, the log's replay time, the render thread's user-space cycles and instructions a frame (perf stat -t). Two runs each after a warm-up start, alternated with two other renderers, the second round in the reverse order; the median of two is their mean. No per-frame log in these runs, so no p99 or 1% low.
How to reproduce: build the back end twice from one commit, with and without RX_VK_PGO=<file>, and run the same save with each

Before: main @ 414f56e2, no play profile After: main @ 414f56e2, the committed play profile Δ
fps 28.54 (28.62 / 28.46) 31.49 (30.68 / 32.30; 31.11 at the warm-up) +2.95
replay a frame 31.15 ms (31.12 / 31.17) 26.75 ms (26.99 / 26.50; 26.49) -4.40 ms
render thread: instructions a frame 62.19 M (62.38 / 61.99) 56.12 M (56.19 / 56.04; 56.13) -9.8%
render thread: cycles a frame 78.96 M (79.15 / 78.77) 68.88 M (68.99 / 68.76; 68.23) -12.8%
no profile   2400 presents, 27.4 fps; a frame: 2167 draws (0 skipped), 144 dispatches, 194 passes, 163 barriers, 6 submits
no profile   2280 presents, 26.5 fps; a frame: 2158 draws (0 skipped), 144 dispatches, 193 passes, 163 barriers, 6 submits
profile      2280 presents, 29.8 fps; a frame: 2153 draws (0 skipped), 143 dispatches, 193 passes, 160 barriers, 6 submits
profile      2400 presents, 31.1 fps; a frame: 2156 draws (0 skipped), 139 dispatches, 193 passes, 154 barriers, 6 submits
build log    the Vulkan back end: built with the profile /home/deck/.cache/bench/longshot_vk.shipped.profdata

Read with care. One machine, one scene, two runs each. The fps of two runs of one renderer differ by up to 1.6 here; the instruction counts repeat within 0.6%, and they are what the profile changes. Other scenes were not measured for this record.

Flags and settings

None.

Testing

Tested:

  • python -I -B tests/test_tested_configurations.py: 24 of its 25 checks pass, the new file among them; the 25th (test_cli_output_file_is_utf8_and_stdout_stays_empty) fails the same way on main on this machine (Python 3.9 has no newline argument to Path.write_text).
  • In the game, a Steam Deck OLED, without a screen: the 5 starts above, no error, no device lost, 0 GPU timeouts in the kernel's log; a renderer built with the profile reads the shaders prepared for one built without (47,797 program keys kept).

Not tested: other scenes, other hardware, Windows: this is one record of one machine.

Must be tested:
None.

Risks

What could break: nothing: one documentation file.

Turning it off: revert the commit.

Compatibility: Nothing changes.

Issues

See #402

Checklist

Everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description) of the status line's type.
  • Why gives the reason plainly and links the issues that fit (the tracker searched).
  • Measurements has a verdict, or one line saying why there is nothing to measure.
  • Testing names what was tested, what wasn't, and what must still be tested, where and how.
  • Rebased on current main.
  • python -I -B tests/run_all.py passes (any failure that also fails on main is named).
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

When it applies

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • Numbers from the same PC, scene and settings, at least 2 interleaved runs each, the median reported.
  • A file in docs/tested/ for each new measured run (format in docs/tested-configurations.md).
  • Docs updated.
**Type:** docs · **Risk:** low · **Tested on:** Linux (SteamOS), Steam Deck OLED (RADV VANGOGH) · **Needs:** none ## Why The renderer's play profile (#569) was recorded and measured on an RTX 3090 with mesh shaders, and `assets/profiles/README.md` lists the compute fallback as not yet covered. A Steam Deck draws its mesh programs through that fallback, so nobody knew whether the committed profile helps there or costs. It helps, by more than on the 3090: this adds the run that says so. ## What changed One run file, no code: main built without the play profile and with the committed one, on a Steam Deck OLED. - docs: `docs/tested/2026-11-14-play-profile-deck-p0lux-run01.md` (new), the run's row in the format of `docs/tested/README.md`. ## Measurements **Verdict:** the committed profile helps on a Steam Deck: 9.8% fewer instructions and 12.8% fewer cycles a frame on the replay thread, 4.4 ms less replay, 28.5 to 31.5 fps in a heavy view. Baseline: both columns are main @ 414f56e2, the back end built alone with the same flags; the only difference is `RX_VK_PGO=<the committed profile, unpacked>` for the second. This PR adds no code, so main against this PR would compare a build with itself. Main is at 25726217 now: `assets/profiles/longshot_vk.profdata.xz` is the same file there, and the record is of the commit it names. Hardware: SteamOS 3.9.5 (kernel 7.2.7-valve2), Steam Deck OLED: AMD Custom APU 0932 (4 cores, 8 threads), RADV VANGOGH, Mesa 26.2.0-devel, 16 GB shared with the GPU; the GPU's clock fixed at 1600 MHz Scene: a heavy view from a save, standing still, about 2,150 draws a frame; no screen (headless), handheld profile, Minimum preset, the game's own upscaler, no frame generation, no cap; no mesh shaders (`vk: no mesh shaders: task and mesh programs run as compute shaders`), no VRAM mirrors Method: the game and host built from main 9c9d69ed; the back end built alone from main 414f56e2 (nothing under `gpu/` differs from 9c9d69ed) with the Linux builder's clang (LLVM 23.1.5), and swapped in that game folder. Each run starts the game, loads the save by script, waits 3 log windows, then measures 720 presents: fps by the clock, the log's replay time, the render thread's user-space cycles and instructions a frame (`perf stat -t`). Two runs each after a warm-up start, alternated with two other renderers, the second round in the reverse order; the median of two is their mean. No per-frame log in these runs, so no p99 or 1% low. How to reproduce: build the back end twice from one commit, with and without `RX_VK_PGO=<file>`, and run the same save with each | | Before: main @ 414f56e2, no play profile | After: main @ 414f56e2, the committed play profile | Δ | |---|---|---|---| | fps | 28.54 (28.62 / 28.46) | 31.49 (30.68 / 32.30; 31.11 at the warm-up) | +2.95 | | replay a frame | 31.15 ms (31.12 / 31.17) | 26.75 ms (26.99 / 26.50; 26.49) | -4.40 ms | | render thread: instructions a frame | 62.19 M (62.38 / 61.99) | 56.12 M (56.19 / 56.04; 56.13) | -9.8% | | render thread: cycles a frame | 78.96 M (79.15 / 78.77) | 68.88 M (68.99 / 68.76; 68.23) | -12.8% | ``` no profile 2400 presents, 27.4 fps; a frame: 2167 draws (0 skipped), 144 dispatches, 194 passes, 163 barriers, 6 submits no profile 2280 presents, 26.5 fps; a frame: 2158 draws (0 skipped), 144 dispatches, 193 passes, 163 barriers, 6 submits profile 2280 presents, 29.8 fps; a frame: 2153 draws (0 skipped), 143 dispatches, 193 passes, 160 barriers, 6 submits profile 2400 presents, 31.1 fps; a frame: 2156 draws (0 skipped), 139 dispatches, 193 passes, 154 barriers, 6 submits build log the Vulkan back end: built with the profile /home/deck/.cache/bench/longshot_vk.shipped.profdata ``` Read with care. One machine, one scene, two runs each. The fps of two runs of one renderer differ by up to 1.6 here; the instruction counts repeat within 0.6%, and they are what the profile changes. Other scenes were not measured for this record. ### Flags and settings None. ## Testing **Tested:** - `python -I -B tests/test_tested_configurations.py`: 24 of its 25 checks pass, the new file among them; the 25th (`test_cli_output_file_is_utf8_and_stdout_stays_empty`) fails the same way on main on this machine (Python 3.9 has no `newline` argument to `Path.write_text`). - In the game, a Steam Deck OLED, without a screen: the 5 starts above, no error, no device lost, 0 GPU timeouts in the kernel's log; a renderer built with the profile reads the shaders prepared for one built without (47,797 program keys kept). **Not tested:** other scenes, other hardware, Windows: this is one record of one machine. **Must be tested:** None. ## Risks **What could break:** nothing: one documentation file. **Turning it off:** revert the commit. **Compatibility:** Nothing changes. ## Issues See #402 ## Checklist ### Everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`) of the status line's type. - [x] Why gives the reason plainly and links the issues that fit (the tracker searched). - [x] Measurements has a verdict, or one line saying why there is nothing to measure. - [x] Testing names what was tested, what wasn't, and what must still be tested, where and how. - [x] Rebased on current `main`. - [x] `python -I -B tests/run_all.py` passes (any failure that also fails on `main` is named). - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### When it applies - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] Numbers from the same PC, scene and settings, at least 2 interleaved runs each, the median reported. - [x] A file in `docs/tested/` for each new measured run (format in `docs/tested-configurations.md`). - [x] Docs updated.
docs(tested): the committed play profile on a Steam Deck OLED, on the compute path
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
beanstalk/approval Test farm not requested
Website / Website on Cloudflare (pull_request_target) Has been skipped
5edb0e4985
Main 414f56e2 built without the play profile and with the committed one, a heavy view, 2 runs each, alternated: about 10% fewer instructions and 13% fewer cycles a frame on the replay thread, 28.5 to 31.5 fps. The profile was recorded on a GPU with mesh shaders; a Steam Deck runs task and mesh programs as compute shaders.

Assisted-by: Claude Fable 5.2

Co-Authored-By: Claude Fable 5.2 <[email protected]>
p0lux changed title from WIP: docs(tested): the committed play profile on a Steam Deck OLED, on the compute path: about 10% fewer instructions a frame to docs(tested): the committed play profile on a Steam Deck OLED, on the compute path: about 10% fewer instructions a frame 2026-11-14 21:34:17 +00:00
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
beanstalk/approval Test farm not requested
Website / Website on Cloudflare (pull_request_target) Has been skipped
This pull request doesn't have enough approvals yet. 0 of 1 approvals granted.
Some workflows are waiting to be reviewed.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'docs/tested-play-profile-deck:p0lux-docs/tested-play-profile-deck'
git switch 'p0lux-docs/tested-play-profile-deck'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Longshot!591
No description provided.