fix(vk): RX_VK_FSR4 and RX_VK_DLSS go over a saved FSR 3.1 (#1008 follow-up) #1773
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!1773
Loading…
Reference in a new issue
No description provided.
Delete branch "amd/fsr4-env-over-fsr3"
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?
Follow-up to #1008, for hckrman101's last review nit there.
The problem
With the Upscaler row saved on FSR 3.1 (
dlss=3),RX_VK_FSR4=1/2orRX_VK_DLSS=1/2was ignored without a word.fsr3_wanted()was true from the row alone, and the frame chain stands aside while FSR 3.1 upscales.development.mdsays these switches go over the row.The fix
fsr3_wanted()leaves a saved FSR 3.1 to those switches (temporal_env_chosen(), new invk_temporal.cpp).dlss_why()/fsr4_why()): otherwise a saved FSR 3.1 stays, rather than the game's own upscale (hckrman101's suggestion).RX_VK_FSR=1still goes over everything, so it's still one upscaler and one jitter.development.mdstates the order;test_upscaler_rows.pychecksfsr3_wantedasks the chain.Tested
tests/run_all.py: 237 pass, and the same 20 fail on plainmain(ef028cb) here (local tools).🤖 Generated with Claude Code
Thanks, this fixes the nit from my #1008 review: with the row saved on FSR 3.1,
RX_VK_DLSS=1/2andRX_VK_FSR4=1/2now go over it like the docs say.I went through the combinations.
=0on either switch leaves the saved FSR 3.1 alone. Rows 0, 1, 2, 4 and 5 behave as before.RX_VK_FSR=1still wins andRX_VK_FSR=0still turns it off. Only one upscaler draws and only one jitter source is active:fsr3_inputs::jitter_sizechecksfsr3_wanted(), so the FSR 3.1 jitter turns off when the chain takes over. Frame interpolation still gets its inputs throughfsr3_inputs::wanted()(frames_wanted()). The menu'supscaler()now shows the engine that actually runs. The docs match the code, and the test is picked up by thetests/test_*.pyglob.One non-blocking suggestion inline, about builds or GPUs where the engine you asked for can't run.
@ -74,13 +74,25 @@ int env_switch(const char* name) { // (-1: unset)}Suggestion, not blocking: this is true even when the engine the switch picks can't run here. Say the row is saved on FSR 3.1 and
RX_VK_DLSS=1is set on a build without NGX or on an AMD card. Thenfsr3_wanted()turns false,temporal_mode()hitsdlss_why() != DLSS_OKand returns GAME, and the game's own upscale runs with no log line. Before this PR, FSR 3.1 kept running in that case.RX_VK_FSR4=1without FSR 4 compiled in does the same.dlss_why()andfsr4_why()are cheap and don't call back intofsr3_wanted, so gating on them would keep FSR 3.1 as the fallback:(DLSS still comes before FSR 4, as in
temporal_mode.) You could also say this is just what 'goes over the row' means, since a saved DLSS row on an AMD card gives you the game's own upscale too. Either way works for me.