perf(vk): 6 GB cards mirror a quarter of the card (1536 MB), on Auto and on the Low preset #2834

Open
github-sync wants to merge 3 commits from github/pr/2834 into main
Owner

@i12bp8 opened this pull request on GitHub · 2026-11-12 15:53 UTC · original

6 GB cards (the RTX 3060 Laptop, 2060, 1660 and the like) start on the Low preset, whose 512 MB of mirrors leaves most of the game's memory pools out of VRAM: the GPU reads them over PCIe, 30-32 GB of bound ranges every 600 submits in Hyrule Field on an RTX 3060 Laptop. This gives those cards a quarter of the card, 1536 MB, on Low and on Auto alike: in Castle Town Market 20 → 22.4 fps, GPU 32 → 25 ms a frame, half the frames over 50 ms.

What changed

  • The VRAM budget row's 3.6 GB step mirrors 1536 MB, not 512 (gpu/vk/vk_menu.cpp). It is the Low (6GB) preset's, which menu_first_start_for_gpu gives every dedicated card of 4.5-6.5 GB.
  • Auto agrees (gpu/vk/mirror_budget.h, auto_bytes, used by mirror_budget in vk_memory.cpp): cards over 4.5 GB and up to 6.5 GB get a quarter (1536 MB on 6 GB; it was an eighth, 768). Cards of 4.5 GB or less keep an eighth (512 MB on 4 GB), larger ones a quarter up to 3 GB as before. The eighth on 6 GB cards was there because the image blocks made at the start sat empty beside the mirrors; since #2711 they are made in the textures' pool.
  • A preset's mirrors never pass Auto's on the card (preset_bytes, when a Quality preset set the budgets): Low on a 4 GB card, which preset_caps_memory lets through, or Minimum with the row moved to 3.6 GB, stays at 512. A budget chosen on the VRAM budget row itself stays the player's on any card (#1859).
  • tests/test_mirror_budget.py runs the rules and checks that mirror_budget uses them; tests/test_vram_budget_row.py has Low's 1536. docs/development.md says what RX_VK_MIRROR_MB defaults to.

Tested

Windows 11, RTX 3060 Laptop 6 GB (5.0-5.1 GB allowed), NVIDIA 621.14, Ryzen 7 6800HS, 16 GB. The first start's Low (6GB) budget, DLSS (1152x648 → 1536x864), Reflex on, Game speed Per frame (HOS_REALTIME_STEP=0). No window (HOS_HEADLESS), input through the control bridge: the debug teleport, then standing with the camera turning for 60 s. A = 51da0464 + #2711, B = that + this; both renderers built with llvm-mingw (RX_VK_ONLY, RX_RELEASE=1, NVIDIA DLSS). main's own renderer (API 20, a new translator stamp) does not run against this PC's game and program cache, so the base is the installed build's plus #2711. Two runs each, in turn:

A B
Castle Town Market fps 20.2, 20.1 22.5, 22.3
GPU ms a frame 31.4, 33.5 24.6, 25.2
frames over 50 ms 1252, 1287 571, 616
driver's count at most / allowed (MB) 4669 / 5096, 4671 / 5064 5039 / 5096, 5233 / 5099
textures' budget (held) 1.98 (2.25), 1.99 (2.31) GB 1.08 (1.86), 1.03 (1.90) GB
textures made again empty 0, 3 0, 3
Hyrule Field fps 28.8, 29.3 29.1, 32.3
GPU ms a frame 24.0, 23.5 21.0, 18.7
frames over 50 ms 165, 134 34, 148
driver's count at most / allowed (MB) 5469 / 5039, 5359 / 5039 4988 / 5097, 4982 / 5103
textures' budget (held) 2.67 (1.82), 3.00 (1.89) GB 0.87 (1.29), 0.88 (1.29) GB
textures made again empty 6, 4 11, 11

The cost is the textures' budget: about 1 GB in the market and under 0.9 GB in Hyrule Field, where twice as many textures were made again in 60 s (headless: not looked at on screen). Earlier, on a scripted walk (main before #2711, the preallocation off by switch): 1536 MB took ~0 GB over PCIe every 600 submits against 30-32 GB, GPU 27 → 19.5 ms; 1024 MB gave 26.5 and 31.3 fps with the budget full and which pools stayed out varying.

  • No device lost, no new error lines; the program cache kept (47866 keys).
  • python -I -B tests/run_all.py on Windows: 472 passed, 10 failed, 41 skipped. The same 10 fail on main on this PC (symlink privilege, dotnet restore, no gcc, and test_readme_menu_rows: the Skip opening row has no README line).
  • Rows in docs/tested-configurations.md.
  • Nothing on screen changes: no screenshots.

Not tested: another 6 GB card (a desktop one with a display attached has less allowed), AMD (GCN keeps its mirrors off) and Intel, Linux, 4 GB cards (the cap keeps them at 512).

Overlap

  • #2676 maps Balanced to the 3.6 GB step and edits tests/test_vram_budget_row.py's preset table and the kVramMirrorMb line: whichever lands second updates them. With both, Balanced on an 8 GB card mirrors 1536 MB (Auto gives it 2048).
  • #1377 (the hottest pools mirrored first) chooses which pools a full budget keeps.

🤖 Generated with Claude Code

> [@i12bp8](https://github.com/i12bp8) opened this pull request on GitHub · 2026-11-12 15:53 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2834) 6 GB cards (the RTX 3060 Laptop, 2060, 1660 and the like) start on the Low preset, whose 512 MB of mirrors leaves most of the game's memory pools out of VRAM: the GPU reads them over PCIe, 30-32 GB of bound ranges every 600 submits in Hyrule Field on an RTX 3060 Laptop. This gives those cards a quarter of the card, 1536 MB, on Low and on Auto alike: in Castle Town Market 20 → 22.4 fps, GPU 32 → 25 ms a frame, half the frames over 50 ms. ### What changed - **The VRAM budget row's 3.6 GB step mirrors 1536 MB, not 512** (`gpu/vk/vk_menu.cpp`). It is the Low (6GB) preset's, which `menu_first_start_for_gpu` gives every dedicated card of 4.5-6.5 GB. - **Auto agrees** (`gpu/vk/mirror_budget.h`, `auto_bytes`, used by `mirror_budget` in `vk_memory.cpp`): cards over 4.5 GB and up to 6.5 GB get a quarter (1536 MB on 6 GB; it was an eighth, 768). Cards of 4.5 GB or less keep an eighth (512 MB on 4 GB), larger ones a quarter up to 3 GB as before. The eighth on 6 GB cards was there because the image blocks made at the start sat empty beside the mirrors; since #2711 they are made in the textures' pool. - **A preset's mirrors never pass Auto's on the card** (`preset_bytes`, when a Quality preset set the budgets): Low on a 4 GB card, which `preset_caps_memory` lets through, or Minimum with the row moved to 3.6 GB, stays at 512. A budget chosen on the VRAM budget row itself stays the player's on any card (#1859). - `tests/test_mirror_budget.py` runs the rules and checks that `mirror_budget` uses them; `tests/test_vram_budget_row.py` has Low's 1536. `docs/development.md` says what `RX_VK_MIRROR_MB` defaults to. ### Tested Windows 11, RTX 3060 Laptop 6 GB (5.0-5.1 GB allowed), NVIDIA 621.14, Ryzen 7 6800HS, 16 GB. The first start's Low (6GB) budget, DLSS (1152x648 → 1536x864), Reflex on, Game speed Per frame (`HOS_REALTIME_STEP=0`). No window (`HOS_HEADLESS`), input through the control bridge: the debug teleport, then standing with the camera turning for 60 s. A = 51da0464 + #2711, B = that + this; both renderers built with llvm-mingw (`RX_VK_ONLY`, `RX_RELEASE=1`, NVIDIA DLSS). main's own renderer (API 20, a new translator stamp) does not run against this PC's game and program cache, so the base is the installed build's plus #2711. Two runs each, in turn: | | A | B | |---|---|---| | **Castle Town Market** fps | 20.2, 20.1 | 22.5, 22.3 | | GPU ms a frame | 31.4, 33.5 | 24.6, 25.2 | | frames over 50 ms | 1252, 1287 | 571, 616 | | driver's count at most / allowed (MB) | 4669 / 5096, 4671 / 5064 | 5039 / 5096, 5233 / 5099 | | textures' budget (held) | 1.98 (2.25), 1.99 (2.31) GB | 1.08 (1.86), 1.03 (1.90) GB | | textures made again empty | 0, 3 | 0, 3 | | **Hyrule Field** fps | 28.8, 29.3 | 29.1, 32.3 | | GPU ms a frame | 24.0, 23.5 | 21.0, 18.7 | | frames over 50 ms | 165, 134 | 34, 148 | | driver's count at most / allowed (MB) | 5469 / 5039, 5359 / 5039 | 4988 / 5097, 4982 / 5103 | | textures' budget (held) | 2.67 (1.82), 3.00 (1.89) GB | 0.87 (1.29), 0.88 (1.29) GB | | textures made again empty | 6, 4 | 11, 11 | The cost is the textures' budget: about 1 GB in the market and under 0.9 GB in Hyrule Field, where twice as many textures were made again in 60 s (headless: not looked at on screen). Earlier, on a scripted walk (main before #2711, the preallocation off by switch): 1536 MB took ~0 GB over PCIe every 600 submits against 30-32 GB, GPU 27 → 19.5 ms; 1024 MB gave 26.5 and 31.3 fps with the budget full and which pools stayed out varying. - No device lost, no new error lines; the program cache kept (47866 keys). - `python -I -B tests/run_all.py` on Windows: 472 passed, 10 failed, 41 skipped. The same 10 fail on main on this PC (symlink privilege, `dotnet restore`, no `gcc`, and `test_readme_menu_rows`: the Skip opening row has no README line). - Rows in `docs/tested-configurations.md`. - Nothing on screen changes: no screenshots. **Not tested:** another 6 GB card (a desktop one with a display attached has less allowed), AMD (GCN keeps its mirrors off) and Intel, Linux, 4 GB cards (the cap keeps them at 512). ### Overlap - #2676 maps Balanced to the 3.6 GB step and edits `tests/test_vram_budget_row.py`'s preset table and the `kVramMirrorMb` line: whichever lands second updates them. With both, Balanced on an 8 GB card mirrors 1536 MB (Auto gives it 2048). - #1377 (the hottest pools mirrored first) chooses which pools a full budget keeps. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- github-sync:item:2834 -->
On a 6 GB card, 896 MB of VRAM were held empty for the whole run. #2438
made 15% of the card as the images' pool's first blocks, for the
textures a walk streams in; with the compaction on (the default) those
textures come from a pool of their own, so the blocks held only DLSS's
and the scratch images, and VMA never frees a pool's minimum blocks.

On an RTX 3060 Laptop (6 GB, 5.1 GB allowed): 7 blocks (896 MB) held
8-9 images (43-53 MB) in Hyrule Field, the driver's count went past
what it allows (5.9 of 5.1 GB) and the texture budget was squeezed to
1.1 GB. Without them (RX_VK_IMAGE_PREALLOC=0, two runs of a scripted
walk each): VRAM at most 5.3-5.6 GB, the texture budget 1.8-1.9 GB,
frames over 50 ms 433-438 against 525-645; the mean fps the same.

vram_compact.h image_prealloc_blocks: #2438's count while the textures
come from the images' pool (RX_VK_COMPACT=0), none while they have
their own. RX_VK_IMAGE_PREALLOC still sets it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Every 6 GB card starts on the Low (6GB) preset, whose 512 MB of mirrors
left most of the game's memory pools out of VRAM: the GPU read them
over PCIe and the game's readbacks waited for whole submissions.

RTX 3060 Laptop (6 GB), Hyrule Field, a scripted walk, two runs each:
30-32 GB of bound ranges read over PCIe every 600 submits at 512 MB,
~0 at 1536. Main: 25.4, 25.4 fps, GPU 26.7-27.2 ms a frame, 525-645
frames over 50 ms. With this and the commit before (a build of them,
no switches): 30.1, 31.8 fps, GPU 18.4-19.1 ms, 161-285 frames over
50 ms, VRAM at most 5.7-5.8 GB against 5.9. 1024 MB was not enough:
26.5 and 31.3 fps, the budget full and which pools stayed out varying.

The row's 3.6 GB step (the Low preset's) only: a preset's budget
applies on the card it is for (preset_caps_memory). The 1.5 GB comes
out of what the images' pool no longer holds empty.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Author
Owner

