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>
@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 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.

2 participants