Supersampling through the upscaler: DLSS/DLAA and FSR 3.1 reconstruct past the output, then filter down (like DLDSR, in the game) #2758

Open
opened 2026-11-12 11:35:45 +00:00 by github-sync · 0 comments
Owner

@Jiro131 opened on GitHub · 2026-11-12 11:20 UTC · original

The idea

Let the temporal upscaler reconstruct to a target larger than the output, then filter it down to the output: supersampling through DLSS/DLAA (and FSR 3.1), the way NVIDIA's DLDSR plus DLAA is used in PC games today, but inside Hookshot.

Why it would help

  • #691 asked for "resolution scale above 100% for supersampling" because of aliasing on 1440p and 4K screens. It was closed as a duplicate of #68, and #68 was answered by the Output resolution option (up to 3840x2160, #849). That raises the output to the screen's size. It does not go past it, so on a 1440p screen, or a 5120x1440 ultrawide, the picture is still made at the screen's own size.
  • The driver can already do it (DSR/DLDSR), but only by changing the desktop resolution. That only exists on NVIDIA under Windows. And on an ultrawide the game's picture then gets stretched up by the game and back down by the driver (5120x1440 shown through a 6826x1920 swapchain here).
  • Doing it in the upscaler costs almost nothing extra: DLSS/DLAA already makes the full frame and dlss_out.comp already writes it out. The new part is a larger target and a downscale filter in that same pass.

What I have

A working version on v2.1.0, kept on my own branch for now:

  • RX_VK_UPSCALE_TARGET=1.78 or 2.25 (the DLDSR factors: 4/3 or 3/2 per axis). It is off by default and has no menu row.
  • DLSS/DLAA (vk_temporal.cpp) and FSR 3.1 (vk_fsr3.cpp) reconstruct to that size. dlss_out.comp filters it down in linear colour with a widened Catmull-Rom.
  • It is not used for FSR 4.
  • Each upscaler gets the largest factor its render size allows. NGX only accepts some render-to-target ratios, so DLSS Balanced gets neither factor and stays at the output size.
  • If the larger target cannot be prepared on a frame, that frame falls back to a lower factor.
  • It comes with game-free tests: the setting, the target sizes, and the factor each upscaler and render size gets.

Run in game (v2.1.0 plus this change, built from source) on an RTX 4090 (NVIDIA 621.01, Windows 11, i9-13900K, Kokiri Forest): DLAA with 2.25 on a 5120x1440 output gave upscaler target 7680x2160. There was no frame-rate change at those settings: the GPU wait stayed at or under 0.1 ms, and the frame rate followed the draw count with and without it (about 3,400 draws, 45 fps both ways).

Not tested:

  • the GPU cost when the GPU, rather than the CPU, limits the frame rate;
  • the FSR 3.1 path in game, and any AMD or Intel card;
  • Linux.

What I am asking

Is this wanted? If it is:

  • should it start as an RX_ setting only, or with a Graphics row (for example "Upscaler target: 100% / 178% / 225%")?
  • should it wait for anything?

