Skip to content

feat(menu): sections on the Graphics tab - #2177

Merged
hckrman101 merged 7 commits into
NotRexed:mainfrom
pmwork-personal:feat/menu-sections
Nov 11, 2026
Merged

hckrman101 merged 7 commits into
NotRexed:mainfrom
pmwork-personal:feat/menu-sections

Conversation

@pmwork-personal

@pmwork-personal pmwork-personal commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

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

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.

Tab Holds Sections
Game (was Gameplay; first, where the menu opens) how the game behaves and reads, and Restart and Quit, as a pause menu flat; Restart and Quit last
Graphics how the picture is made, and what it costs Quality preset · Resolution and upscaling · Frame generation and latency · Detail · GPU and memory
Display (new) how it gets to your screen, and what is drawn over it Screen · HDR · Overlays (FPS counter, Menu size, from Game)
Audio sound out and in + Microphone (from Game: it picks the input device)
Controls how you play Camera · Controller · Buttons (optional)
Debug tools and developer switches Robust buffers in Developer (#2042, merged)

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:

  1. A sixth tab (Display)?
  2. V-Sync on Display (the PC convention) or with frame generation (it changes with it)?
  3. Sharpness with the upscaling rows (where players look for it) or with the window filter (where it runs)?
  4. DLSS 5 (feat(vk): add experimental DLSS 5 Neural Rendering #1590) and feat: menu, renderer and build plumbing for #1831/#1833; upload hitches; lock diagnostics (builds with #1831, #1833) #1834's Neural rows as a page opened from a Graphics row, like Motion, rather than a seventh tab?
Where open PRs' rows would go

Whichever PR lands second moves one row on rebase; happy to do it for anyone.

Testing

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_shown as before; the new check makes sure no section can end up
empty), 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 (25feb16, a 16:9 picture: HOS_ASPECT=1.7778, as on a 16:9 monitor); the others are from the first head (634ef65).

Graphics tab, top: Quality preset, then Resolution and upscaling and Frame generation and latency

Graphics tab, middle: Frame generation and latency, then Screen, V-Sync selected

Graphics tab, bottom: Screen with Aspect ratio, HDR, Detail, then GPU and memory with GPU device, VRAM budget and Mesh shaders, Mesh shaders selected

Small and Large:

Graphics tab at Small menu size

Graphics tab at Large menu size

Taken from headless runs of this branch (HOS_HEADLESS=1, RX_VK_SHOT_MENU=1, the keys from RX_VK_MENU_SCRIPT), RTX
5090. Headless, the list never scrolls on main either: menu_record_image leaves ease_step at 0, so the build behind
the scrolled shots had one more line there (ease_step = 1.0f, hence "-dirty" in the first head's build label), not part of
this PR.
The windowed menu eases as before.

🤖 Generated with Claude Code

The Graphics tab is one list of 24 settings, with the window, HDR, upscaling,
frame generation and GPU options mixed together, and more are on their way in
open PRs. Its rows now sit under section titles, heading rows like the Debug
tab's Developer: the Quality preset first, then Resolution and upscaling,
Frame generation and latency, Screen, HDR, Detail, and GPU and memory last.

Moves only: every row's definition is unchanged, so saved options and saved
keys carry over. The menu already draws heading rows on any tab and the keys,
the pad and the mouse step over them, so no drawing or input code changes.

- readme.md: a sentence on the sections; the option table in the new order.
- tests/test_upscaler_rows.py: the order list follows the picture's path
  (output, upscaler, render size, sharpening, then the frame rows, then the
  window).
- tests/test_menu_sections.py (new): the Graphics sections and the rows they
  hold, and on every tab no section that row_shown could leave empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	gpu/vk/vk_menu.cpp
#	readme.md
# Conflicts:
#	gpu/vk/vk_menu.cpp
#	tests/test_upscaler_rows.py

@Joey-Magnus Joey-Magnus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, careful change. I checked that it really is move-only: every row's definition is unchanged, and the six headings use the same heading form as the Debug tab's Developer row. Here's what I verified at this head:

  • Saved options: heading rows have value == nullptr. save(), the loader and ini_key all skip value-less rows, so the heading titled "HDR" never collides with the HDR row's hdr key. No row's key changes.
  • Mouse: draw_options hits continue for a heading before hits.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 the kRow click path treats any value-less row as Enter. The keys step over headings both ways (heading_at, lines 3654-3667).
  • Control bridge: bridge_row already excludes headings, so option_get/option_set don't list them.
  • Tests: I ran all 52 checks that read vk_menu.cpp on Linux, including the new test_menu_sections.py and the updated test_upscaler_rows.py. All pass (two dotnet-only checks skipped). The rule that no section may consist only of rows row_shown can hide is a good guard for AMD and Intel.

What needs doing:

should fix — conflict with main: gpu/vk/vk_menu.cpp conflicts because #1859 has since added a VRAM budget row to Graphics. Your plan puts it under GPU and memory. Please add it to GRAPHICS in tests/test_menu_sections.py too, 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.

@Joey-Magnus Joey-Magnus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_row and test_menu_keys pass 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.

pmwork-personal added a commit to pmwork-personal/Hookshot-pr that referenced this pull request Nov 11, 2026
…Rexed#2119's Aspect ratio row and a first start at 21:9

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The table follows the Graphics sections; the GPU and memory section had no
line for NotRexed#1859's VRAM budget row, and the HDR section none for HDR
contrast. VRAM budget lists the row's own steps (the arrows go past 2.2 GB,
which only the Minimum (4GB) preset sets).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@hckrman101 hckrman101 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked at d5634d1. 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 in GRAPHICS in 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:

  • put the row there in vk_menu.cpp;
  • add "HDR tone mapper" to the HDR list in GRAPHICS in tests/test_menu_sections.py, so the check pins it (it is hidden by row_shown unless HDR is Native, which is fine: HDR itself is always shown, so the section is never left empty);
  • carry its readme table line into the HDR group.

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_sections and test_upscaler_rows merged 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.

@pmwork-personal

Copy link
Copy Markdown
Contributor Author

Thanks. At 5714b34:

  • Readme: VRAM budget has its line under GPU and memory (the row's own steps; 2.2 GB only from the Minimum preset), and HDR contrast its line under HDR.
  • Description and screenshot: the bottom screenshot is retaken at this head (GPU device, VRAM budget, Mesh shaders, with Mesh shaders the last row), and the description no longer lists Robust buffers under GPU and memory. The top and middle shots are from the first head, as the description notes.

…and NotRexed#2496)

NotRexed#2119 renamed the Screen section's Ultrawide row to Aspect ratio and changed
Ultrawide menus' help; NotRexed#2481 added HDR tone mapper after HDR contrast. Both
changed rows inside the block this PR moves into sections: the sections keep
main's definitions word for word (every one of main's 81 rows matches), with
HDR tone mapper last in HDR. The readme's table takes main's Aspect ratio and
HDR tone mapper lines in the section order. test_menu_sections.py also pins
Profile, Aspect ratio, Ultrawide menus and HDR tone mapper in their sections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pmwork-personal added a commit to pmwork-personal/Hookshot-pr that referenced this pull request Nov 11, 2026
…t ratio in Screen)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@pmwork-personal

