docs: Hookshot #2789 measured against Kokiri camera turns on a 9800X3D / RTX 4070 Ti #16

Open
TrashPanda wants to merge 1 commit from TrashPanda/Longshot:docs/kokiri-turn-2789 into main
Contributor

Why

Camera turns in Kokiri Forest stutter (the worklist's 2.1 row), and the row's next step was to remove the CPU's wait for the GPU in take_capture. Hookshot #2789 removes it; measured on a fast PC it does not help, because that wait is already 0 ms there. This PR records that result and points the row at the PCs where the wait may show. It changes no code.

What changed

  • docs/tested-configurations.md: one row for the A/B of Hookshot #2789 below.
  • docs/worklist.md: the Kokiri camera-turn row now says what Hookshot #2789 does and that it changes nothing on a 9800X3D / RTX 4070 Ti; its next step is the same A/B on a PC where the wait shows (the reporter's 14700KF, a Steam Deck), and finding the 20-26 ms frames on fast PCs. Hookshot PR numbers there are full links.

Flags and settings

None. (RX_VK_CAPTURE_GPU_LATE belongs to Hookshot #2789, not to this PR; it is only named as the switch the runs used.)

Measurements

main: 012dfc51 (2026-11-12)
with Hookshot #2789: ed5c6549, applied on main 012dfc51
Hardware: RTX 4070 Ti 12 GB, NVIDIA 595.99.02, Ryzen 7 9800X3D, 32 GB, Ubuntu 26.04.1 (kernel 7.0)
Scene: Kokiri Forest, the test save's spawn point; headless, the test folder's settings, 60 fps cap
Method: one build, main 012dfc51 with Hookshot #2789 (ed5c6549) applied. One warm-up run, then 4 runs alternating RX_VK_CAPTURE_GPU_LATE=0, =1, =0, =1. Each run: 600 settled frames, then 1,800 frames turning the camera right (scripted input). Numbers are from RX_VK_FRAME_LOG over the turning window only; each cell is the median of the 2 runs, with the two runs in brackets.
How to reproduce: build the renderer from main 012dfc51 with Hookshot #2789 applied; start at the test save's spawn point in Kokiri Forest with RX_VK_FRAME_LOG set; run with RX_VK_CAPTURE_GPU_LATE=0 and =1 alternately; read the turning window's frame times and the vk: a capture taken line.

Baseline: main @ 012dfc51 (its wait, via RX_VK_CAPTURE_GPU_LATE=0)
Why not main's own binary: with its switch off, Hookshot #2789 takes main's path (the CPU waits for the GPU before the late pages are read), so one binary toggled run to run gives the same comparison without build-to-build differences.

main @ 012dfc51 (its wait, via RX_VK_CAPTURE_GPU_LATE=0) with Hookshot #2789 @ ed5c6549 (RX_VK_CAPTURE_GPU_LATE=1) Δ
mean frame time 16.67 ms (16.67, 16.67) 16.67 ms (16.67, 16.67) 0
1% low 47.0 fps (46.6, 47.4) 47.7 fps (47.2, 48.2) +0.7 fps (+1.5%), less than the spread between two runs of the same setting (0.8 and 1.0 fps)
frames over 20 ms, of 1,804 22.5 (22, 23) 21.5 (23, 20) -1
frames over 33 ms 0 (0, 0) 0 (0, 0) 0
worst frame 24.6 ms (25.5, 23.7) 24.3 ms (26.3, 22.2) -0.3 ms
take_capture's GPU wait 0.000 ms (it waited in 0 and 1 of 600 takes) 0.000 ms (0 of 600 takes) 0
=0: vk: a capture taken (ms): all 0.004; late pages copied on the GPU 0.000 (0 of 600 takes), GPU wait for them 0.000 (1 takes), ...
=1: vk: a capture taken (ms): all 0.004; late pages copied on the GPU 0.000 (0 of 600 takes), GPU wait for them 0.000 (0 takes), ...

Result: on this PC Hookshot #2789 does not help. Every difference is within run-to-run noise, and the reason is in the last row: the wait it removes is already 0 ms here, so there is nothing for it to take away. Whether it helps on a slower PC (the 14700KF from the report, a Steam Deck), where the wait may not be 0, is not measured. The same numbers are on the Hookshot PR: https://github.com/NotRexed/Hookshot/pull/2789#issuecomment-6838492536

The PR is now rebased onto main fbd42024; the numbers still hold, since they describe the build at 012dfc51 named above and this PR changes no code.

Testing

Tested: the A/B above, in the game: Kokiri Forest, RTX 4070 Ti / NVIDIA 595.99.02 / Ryzen 7 9800X3D / Ubuntu 26.04.1, headless with scripted input, 2 interleaved runs each way after a warm-up. After the rebase onto fbd42024, python -I -B tests/run_all.py --jobs 4 on Linux: 498 passed, 1 failed, 30 skipped; the failure is test_lift_cache (the lift scripts' imports on this PC), which fails on main too. This PR is docs only.

Not tested: Hookshot #2789's newer head (c898b45d); any PC where the wait shows: a slower CPU such as the reporter's 14700KF, a Steam Deck, Windows, AMD or Intel GPUs. Until one is measured, nothing says Hookshot #2789 helps anywhere.

Needs other testers: None for this PR's own change (two lines of docs). The A/B on a slower PC tests Hookshot #2789 itself, and is the worklist row's next step; the ask for the GPU wait for them figure is on the Hookshot PR.

Screenshots

Nothing on screen.

Risk and rollback

Docs only: nothing in the game or the build changes. The risk is a reader taking "no gain on a 9800X3D" for "no gain anywhere"; the row and the worklist line say which PC it was and what is still to measure. Reverting the commit undoes it.

Reviewer notes

The answer to "has this been tested and shown to actually help": tested, yes; helps, no, not on this PC (details under Measurements).

Issues

See https://github.com/NotRexed/Hookshot/pull/2789 (Hookshot).

Checklist

For everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description).
  • Rebased on current main (fbd42024).
  • python -I -B tests/run_all.py run and passing (any failure that also fails on main is named above).
  • Tested in the game, or what wasn't is named under Testing.
  • Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests).
  • Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. (Here main's wait against Hookshot #2789, in one build at main 012dfc51; this PR itself is docs.)
  • 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.

If applicable

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • A row in docs/tested-configurations.md for each measured run.
  • Docs updated.
## Why Camera turns in Kokiri Forest stutter (the worklist's 2.1 row), and the row's next step was to remove the CPU's wait for the GPU in `take_capture`. [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) removes it; measured on a fast PC it does not help, because that wait is already 0 ms there. This PR records that result and points the row at the PCs where the wait may show. It changes no code. ## What changed - `docs/tested-configurations.md`: one row for the A/B of [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) below. - `docs/worklist.md`: the Kokiri camera-turn row now says what [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) does and that it changes nothing on a 9800X3D / RTX 4070 Ti; its next step is the same A/B on a PC where the wait shows (the reporter's 14700KF, a Steam Deck), and finding the 20-26 ms frames on fast PCs. Hookshot PR numbers there are full links. ## Flags and settings None. (`RX_VK_CAPTURE_GPU_LATE` belongs to [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789), not to this PR; it is only named as the switch the runs used.) ## Measurements main: 012dfc51 (2026-11-12) with [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789): ed5c6549, applied on main 012dfc51 Hardware: RTX 4070 Ti 12 GB, NVIDIA 595.99.02, Ryzen 7 9800X3D, 32 GB, Ubuntu 26.04.1 (kernel 7.0) Scene: Kokiri Forest, the test save's spawn point; headless, the test folder's settings, 60 fps cap Method: one build, main 012dfc51 with [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) (ed5c6549) applied. One warm-up run, then 4 runs alternating `RX_VK_CAPTURE_GPU_LATE=0`, `=1`, `=0`, `=1`. Each run: 600 settled frames, then 1,800 frames turning the camera right (scripted input). Numbers are from `RX_VK_FRAME_LOG` over the turning window only; each cell is the median of the 2 runs, with the two runs in brackets. How to reproduce: build the renderer from main 012dfc51 with [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) applied; start at the test save's spawn point in Kokiri Forest with `RX_VK_FRAME_LOG` set; run with `RX_VK_CAPTURE_GPU_LATE=0` and `=1` alternately; read the turning window's frame times and the `vk: a capture taken` line. Baseline: main @ 012dfc51 (its wait, via `RX_VK_CAPTURE_GPU_LATE=0`) Why not main's own binary: with its switch off, [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) takes main's path (the CPU waits for the GPU before the late pages are read), so one binary toggled run to run gives the same comparison without build-to-build differences. | | main @ 012dfc51 (its wait, via `RX_VK_CAPTURE_GPU_LATE=0`) | with [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) @ ed5c6549 (`RX_VK_CAPTURE_GPU_LATE=1`) | Δ | |---|---|---|---| | mean frame time | 16.67 ms (16.67, 16.67) | 16.67 ms (16.67, 16.67) | 0 | | 1% low | 47.0 fps (46.6, 47.4) | 47.7 fps (47.2, 48.2) | +0.7 fps (+1.5%), less than the spread between two runs of the same setting (0.8 and 1.0 fps) | | frames over 20 ms, of 1,804 | 22.5 (22, 23) | 21.5 (23, 20) | -1 | | frames over 33 ms | 0 (0, 0) | 0 (0, 0) | 0 | | worst frame | 24.6 ms (25.5, 23.7) | 24.3 ms (26.3, 22.2) | -0.3 ms | | `take_capture`'s GPU wait | 0.000 ms (it waited in 0 and 1 of 600 takes) | 0.000 ms (0 of 600 takes) | 0 | ``` =0: vk: a capture taken (ms): all 0.004; late pages copied on the GPU 0.000 (0 of 600 takes), GPU wait for them 0.000 (1 takes), ... =1: vk: a capture taken (ms): all 0.004; late pages copied on the GPU 0.000 (0 of 600 takes), GPU wait for them 0.000 (0 takes), ... ``` Result: on this PC [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) does not help. Every difference is within run-to-run noise, and the reason is in the last row: the wait it removes is already 0 ms here, so there is nothing for it to take away. Whether it helps on a slower PC (the 14700KF from the report, a Steam Deck), where the wait may not be 0, is not measured. The same numbers are on the Hookshot PR: https://github.com/NotRexed/Hookshot/pull/2789#issuecomment-6838492536 The PR is now rebased onto main fbd42024; the numbers still hold, since they describe the build at 012dfc51 named above and this PR changes no code. ## Testing **Tested:** the A/B above, in the game: Kokiri Forest, RTX 4070 Ti / NVIDIA 595.99.02 / Ryzen 7 9800X3D / Ubuntu 26.04.1, headless with scripted input, 2 interleaved runs each way after a warm-up. After the rebase onto fbd42024, `python -I -B tests/run_all.py --jobs 4` on Linux: 498 passed, 1 failed, 30 skipped; the failure is `test_lift_cache` (the lift scripts' imports on this PC), which fails on main too. This PR is docs only. **Not tested:** [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789)'s newer head (c898b45d); any PC where the wait shows: a slower CPU such as the reporter's 14700KF, a Steam Deck, Windows, AMD or Intel GPUs. Until one is measured, nothing says [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) helps anywhere. **Needs other testers:** None for this PR's own change (two lines of docs). The A/B on a slower PC tests [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) itself, and is the worklist row's next step; the ask for the `GPU wait for them` figure is on the Hookshot PR. ## Screenshots Nothing on screen. ## Risk and rollback Docs only: nothing in the game or the build changes. The risk is a reader taking "no gain on a 9800X3D" for "no gain anywhere"; the row and the worklist line say which PC it was and what is still to measure. Reverting the commit undoes it. ## Reviewer notes The answer to "has this been tested and shown to actually help": tested, yes; helps, no, not on this PC (details under Measurements). ## Issues See https://github.com/NotRexed/Hookshot/pull/2789 (Hookshot). ## Checklist ### For everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`). - [x] Rebased on current `main` (fbd42024). - [x] `python -I -B tests/run_all.py` run and passing (any failure that also fails on `main` is named above). - [x] Tested in the game, or what wasn't is named under Testing. - [x] Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests). - [x] Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. (Here main's wait against [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789), in one build at main 012dfc51; this PR itself is docs.) - [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. ### If applicable - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] A row in `docs/tested-configurations.md` for each measured run. - [x] Docs updated.
Owner

Has this been tested and shown to actually help

Has this been tested and shown to actually help
Owner

@TrashPanda use the new issue template please!

@TrashPanda use the new issue template please!
Author
Contributor

@hckrman101 It's tested, and it shows the opposite: on this PC #2789 doesn't help, because the wait it removes is already 0 ms (0 of 600 frames wait). That's what this PR records. It changes no code: it adds the measurement and moves the Kokiri row's next step to a PC where the wait does show. 2 runs each way, interleaved: 1% low 47.0 vs 47.7 fps, frames over 20 ms 22.5 vs 21.5, within noise. The description now follows the new template, with the full table and log lines. I also merged main in.

@hckrman101 It's tested, and it shows the opposite: on this PC #2789 doesn't help, because the wait it removes is already 0 ms (0 of 600 frames wait). That's what this PR records. It changes no code: it adds the measurement and moves the Kokiri row's next step to a PC where the wait does show. 2 runs each way, interleaved: 1% low 47.0 vs 47.7 fps, frames over 20 ms 22.5 vs 21.5, within noise. The description now follows the new template, with the full table and log lines. I also merged main in.
Author
Contributor

Main (dd02c6cc) merged in again, no force-push: docs/tested-configurations.md conflicted only because both sides added rows; main's rows are kept first and this PR's row follows. The PR's diff is still the one row and the one worklist line.

python -I -B tests/run_all.py on the merge (Linux, CachyOS): 457 passed, 2 failed, 63 skipped. Both failures fail on main too: test_display_pointer (fixed by #187) and test_lift_cache (this PC's lift imports).

Main (dd02c6cc) merged in again, no force-push: `docs/tested-configurations.md` conflicted only because both sides added rows; main's rows are kept first and this PR's row follows. The PR's diff is still the one row and the one worklist line. `python -I -B tests/run_all.py` on the merge (Linux, CachyOS): 457 passed, 2 failed, 63 skipped. Both failures fail on main too: `test_display_pointer` (fixed by #187) and `test_lift_cache` (this PC's lift imports).
TrashPanda force-pushed docs/kokiri-turn-2789 from 15cab92351
Some checks failed
PR description / Description follows the template (pull_request_target) Failing after 3s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
Website / Website on Cloudflare (pull_request) Has been cancelled
to d20db112bb
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 2s
Website / Website on Cloudflare (pull_request_target) Has been skipped
2026-11-13 18:02:54 +00:00
Compare
Author
Contributor

@HumanBean, to your two points (my earlier reply went to the wrong handle, sorry):

Has this been tested and shown to actually help

Tested: yes. Shown to help: no. On a 9800X3D / RTX 4070 Ti, Hookshot #2789 makes no difference we can measure in Kokiri Forest camera turns. That is 2 runs each way, interleaved after a warm-up, with 1,800 turning frames per run, in one build with the switch off (main's wait) and on:

  • 1% low: 47.0 fps without it, 47.7 fps with it (+1.5%). Two runs of the same setting differ by 0.8-1.0 fps, so that is noise.
  • Frames over 20 ms: 22.5 without it, 21.5 with it. Worst frame: 24.6 ms against 24.3 ms. Mean: 16.67 ms both. Nothing over 33 ms either way.
  • The reason is that the wait it removes is already 0.000 ms on this PC: it happened in 0-1 of 600 frames. There is nothing for it to take away here.

Whether it helps where the wait is not zero (the reporter's 14700KF, a Steam Deck) is still unmeasured, so this PR doesn't claim it helps anywhere. It records the result and makes that A/B the worklist row's next step.

use the new template please

Done. The description now follows .forgejo/pull_request_template.md in full, with Flags and settings, Testing and Risk and rollback. The measurement columns are named by commit (main @ 012dfc51 against Hookshot #2789 @ ed5c6549), and every For everyone box is there. scripts/check_pr_description.py passes on it.

Also:

  • Rebased onto main fbd42024 and force-pushed with lease. The two merge commits are gone, and the head is d20db112. The docs/tested-configurations.md conflict kept all of main's rows, with this PR's row after them.
  • Hookshot PR numbers in the docs and the description are now full links.
  • python -I -B tests/run_all.py --jobs 4 on the rebase (Linux): 498 passed, 1 failed (test_lift_cache, which fails on main too), 30 skipped.
@HumanBean, to your two points (my earlier reply went to the wrong handle, sorry): > Has this been tested and shown to actually help Tested: yes. Shown to help: no. On a 9800X3D / RTX 4070 Ti, [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) makes no difference we can measure in Kokiri Forest camera turns. That is 2 runs each way, interleaved after a warm-up, with 1,800 turning frames per run, in one build with the switch off (main's wait) and on: - 1% low: 47.0 fps without it, 47.7 fps with it (+1.5%). Two runs of the *same* setting differ by 0.8-1.0 fps, so that is noise. - Frames over 20 ms: 22.5 without it, 21.5 with it. Worst frame: 24.6 ms against 24.3 ms. Mean: 16.67 ms both. Nothing over 33 ms either way. - The reason is that the wait it removes is already 0.000 ms on this PC: it happened in 0-1 of 600 frames. There is nothing for it to take away here. Whether it helps where the wait is not zero (the reporter's 14700KF, a Steam Deck) is still unmeasured, so this PR doesn't claim it helps anywhere. It records the result and makes that A/B the worklist row's next step. > use the new template please Done. The description now follows `.forgejo/pull_request_template.md` in full, with Flags and settings, Testing and Risk and rollback. The measurement columns are named by commit (main @ 012dfc51 against [Hookshot #2789](https://github.com/NotRexed/Hookshot/pull/2789) @ ed5c6549), and every For everyone box is there. `scripts/check_pr_description.py` passes on it. Also: - Rebased onto main fbd42024 and force-pushed with lease. The two merge commits are gone, and the head is d20db112. The `docs/tested-configurations.md` conflict kept all of main's rows, with this PR's row after them. - Hookshot PR numbers in the docs and the description are now full links. - `python -I -B tests/run_all.py --jobs 4` on the rebase (Linux): 498 passed, 1 failed (`test_lift_cache`, which fails on main too), 30 skipped.
TrashPanda changed title from docs: #2789 measured against Kokiri camera turns on a 9800X3D / RTX 4070 Ti to docs: Hookshot #2789 measured against Kokiri camera turns on a 9800X3D / RTX 4070 Ti 2026-11-13 18:05:24 +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 2s
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/kokiri-turn-2789:TrashPanda-docs/kokiri-turn-2789'
git switch 'TrashPanda-docs/kokiri-turn-2789'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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!16
No description provided.