@copilot-pull-request-reviewer[bot] reviewed on GitHub · 2026-11-12 15:53 UTC · original

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

> [@copilot-pull-request-reviewer[bot]](https://github.com/copilot-pull-request-reviewer[bot]) reviewed on GitHub · 2026-11-12 15:53 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2834#pullrequestreview-5877568866) Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level. <!-- github-sync:r:5877568866 -->
Author
Owner

@hckrman101 commented on gpu/vk/vk_menu.cpp line 856 on GitHub · 2026-11-12 16:34 UTC · original

The table no longer rises with the step: 3.6 GB mirrors 1536, 4.8 GB 1024. That's fine for the row's own steps, but preset_caps_memory lets Low's budgets through on any card up to 6.75 GB. So a 4 GB card on Low, or on Minimum with the row moved to 3.6 GB (that keeps opts.budget at 1, so the cap passes), now asks for 1.5 GB of mirrors on top of a 3.6 GB texture budget, where it was 512. Those players have already gone past the row's hint, so it's an edge case. Still, a cap on the mirrors by the card's size (for example, no more than vram/4 when a preset sets them) would keep a 4 GB card where it was.

> [@hckrman101](https://github.com/hckrman101) commented on `gpu/vk/vk_menu.cpp` line 856 on GitHub · 2026-11-12 16:34 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2834#discussion_r4553303175) The table no longer rises with the step: 3.6 GB mirrors 1536, 4.8 GB 1024. That's fine for the row's own steps, but `preset_caps_memory` lets Low's budgets through on any card up to 6.75 GB. So a 4 GB card on Low, or on Minimum with the row moved to 3.6 GB (that keeps `opts.budget` at 1, so the cap passes), now asks for 1.5 GB of mirrors on top of a 3.6 GB texture budget, where it was 512. Those players have already gone past the row's hint, so it's an edge case. Still, a cap on the mirrors by the card's size (for example, no more than `vram/4` when a preset sets them) would keep a 4 GB card where it was. <!-- github-sync:rc:4553303175 -->
Author
Owner

@hckrman101 commented on gpu/vk/vk_vma.cpp line 107 on GitHub · 2026-11-12 16:34 UTC · original

This hunk and image_prealloc_blocks are what #2711 changes (it gives the images' pool 0 when compacted too, and makes the blocks in the textures' pool instead). Please drop it here and rebase (2) on #2711, see the review body.

> [@hckrman101](https://github.com/hckrman101) commented on `gpu/vk/vk_vma.cpp` line 107 on GitHub · 2026-11-12 16:34 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2834#discussion_r4553303188) This hunk and `image_prealloc_blocks` are what #2711 changes (it gives the images' pool 0 when compacted too, and makes the blocks in the textures' pool instead). Please drop it here and rebase (2) on #2711, see the review body. <!-- github-sync:rc:4553303188 -->
Author
Owner

@hckrman101 reviewed on GitHub · 2026-11-12 16:34 UTC · original

Thanks, this is a careful write-up: one named card, alternated pairs, the PCIe traffic counted, and the 1024 MB arm too. The finding that the images' pool holds 896 MB empty on a 6 GB card matches what #2711 and #2759 found on 8 GB and larger cards. The two parts need different handling, so I'll take them separately.

(1) The preallocation. On #2759 I set where this lands: #2711 moves the blocks made at the start into the textures' pool instead of dropping them. That keeps what #2438 made them for, the ~170 ms block allocations on AMD's Windows driver, which nobody has measured since. image_prealloc_blocks here gives the images' pool the same count as #2711 does (0 when compacted, 15% with RX_VK_COMPACT=0). The difference is that #2711 puts those blocks where the textures land. So please drop part (1) and build (2) on #2711. With #2711 the 7 blocks hold Hyrule Field's textures (your (1)-alone arm shows a 1.8-1.9 GB texture budget, well past 896 MB), so the room (2) needs should still be there. That's the run I'd like to see: #2711 + (2) against #2711 alone on the 3060 Laptop, same walk.

(2) Low's mirrors, 512 → 1536. The numbers on your laptop are convincing (GPU 27 → 19 ms, the PCIe reads gone). But this is a default for every card that starts on Low: menu_first_start_for_gpu puts any dedicated card of 4.5-6.5 GB there (GTX 1060 6 GB, the 1660s, 2060, 3050 6 GB, 3060/4050 laptops, RX 5600 XT, Arc A380), plus everyone who saved Low already. GCN keeps the mirrors off (mirror_on), so it doesn't touch those. A few things before I'd take it:

  • A scene that fills the textures. At Low, textures (3.6 GB) and mirrors (1.5 GB) now ask for 5.1 GB together, the card's whole allowance, and nothing holds the mirrors back under pressure by default (RX_VK_MIRROR_TIGHT is opt-in). So the textures' budget is what gives. Hyrule Field for 75 s may not get there. Could you add one run in a heavier spot (Castle Town Market or Kakariko), and give the textures' budget and the driver's count from the log for both arms, the 1536 one included? The table has the budget for (1) alone but not for (1)+(2).
  • One more 6 GB card if you can find one. A desktop card with a display attached has less allowed than your laptop. Or AMD, which this hasn't been run on. If you can't, a tester with a 2060/1660 or an RX 5600 XT running the same walk would do.
  • The Auto rule. mirror_budget gives cards of 6.5 GB or less vram/8 (768 MB) on purpose: its comment says a 6 GB laptop went past what the card has with a quarter. So the new comment's "a quarter of the card as on larger ones" doesn't match: a 6 GB player on Auto gets 768, on Low 1536. Either Low is right and Auto should follow (with the same data), or the comment should say why the two differ.

Smaller points are inline. Overlaps: this conflicts with #2711 and #2759 in images_pool(), with #2676 on the kVramMirrorMb line and the preset table in test_vram_budget_row.py, and with #2826 in vram_compact.h and test_vram_compact.*. I'd land #2711 first, then this as (2) only. #2676 maps Balanced to the 3.6 GB step, so with both, 8 GB cards on Balanced mirror 1536 (Auto gives them 2048); that's fine with me.

CI: only the title check has run; the other workflows are waiting for approval to run on this PR. Your local run_all results are noted. It merges cleanly with main for now.

> [@hckrman101](https://github.com/hckrman101) reviewed on GitHub · 2026-11-12 16:34 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2834#pullrequestreview-5878233121) Thanks, this is a careful write-up: one named card, alternated pairs, the PCIe traffic counted, and the 1024 MB arm too. The finding that the images' pool holds 896 MB empty on a 6 GB card matches what #2711 and #2759 found on 8 GB and larger cards. The two parts need different handling, so I'll take them separately. **(1) The preallocation.** On #2759 I set where this lands: #2711 moves the blocks made at the start into the textures' pool instead of dropping them. That keeps what #2438 made them for, the ~170 ms block allocations on AMD's Windows driver, which nobody has measured since. `image_prealloc_blocks` here gives the images' pool the same count as #2711 does (0 when compacted, 15% with `RX_VK_COMPACT=0`). The difference is that #2711 puts those blocks where the textures land. So please drop part (1) and build (2) on #2711. With #2711 the 7 blocks hold Hyrule Field's textures (your (1)-alone arm shows a 1.8-1.9 GB texture budget, well past 896 MB), so the room (2) needs should still be there. That's the run I'd like to see: #2711 + (2) against #2711 alone on the 3060 Laptop, same walk. **(2) Low's mirrors, 512 → 1536.** The numbers on your laptop are convincing (GPU 27 → 19 ms, the PCIe reads gone). But this is a default for every card that starts on Low: `menu_first_start_for_gpu` puts any dedicated card of 4.5-6.5 GB there (GTX 1060 6 GB, the 1660s, 2060, 3050 6 GB, 3060/4050 laptops, RX 5600 XT, Arc A380), plus everyone who saved Low already. GCN keeps the mirrors off (`mirror_on`), so it doesn't touch those. A few things before I'd take it: - **A scene that fills the textures.** At Low, textures (3.6 GB) and mirrors (1.5 GB) now ask for 5.1 GB together, the card's whole allowance, and nothing holds the mirrors back under pressure by default (`RX_VK_MIRROR_TIGHT` is opt-in). So the textures' budget is what gives. Hyrule Field for 75 s may not get there. Could you add one run in a heavier spot (Castle Town Market or Kakariko), and give the textures' budget and the driver's count from the log for both arms, the 1536 one included? The table has the budget for (1) alone but not for (1)+(2). - **One more 6 GB card if you can find one.** A desktop card with a display attached has less allowed than your laptop. Or AMD, which this hasn't been run on. If you can't, a tester with a 2060/1660 or an RX 5600 XT running the same walk would do. - **The Auto rule.** `mirror_budget` gives cards of 6.5 GB or less `vram/8` (768 MB) on purpose: its comment says a 6 GB laptop went past what the card has with a quarter. So the new comment's "a quarter of the card as on larger ones" doesn't match: a 6 GB player on Auto gets 768, on Low 1536. Either Low is right and Auto should follow (with the same data), or the comment should say why the two differ. Smaller points are inline. Overlaps: this conflicts with #2711 and #2759 in `images_pool()`, with #2676 on the `kVramMirrorMb` line and the preset table in `test_vram_budget_row.py`, and with #2826 in `vram_compact.h` and `test_vram_compact.*`. I'd land #2711 first, then this as (2) only. #2676 maps Balanced to the 3.6 GB step, so with both, 8 GB cards on Balanced mirror 1536 (Auto gives them 2048); that's fine with me. CI: only the title check has run; the other workflows are waiting for approval to run on this PR. Your local `run_all` results are noted. It merges cleanly with main for now. <!-- github-sync:r:5878233121 -->
github-sync changed title from perf(vk): 6 GB cards mirror the game's memory in the VRAM the images' pool held empty to perf(vk): 6 GB cards mirror a quarter of the card (1536 MB), on Auto and on the Low preset 2026-11-12 19:02:39 +00:00
Author
Owner

@i12bp8 commented on GitHub · 2026-11-12 18:07 UTC · original

Thanks for the review. Updated:

  • (1) dropped, rebased on main (4cf785a0) with #2711 in. The PR is the mirrors alone now.
  • Auto and Low agree (gpu/vk/mirror_budget.h, auto_bytes): cards over 4.5 GB and up to 6.5 GB get a quarter (1536 MB on 6 GB; it was an eighth, 768). 4.5 GB or less keep an eighth (512 on 4 GB), larger cards as before. The eighth on 6 GB cards was for the image blocks made at the start, which #2711 now makes in the textures' pool; the comment says so.
  • A preset's mirrors never pass Auto's on the card (preset_bytes, when opts.budget > 0): Low on a 4 GB card, or Minimum with the row moved to 3.6 GB, stays at 512. A budget chosen on the row itself stays the player's, as #1859 has it.
  • tests/test_mirror_budget.py runs the rules and checks that mirror_budget uses them. run_all on Windows (on 3723fd0b, the VRAM checks again on 4cf785a0): 472 passed, 10 failed, 41 skipped; the same 10 fail on main on this PC (test_readme_menu_rows there too: the Skip opening row has no README line).

#2711 alone (A) against #2711 + this (B), RTX 3060 Laptop, Low, DLSS, standing with the camera turning for 60 s, two runs each in turn. Built on 51da0464 + #2711: main's renderer is API 20 with a new translator stamp, which this PC's game and program cache don't take.

A B
Castle Town Market fps 20.2, 20.1 22.5, 22.3
GPU ms a frame 31.4, 33.5 24.6, 25.2
frames over 50 ms 1252, 1287 571, 616
driver's count at most / allowed (MB) 4669 / 5096, 4671 / 5064 5039 / 5096, 5233 / 5099
textures' budget (held) 1.98 (2.25), 1.99 (2.31) GB 1.08 (1.86), 1.03 (1.90) GB
textures made again empty 0, 3 0, 3
Hyrule Field fps 28.8, 29.3 29.1, 32.3
GPU ms a frame 24.0, 23.5 21.0, 18.7
frames over 50 ms 165, 134 34, 148
driver's count at most / allowed (MB) 5469 / 5039, 5359 / 5039 4988 / 5097, 4982 / 5103
textures' budget (held) 2.67 (1.82), 3.00 (1.89) GB 0.87 (1.29), 0.88 (1.29) GB
textures made again empty 6, 4 11, 11

You were right that the textures' budget is what gives: about 1 GB in the market and under 0.9 GB in Hyrule Field, where twice as many textures were made again (11 against 4-6 in 60 s; headless, so I haven't looked at them on screen). The market, the heavier spot, is the clearer win: +11% fps, GPU -24%, half the long frames, no more textures made again. With #2711 alone the driver's count went past the allowance in Hyrule Field (5.36-5.47 of 5.04 GB); with this it stayed under there and reached it in the market.

Not done: another 6 GB card, or AMD. I can't run those here; a tester with a 2060, a 1660 or an RX 5600 XT on the same two spots would settle it. If the texture side needs holding back, the two things I'd measure next are RX_VK_MIRROR_TIGHT on for these cards, or 1024 MB (26.5 and 31.3 fps on my first walk, with the budget full and which pools stayed out varying).

> [@i12bp8](https://github.com/i12bp8) commented on GitHub · 2026-11-12 18:07 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2834#issuecomment-6831854907) Thanks for the review. Updated: - **(1) dropped**, rebased on main (4cf785a0) with #2711 in. The PR is the mirrors alone now. - **Auto and Low agree** (`gpu/vk/mirror_budget.h`, `auto_bytes`): cards over 4.5 GB and up to 6.5 GB get a quarter (1536 MB on 6 GB; it was an eighth, 768). 4.5 GB or less keep an eighth (512 on 4 GB), larger cards as before. The eighth on 6 GB cards was for the image blocks made at the start, which #2711 now makes in the textures' pool; the comment says so. - **A preset's mirrors never pass Auto's on the card** (`preset_bytes`, when `opts.budget > 0`): Low on a 4 GB card, or Minimum with the row moved to 3.6 GB, stays at 512. A budget chosen on the row itself stays the player's, as #1859 has it. - `tests/test_mirror_budget.py` runs the rules and checks that `mirror_budget` uses them. `run_all` on Windows (on 3723fd0b, the VRAM checks again on 4cf785a0): 472 passed, 10 failed, 41 skipped; the same 10 fail on main on this PC (`test_readme_menu_rows` there too: the Skip opening row has no README line). **#2711 alone (A) against #2711 + this (B)**, RTX 3060 Laptop, Low, DLSS, standing with the camera turning for 60 s, two runs each in turn. Built on 51da0464 + #2711: main's renderer is API 20 with a new translator stamp, which this PC's game and program cache don't take. | | A | B | |---|---|---| | **Castle Town Market** fps | 20.2, 20.1 | 22.5, 22.3 | | GPU ms a frame | 31.4, 33.5 | 24.6, 25.2 | | frames over 50 ms | 1252, 1287 | 571, 616 | | driver's count at most / allowed (MB) | 4669 / 5096, 4671 / 5064 | 5039 / 5096, 5233 / 5099 | | textures' budget (held) | 1.98 (2.25), 1.99 (2.31) GB | 1.08 (1.86), 1.03 (1.90) GB | | textures made again empty | 0, 3 | 0, 3 | | **Hyrule Field** fps | 28.8, 29.3 | 29.1, 32.3 | | GPU ms a frame | 24.0, 23.5 | 21.0, 18.7 | | frames over 50 ms | 165, 134 | 34, 148 | | driver's count at most / allowed (MB) | 5469 / 5039, 5359 / 5039 | 4988 / 5097, 4982 / 5103 | | textures' budget (held) | 2.67 (1.82), 3.00 (1.89) GB | 0.87 (1.29), 0.88 (1.29) GB | | textures made again empty | 6, 4 | 11, 11 | You were right that the textures' budget is what gives: about 1 GB in the market and under 0.9 GB in Hyrule Field, where twice as many textures were made again (11 against 4-6 in 60 s; headless, so I haven't looked at them on screen). The market, the heavier spot, is the clearer win: +11% fps, GPU -24%, half the long frames, no more textures made again. With #2711 alone the driver's count went past the allowance in Hyrule Field (5.36-5.47 of 5.04 GB); with this it stayed under there and reached it in the market. **Not done:** another 6 GB card, or AMD. I can't run those here; a tester with a 2060, a 1660 or an RX 5600 XT on the same two spots would settle it. If the texture side needs holding back, the two things I'd measure next are `RX_VK_MIRROR_TIGHT` on for these cards, or 1024 MB (26.5 and 31.3 fps on my first walk, with the budget full and which pools stayed out varying). <!-- github-sync:c:6831854907 -->
Commenting is not possible because the repository is archived.
No description provided.