Repository navigation
feat(menu): sections on the Graphics tab - #2177
Conversation
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
# Conflicts: # gpu/vk/vk_menu.cpp
Joey-Magnus
left a comment
There was a problem hiding this comment.
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 andini_keyall skip value-less rows, so the heading titled "HDR" never collides with the HDR row'shdrkey. No row's key changes. - Mouse:
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). - Control bridge:
bridge_rowalready excludes headings, sooption_get/option_setdon't list them. - Tests: I ran all 52 checks that read
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.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.
# Conflicts: # gpu/vk/vk_menu.cpp
Joey-Magnus
left a comment
There was a problem hiding this comment.
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.
…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
left a comment
There was a problem hiding this comment.
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
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); - 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.
|
Thanks. At 5714b34:
|
…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>
…t ratio in Screen) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
#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. |
hckrman101
left a comment
There was a problem hiding this comment.
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.pypins 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.
…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>
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>
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 feat: the Insert menu in 13 languages, with Game language and Menu la… #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; docs(readme): the option table lists every row of the menu #2105 adds them.) The Frame generation by row from feat(dlss): DLSS Frame Generation through NGX, evenly paced at 3x and up #2118 gets its line in the table here too: main's
readme has none yet. So do feat(menu): a VRAM budget row of its own (builds on #1358) #1859's VRAM budget (under GPU and memory) and feat(fsr4): FSR 4 for the game's native HDR, given linear light #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 at 2dfe901 (with feat(menu): the Aspect ratio row (was Ultrawide), at the monitor's shape by default #2119's Aspect ratio, feat(hdr): PsychoV35 scene tone mapper for Native HDR (RenoDX) #2481's HDR tone mapper, feat(dlss): DLSS Frame Generation through NGX, evenly paced at 3x and up #2118's Frame generation by,feat(fsr4): FSR 4 for the game's native HDR, given linear light #2342's HDR contrast and feat(menu): a VRAM budget row of its own (builds on #1358) #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 (25feb16, after fix: switches that behave as players expect, and dead ones removed #2042, feat(menu): a VRAM budget row of its own (builds on #1358) #1859 and feat(menu): the Aspect ratio row (was Ultrawide), at the monitor's shape by default #2119): Up from the Quality preset
wraps 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 (25feb16, a 16:9 picture:
HOS_ASPECT=1.7778, as on a 16:9 monitor); the others are from the first head (634ef65).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