feat: an Upscaler choice Off: no upscaling at all, the game's own network left out too #2097
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!2097
Loading…
Reference in a new issue
No description provided.
Delete branch "upscaler-off"
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?
Low-end PCs, and automated runs that only need the game to go fast, have no way to turn upscaling off: even with DLSS and FSR off, the game's own upscale network runs on every frame. This adds Off (no upscaling) to the Upscaler row: no DLSS, no FSR, and the game's own upscale pass is skipped too.
What changes
dlss=6, so the values saved before keep their numbers. Off runs on every PC, so the row is now always shown (before, it was hidden where only the game's own could run).fd029a317a9a4b94at the usual 3/4 share, the same-size pass9dc98871eb7fc101at 100%, and the networks for each fixed share. Its input is stretched straight into its output with a linear filter and squared back to linear colour. That isshaders/dlss_out.comp, the last pass DLSS and FSR 4 already use, so there is no new shader; at the same size it is a copy. These dispatches are caught where DLSS and FSR 4 catch them (temporal_stand_in, andupscale_stubfor networks that do not translate). A network not known by its key is only replaced when its input is this frame's scene, as for DLSS. Off has no camera jitter, no history, no motion vectors and no extra LOD bias, so there is nothing to ghost and nothing left over when you switch back. The HUD is drawn over the result at the output's size, as before. Movies are not affected.RX_VK_DLSS,RX_VK_FSR4andRX_VK_FSRset for a run still take priority over the row, as they do for its other choices.tests/test_upscaler_rows.cppchecks Off's value, its place in the row (step_upscaler/step_engine), its Render resolution steps (step,snap,step_render,snap_render) and that the row is always shown.tests/test_upscaler_rows.pychecks that the menu offers and shows Off, and thattemporal_offdefers to an engine set for the run. It also checks that the stand-ins,temporal_upscaleand the scene camera handle Off, and that the stretch only takes the scene into the picture.tests/test_upscale_fallback.pygets a stub fortemporal_off.Measured
RTX 3090 on Linux, Output resolution 3840x2160, frame rate cap 240, Sharpness 0, Window scaling filter Off. The user's Hyrule Field save, Link standing on the path to the field. Each row is one exclusive run of about 35 s of play; GPU time is the renderer's own
vk: GPU time(the median of the last six 120-frame windows). The runs were headless, so fps is held near 60 by the CPU side and GPU time is the number to compare.On this card the game's network is cheap: it runs on the tensor cores and costs about 0.25 ms at 4K. So Off at the same size saves little here; it will save more on GPUs that run the network's matrix multiplies in software. The gain is the smaller sizes: Off at 50% is 2.5 ms (19%) faster than DLSS Performance at the same 3D size, and 2.9 ms faster than the default 75% with the game's own. The picture is rougher: no edge smoothing, and soft below 100%.
Screenshots
Captured at 3840x2160 (shown here scaled to 1920 wide; the crops at the end are at full detail), same spot, each from one of the runs above:
Game's own, 75%
Off, 75%
NVIDIA DLSS Performance
Off, 50%
Off, 33% (1280x720 stretched; from a shared check run on the rebased build, 10.3 ms GPU time there, not a timed number)
Detail crops of all six side by side
Not tested
upscale_stubhands them to the same stretch; this path is covered by the game-free checks only.github-sync referenced this pull request2026-11-12 06:22:54 +00:00