feat(menu): sections on the Graphics tab #2177
No reviewers
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
1 participant
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Hookshot!2177
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/menu-sections"
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?
The Graphics tab is one list of 24 settings, with the window, HDR, upscaling, frame generation and GPU options mixed
together, and about ten more are on their way in open PRs. This puts its rows under section titles, so the upscaler, frame
generation or HDR can be found without scrolling the whole list. It is the first step of a menu organization laid out below
for discussion.
What changed
nothing to click):
options files carry over, and #1864's tables (keyed by the English text) still find every row. They need the six
headings.
over them.
readme.md: a sentence on the sections, and the option table in the new order. (Ultrawide menus and Mesh shaders haveno line yet; #2105 adds them.) The Frame generation by row from #2118 gets its line in the table here too: main's
readme has none yet. So do #1859's VRAM budget (under GPU and memory) and #2342's HDR contrast (under HDR).
tests/test_upscaler_rows.py: its order list follows the picture's path (output, upscaler, render size, sharpening,then the frame rows, then the window). New
tests/test_menu_sections.py: the Graphics sections and which rows they hold,and on every tab no section that
row_showncould leave empty (a title over nothing on a GPU without Reflex, say).The plan this is step 1 of (for discussion)
Each tab answers one question; a section groups the rows you set together; a row that depends on another follows it; vendor
rows sit beside their counterpart and hide where they can't run (no vendor sections, so nothing is left empty on AMD); rows
to touch only when something is wrong go last; moves only, no renames.
Next PRs, one topic each: (2) a Display tab, taking the Screen and HDR sections over whole and adding Overlays; (3) the
Gameplay tab titled Game, first in the strip, where the menu opens; (4) Microphone to Audio; (5) optional, sections on
Controls. If a sixth tab is a no, this PR stands on its own.
Open questions:
Where open PRs' rows would go
{TAB_..., "...", nullptr, 0, 0, 0, ..., true}headings, or this PR adds that if it lands first.Whichever PR lands second moves one row on rebase; happy to do it for anyone.
Testing
tests/run_all.pyon Windows 11 (llvm-mingw clang, 8 at once) after merging main at2dfe9011(with #2119's Aspect ratio, #2481's HDR tone mapper, #2118's Frame generation by,#2342's HDR contrast and #1859's VRAM budget): 422 passed, 33 skipped, 2 failed, both outside this PR:
test_vram_budget_row.py(fails the same on main's own sources here) andtest_portable_builder_startup.py(itsdotnet publishneeds packages this PC does not have). A build of the branch compiles. All 81 of main's rows keepmain's definitions word for word; the only additions are the six headings.
test_menu_sections.pyfails on main as it stands (no sections) and passes here; a layout with a section of Reflex andAnti-Lag 2 alone fails it.
from the Quality preset land on V-Sync and 13 Ups come back past it to the last row, so every heading is stepped over
both ways and Up from the first row wraps to the last; the help box always shows the selected row (at the first head,
when Robust buffers was the last row). Again at this head (
25feb162, after #2042, #1859 and #2119): Up from the Quality presetwraps to Mesh shaders, the last row now, under VRAM budget (the bottom screenshot).
Not tested: in a window with a pad, the mouse wheel and a click just under a heading (the headless runs drive
the keys); values kept across a restart (no row's saved key changes); AMD and Intel (their rows hide through
row_shownas before; the new check makes sure no section can end upempty), Linux.
Screenshots
The Graphics tab at 1920x1080, Medium menu size: the top, then scrolled with the keys to V-Sync and to the last row
(the selection steps over every heading; Up from the first row wraps to the last row). The bottom one is retaken at this
head (
25feb162, a 16:9 picture:HOS_ASPECT=1.7778, as on a 16:9 monitor); the others are from the first head (634ef656).Small and Large:
Taken from headless runs of this branch (
HOS_HEADLESS=1,RX_VK_SHOT_MENU=1, the keys fromRX_VK_MENU_SCRIPT), RTX5090. Headless, the list never scrolls on main either:
menu_record_imageleavesease_stepat 0, so the build behindthe scrolled shots had one more line there (
ease_step = 1.0f, hence "-dirty" in the first head's build label), not part ofthis PR.
The windowed menu eases as before.
🤖 Generated with Claude Code
Nice, careful change. I checked that it really is move-only: every row's definition is unchanged, and the six headings use the same
headingform as the Debug tab's Developer row. Here's what I verified at this head:value == nullptr.save(), the loader andini_keyall skip value-less rows, so the heading titled "HDR" never collides with the HDR row'shdrkey. No row's key changes.draw_optionshitscontinuefor a heading beforehits.add(gpu/vk/vk_menu.cpp:2081-2085), so a heading has no hit area. A click can't land on one, which matters because thekRowclick path treats any value-less row as Enter. The keys step over headings both ways (heading_at, lines 3654-3667).bridge_rowalready excludes headings, sooption_get/option_setdon't list them.vk_menu.cppon Linux, including the newtest_menu_sections.pyand the updatedtest_upscaler_rows.py. All pass (two dotnet-only checks skipped). The rule that no section may consist only of rowsrow_showncan hide is a good guard for AMD and Intel.What needs doing:
should fix — conflict with main:
gpu/vk/vk_menu.cppconflicts because #1859 has since added a VRAM budget row to Graphics. Your plan puts it under GPU and memory. Please add it toGRAPHICSintests/test_menu_sections.pytoo, so the check pins where it goes, and give it a readme line in that section (main's readme doesn't list it yet either).minor — description and screenshots are stale: the description lists Robust buffers under GPU and memory, the key test says "13 Ups come back past it to Robust buffers", and the third screenshot shows it as Graphics' last row. #2042 has since moved it to Debug ▸ Developer, and this head correctly has only GPU device and Mesh shaders there (plus VRAM budget after the rebase). Please retake the bottom screenshot after the rebase so reviewers see what will actually ship.
minor (pre-existing, optional): the readme table has no HDR contrast row on main or here. Since this PR rewrites that part of the table, it would be easy to add one under HDR. Fine to leave it for another PR.
On your open questions, my view only: keeping the sections on Graphics until a Display tab is agreed seems right, and this PR stands on its own either way.
Rows are only moved. Headings have no value, so save, load, the control bridge and mouse hits skip them, and
test_menu_sections,test_upscaler_rows,test_vram_budget_rowandtest_menu_keyspass merged into main. VRAM budget sits under GPU and memory as asked.Before merge: the description and the third screenshot still show Robust buffers as Graphics' last row, but it moved to Debug in #2042.
Order with your other PRs: this one first, then #2178 and #2179 on top. #2119 renames the Ultrawide row this PR places by name, so #2119 should rebase onto this one.
Checked at
d5634d11. Joey-Magnus's reviews already cover the move-only check, saved keys, mouse hits and the control bridge; I agree and won't repeat them. His two earlier asks are done: VRAM budget sits under GPU and memory and is inGRAPHICSin the test, and the description and bottom screenshot no longer show Robust buffers.Should fix: the PR conflicts with main again (GitHub shows it as not mergeable). Main has since added an HDR tone mapper row (
opts.hdr_tonemap, after HDR contrast, shown only with HDR on Native) and a readme line for it, in the same hunks this PR moves. It belongs in the HDR section, after HDR contrast. Please rebase and:vk_menu.cpp;GRAPHICSintests/test_menu_sections.py, so the check pins it (it is hidden byrow_shownunless HDR is Native, which is fine: HDR itself is always shown, so the section is never left empty);Minor: readme. The option table still has no line for VRAM budget (Joey asked for it, and it is a row this PR places) or for HDR contrast, and Mesh shaders has none either (the description says #2105 adds that one). Since the table is rewritten in this PR, adding VRAM budget and HDR contrast under their sections would be cheap; fine to leave if you'd rather not.
CI: only the Conventional Commit title check is reported at this head (pending), so no test has run on it. Joey ran
test_menu_sectionsandtest_upscaler_rowsmerged into main earlier; after the rebase they need running again with the new row.Nothing else found: the sections follow the plan in the description, and the open questions about a Display tab are for the maintainer, so I'm not weighing in on those. Once the rebase is done this looks good to me.
Thanks. At
5714b346:#2119 landed first, so I merged main into this (
25feb162): the Screen section now has main's Aspect ratio row word for word, and #2481's HDR tone mapper is last in the HDR section. All 81 of main's rows keep main's definitions; the only additions are the six headings.test_menu_sections.pynow also pins Profile, Aspect ratio, Ultrawide menus and HDR tone mapper in their sections. The bottom screenshot is retaken at this head, with Aspect ratio in Screen.Re-checked at
25feb162. Everything from my last review is done:test_menu_sections.pypins it there, plus Profile, Aspect ratio and Ultrawide menus.test_upscaler_rows.py's order list matches the new row order.CI: the checks were all still pending when I looked, so no result yet; worth a glance before merging. Joey-Magnus's earlier asks (Robust buffers in the description) were done before this.
The Display tab questions stay with the maintainer. Good to go from my side.
github-sync referenced this pull request2026-11-12 06:22:54 +00:00