#2419 (fence wait covers every part of a split submission) costs about 9 fps on NVIDIA at 4K: 60 → 51 in Hyrule Field #2628
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
question
testing wanted
wontfix
No milestone
No assignees
2 participants
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Hookshot#2628
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Since #2419, a scene that held 60 fps on an RTX 4080 SUPER at 4K runs at about 51. A bisect of main lands on that commit as one clean step, and restoring the old behaviour of those lines brings 60 back.
#2419 fixes real corruption on GPUs with no VRAM mirror of the buffer pools, so I'm not asking for a revert. Could the full wait apply only where the pools are read in place (no mirror), and the earlier return stay where they are mirrored?
Measurements
Hyrule Field (child, standing still, then turning the camera), 4K output, 3D at 100%, the game's own upscaler, frame generation off, 60 cap, windowed. Game frames from the log's
vi: N frames presentedlines; one run each.bebb0c64(#2420, the commit before)e0dbf40c(#2419)6f7ab2a76f7ab2a7,value_reckeeps the first part's recording againKokiri Forest on
6f7ab2a7: 47-49 standing, where it was 58 on v2.1.0.GPU time stays about 3 ms a frame in the slow runs, so the time goes to the game's thread waiting, not to GPU load.
Bisect
First-parent commits of d7a73062..6f7ab2a7 (141), seven steps, each a build and one run on an otherwise idle machine (no other GPU programs; 1.4-2.0 GB of VRAM in use by the desktop):
7759a6f3(#2195)4a53c897(#2429)6c8c1bfb(#2378)bebb0c64(#2420)e0dbf40c(#2419)b4f755d6(#2416)4b5266a0(#2291)The change tested
In
submit_recording(gpu/vk/vk_replay.cpp), behind a local switch, the value's recording is left at the first part's, asemplacedid before:I saw no corruption in the field run with it, but I only looked at that one scene. The PR's description says the damage comes from later parts reading guest memory in place; with the pools mirrored they read the mirror, which is why I think the early return is safe there. I have not verified that for every path (the exposure readback wait in particular).
Setup
RX_VK_PARALLEL=3in all the runs above.RX_VK_PARALLEL=0) the loss is larger:6f7ab2a7gives 42.0 standing and 45.8 turning in the same scene. Yesterday's main (0ffc004) held 58.6-59.4 there with it off; I have not rerun the commit before #2419 with it off.The mirrored-pool readback wait is now handled by #2602, merged into main after the revisions in your table. It keeps the full wait where in-place GPU readers require it rather than reverting #2419. Could you repeat your 4K case on a build containing #2602, with the normal safety settings, and share the log?