main has moved a lot since v2.1.0 (the presenter thread, DLSS Frame Generation from #2118), so I would port it onto the current main and test it there before a PR. I would not start the port until you say it is wanted.

Score, as in docs/workflow.md: S3 (a feature) x reach 0.25 (DLSS/DLAA needs an RTX card: RTX 30, 40 and 50 are about 25% of the reports; FSR 3.1 would widen it, but that path is untested) x confidence 1.0 (runs here) = 0.25.

Anything else

  • Tracking: #2511 (upscalers).
  • Related: #691 (asked for this, closed as a duplicate of #68), #68 and #849 (Output resolution, up to 3840x2160), #777 (a render scale above 1x, listed in #1007), #1007 (the collected requests).
  • Prior art: NVIDIA DSR/DLDSR (1.78x and 2.25x, a filtered downscale); the internal-resolution scaling in emulators such as Dolphin and Cemu (render larger, then scale down to the window).
  • I can test on an RTX 4090 with a 5120x1440 screen. An AMD card would be needed to test the FSR 3.1 path.
> [@Jiro131](https://github.com/Jiro131) opened on GitHub · 2026-11-12 11:20 UTC · [original](https://github.com/NotRexed/Hookshot/issues/2758) ### The idea Let the temporal upscaler reconstruct to a target **larger than the output**, then filter it down to the output: supersampling through DLSS/DLAA (and FSR 3.1), the way NVIDIA's DLDSR plus DLAA is used in PC games today, but inside Hookshot. **Why it would help** - #691 asked for "resolution scale above 100% for supersampling" because of aliasing on 1440p and 4K screens. It was closed as a duplicate of #68, and #68 was answered by the Output resolution option (up to 3840x2160, #849). That raises the output to the screen's size. It does not go past it, so on a 1440p screen, or a 5120x1440 ultrawide, the picture is still made at the screen's own size. - The driver can already do it (DSR/DLDSR), but only by changing the desktop resolution. That only exists on NVIDIA under Windows. And on an ultrawide the game's picture then gets stretched up by the game and back down by the driver (5120x1440 shown through a 6826x1920 swapchain here). - Doing it in the upscaler costs almost nothing extra: DLSS/DLAA already makes the full frame and `dlss_out.comp` already writes it out. The new part is a larger target and a downscale filter in that same pass. **What I have** A working version on v2.1.0, kept on my own branch for now: - `RX_VK_UPSCALE_TARGET=1.78` or `2.25` (the DLDSR factors: 4/3 or 3/2 per axis). It is off by default and has no menu row. - DLSS/DLAA (`vk_temporal.cpp`) and FSR 3.1 (`vk_fsr3.cpp`) reconstruct to that size. `dlss_out.comp` filters it down in linear colour with a widened Catmull-Rom. - It is not used for FSR 4. - Each upscaler gets the largest factor its render size allows. NGX only accepts some render-to-target ratios, so DLSS Balanced gets neither factor and stays at the output size. - If the larger target cannot be prepared on a frame, that frame falls back to a lower factor. - It comes with game-free tests: the setting, the target sizes, and the factor each upscaler and render size gets. Run in game (v2.1.0 plus this change, built from source) on an RTX 4090 (NVIDIA 621.01, Windows 11, i9-13900K, Kokiri Forest): DLAA with `2.25` on a 5120x1440 output gave `upscaler target 7680x2160`. There was no frame-rate change at those settings: the GPU wait stayed at or under 0.1 ms, and the frame rate followed the draw count with and without it (about 3,400 draws, 45 fps both ways). **Not tested:** - the GPU cost when the GPU, rather than the CPU, limits the frame rate; - the FSR 3.1 path in game, and any AMD or Intel card; - Linux. **What I am asking** Is this wanted? If it is: - should it start as an `RX_` setting only, or with a Graphics row (for example "Upscaler target: 100% / 178% / 225%")? - should it wait for anything? `main` has moved a lot since v2.1.0 (the presenter thread, DLSS Frame Generation from #2118), so I would port it onto the current `main` and test it there before a PR. I would not start the port until you say it is wanted. Score, as in docs/workflow.md: S3 (a feature) x reach 0.25 (DLSS/DLAA needs an RTX card: RTX 30, 40 and 50 are about 25% of the reports; FSR 3.1 would widen it, but that path is untested) x confidence 1.0 (runs here) = 0.25. ### Anything else - Tracking: #2511 (upscalers). - Related: #691 (asked for this, closed as a duplicate of #68), #68 and #849 (Output resolution, up to 3840x2160), #777 (a render scale above 1x, listed in #1007), #1007 (the collected requests). - Prior art: NVIDIA DSR/DLDSR (1.78x and 2.25x, a filtered downscale); the internal-resolution scaling in emulators such as Dolphin and Cemu (render larger, then scale down to the window). - I can test on an RTX 4090 with a 5120x1440 screen. An AMD card would be needed to test the FSR 3.1 path. <!-- github-sync:item:2758 -->
Commenting is not possible because the repository is archived.
No milestone
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Hookshot#2758
No description provided.