Copy link
Copy Markdown
Contributor Author

#2119 landed first, so I merged main into this (25feb16): 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.py now 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.

@hckrman101 hckrman101 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-checked at 25feb16. Everything from my last review is done:

  • Rebase / HDR tone mapper: the merge of main is clean (GitHub shows it mergeable). HDR tone mapper is last in the HDR section, with its help text unchanged, and test_menu_sections.py pins it there, plus Profile, Aspect ratio and Ultrawide menus.
  • Nothing dropped: I compared the rows table with main's: the same rows, each with its original definition and help text; the only additions are the six heading rows. Main's Aspect ratio rename (#2119) is kept, and the new order has Profile with the output rows and Reflex / Anti-Lag with frame generation, as the description says.
  • Readme: the table follows the menu's sections row for row, and now has VRAM budget and HDR contrast (and the tone mapper line from main, in the HDR group). Mesh shaders and Ultrawide menus have no line, as the description says #2105 adds those.
  • 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.

@hckrman101
hckrman101 merged commit eaef146 into NotRexed:main Nov 11, 2026
9 of 11 checks passed
pmwork-personal added a commit to pmwork-personal/Hookshot-pr that referenced this pull request Nov 11, 2026
…2119, NotRexed#2197, NotRexed#2481, NotRexed#2496)

NotRexed#2177 landed (squashed), so this takes main's sections as they shipped and
keeps this PR's change on top: the Screen, HDR and Overlays rows on the
Display tab. Main's newer rows go with them, word for word: NotRexed#2119's Aspect
ratio and Ultrawide menus text and NotRexed#2481's HDR tone mapper (last in Display's
HDR). Every one of main's 88 rows keeps main's definition; the only changes
are the moved rows' tab and the Overlays heading. draw_options keeps main's
Save my pipeline list line (NotRexed#2447) with the restart line on Display too. The
readme takes main's Menu shortcut text (NotRexed#2197) with six tabs, NotRexed#2177's VRAM
budget line, and main's HDR tone mapper and Field of view lines.
test_menu_sections.py pins Aspect ratio by name and HDR tone mapper in
Display's HDR; test_scene_tonemap_pass.py (NotRexed#2481) finds the tone mapper row on Display.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pmwork-personal added a commit to pmwork-personal/Hookshot-pr that referenced this pull request Nov 11, 2026
NotRexed#2197, NotRexed#2481, NotRexed#2496) into feat/menu-game-tab

Takes NotRexed#2178 as merged with main (cf90c14f) and keeps this PR's change on
top: the Game tab first, where the menu opens. Main's new Gameplay row,
Field of view, goes with the Game rows at the table's top, word for word,
after Game speed. Every one of main's 88 rows keeps main's definition; the
only changes are the moved rows' tab (Display) and the Overlays heading.
The readme takes main's Menu shortcut text (NotRexed#2197) with this PR's tab
sentence, and Field of view among Game's rows. The tab enum, the strip's
titles and the control bridge's names follow the same Game-first order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants