itchyfeetleech c90dc62112 engine: SR downsample's horizontal pass reads its texels into registers
down_m.comp (presets M and L) unpacked the block's 16x100 source texels into
a shared tile, waited for it, filtered the rows from there and waited again.
Each invocation of the horizontal pass now loads the ten packed texels of
four output columns of one source row straight into registers and filters
them (200 such items for the block's 512 invocations): no shared source tile
(12.5 KiB) and one barrier fewer. 15 -> 5 KiB of shared memory, 36 -> 17
shared-memory instructions, 36 -> 48 vector registers (32 waves as before).

An output column's parity stays a run-time value (gl_NumWorkGroups.z - 1
added, the dispatch's z count is 1): with constant weights the compiler
shares products between neighbouring filters and splits their fused
multiply-adds, and 30% of the output pixels change (62 dB) - that build is
the positive control. ACO now unpacks with a fused multiply-convert
(v_fma_mix*_f16: one rounding instead of f32, then binary16), which gives
the same value for each of the 2048 / 1024 codes of a channel (checked
exhaustively, HDR and LDR constants).

Every output frame byte-identical (M and L, HDR and LDR, and the RGB10
output variant bound in the plain one's place; 1280x720 -> 1440p, 1114x626
-> 1080p, 1920x1080 -> 1440p, the stress inputs). Only down_m.spv and
down_m_rgb10.spv change.

RX 9070 XT, d4r-m, interleaved, downsample stage: 720p -> 1440p 102 -> 91 us
(L; M 117 -> 113), 1114x626 -> 1080p 62 -> 47 (L 61 -> 47); noise (the stress
inputs, whose output does not compress) unchanged, 144 -> 144 (L 139 -> 138).
Frame (L) 2213 -> 2202 us and 1963 -> 1951. Two or eight columns per
invocation instead of four: 92 / 93 us.

Signed-off-by: itchyfeetleech <[email protected]>
2026-10-19 21:02:55 +13:00
2026-10-08 17:17:44 -04:00

d4r (dlss 4 radeon)

want to run xess (xmx) on radeon? check out x4r!

d4r runs NVIDIA's official DLSS Super Resolution (nvngx_dlss.dll) and experimental Ray Reconstruction (nvngx_dlssd.dll) in Windows games on AMD Radeon GPUs under Linux and Proton. The game asks for DLSS as usual; the DLSS network runs on the AMD GPU through ZLUDA (CUDA on ROCm/HIP), with the heaviest kernels replaced by hand-written RDNA2, RDNA3 and RDNA4 code.

Supported DLSS models: DLSS 3 CNN (E), DLSS 4 transformer (K, default), and DLSS 4.5 transformer (M, plus L for Ultra Performance). Ray Reconstruction presets D, E and F are experimental (building). DLSS 5 is PURPOSELY not supported.

Proof of concept: d4r shows that DLSS can run on an AMD GPU, but it is not really that practical for everyday use yet. It depends on unreleased patches to ZLUDA and vkd3d-proton. See supported games for the tested games and models.

Not affiliated with NVIDIA or AMD.

To contact me my discord is ._ayo. or join the d4r discord server

Results

DLSS Ultra Performance demo video · more videos

Radeon RX 7700 XT (RDNA3, gfx1101), SILENT HILL Townfall at 2560×1440, every DLSS result is presented in the frame it belongs to (no added latency).

Mode DLSS 3 CNN (preset E) DLSS 4 (preset K) DLSS 4.5 (preset M) FSR 4*
Quality (1705×960) 71.7 fps 67.9 49.3 76.0
Balanced (1488×837) 80.8 75.9 58.0 84.5
Performance (1280×720) 89.7 84.1 69.0 94.0
Ultra Performance (853×480) 89.1 95.5 92.2 107.3

* FSR 4 was measured on 2026-09-27, the DLSS columns on 2026-09-29, when the same machine ran about 2–4% slower overall. Native 2560×1440 without upscaling (the game's TSR at 100%) runs at 49.1 fps on the same walk. How the numbers were measured: docs/performance.md.

Switching models and FSR in game

Open OptiScaler's menu (Insert):

  • DLSS model: under DLSS Settings, tick Render Presets Override, pick the preset (E, K, L or M) and press Apply Changes. Unticking it returns to [DLSS] Model in d4r/d4r.ini.
  • FSR: set Upscaler (DX12) to FSR 3.X/4. RDNA3 and RDNA4 get FSR 4.1 (needs GE-Proton, which supplies AMD's FSR 4 library); other GPUs get FSR 3.1.

Both are on by default; [OptiScaler] FollowPresets and Fsr4 in d4r.ini turn them off.

Known issues

  • In some games using some models native upscaling can show visible artifacting. For fidelity over speed, set [Kernels] PreferAccuracy = true in d4r/d4r.ini (native kernel numerics).

GPU support

!WE ARE LOOKING FOR VIDEOS OF IT WORKING, IF YOU HAVE A MENTIONED HERE AND DOESNT HAVE A VIDEO PLEASE TAKE ONE!

GPU Chip Native kernels Runtime testing
RX 7700 XT, RX 7800 XT, RX 7700, Radeon PRO W7700 gfx1101 K, M, L (WMMA) RX 7700 XT
RX 7900 GRE / XT / XTX, Radeon PRO W7800 / W7900 gfx1100 K, M, L (WMMA) RX 7900 XTX: external video
RX 7600 / 7600 XT, RX 7650 GRE, RDNA3 integrated GPUs gfx1102, gfx1103 K, M, L (WMMA) untested
RX 9070 XT / 9070 / 9070 GRE, Radeon AI PRO R9700 gfx1201 K, M, L (WMMA, native FP8) RX 9070 XT: external video
RX 9060 XT / 9060 gfx1200 K, M, L (WMMA, native FP8) compile only
RX 6000 series, Steam Deck, RDNA2 integrated GPUs gfx1030–gfx1036 K (software matrix products) validated on RDNA3 only
RDNA1 and older unsupported

RDNA2 has no WMMA instructions: its K kernels do the same matrix products with v_dot2 and DPP broadcasts, bit-identical to the WMMA build. Running that RDNA2 path on an RX 7700 XT for testing, K took 3.6 ms per 1080p frame, against 46.8 ms fully translated (what RDNA2 had before); RDNA3 itself keeps WMMA (1.48 ms). E and K are the models to use there; M and L run fully translated. Kernels missing for a GPU fall back to ZLUDA and can be much slower. Details: docs/native-kernels.md.

How it works

game (D3D12) ──► OptiScaler ──► d4r nvngx.dll (NGX D3D12 API) ──► NVIDIA's NGX core + nvngx_dlss.dll (CUDA path)
                                                                          ▼
           native RDNA kernels ◄── ZLUDA (PTX → AMDGPU) ◄── nvcuda.dll (Wine CUDA bridge)

The shim keeps the game's inputs and output in VRAM through vkd3d-proton's Vulkan interop; ZLUDA compiles NVIDIA's PTX and serves hand-written kernels in place of the heaviest ones. An optional native inference engine ([Engine]) runs K, L and M with d4r's own Vulkan shaders. Details: docs/architecture.md.

Install the release

  1. Extract d4r-<version>.zip into the folder that holds the game's main .exe (OptiScaler 0.9.4 as dxgi.dll, the d4r-patched vkd3d-proton, AMD's FSR files and the d4r folder).
  2. Run bash install.sh there. It downloads NVIDIA's DLSS and NGX files from NVIDIA, checks their SHA-256 hashes and puts them in d4r/. Needs Bash, curl, sha256sum and 7-Zip; no sudo, ROCm not required.
  3. In Steam, select GE-Proton 11 for the game and set the launch options PROTON_FORCE_NVAPI=1 DXVK_NVAPI_GPU_ARCH=AD100 %command%.

When updating, replace d3d12.dll, d3d12core.dll and d4r/nvngx.dll together. Already using OptiScaler? The -asi zip adds d4r as a plugin (ASI guide). The full guide ships in the zip as D4R_README.txt.

Building from source

Linux with an RDNA2, RDNA3 or RDNA4 GPU, ROCm 7.2 with HIP and its clang, GE-Proton 11, a Rust toolchain, meson/ninja, winegcc, x86_64-w64-mingw32-g++, clang-cl and Python 3. The full sequence is in docs/building.md; scripts/package_release.sh builds the release zip.

Path Contents
tools/ the NGX shim, the Wine CUDA bridge, a D3D12 DLSS harness, probes
kernels/ native kernels (k/ DLSS 4, m/ DLSS 4.5, tex/ texture tails, common/ matrix layouts) and their tools
engine/ the native K/L/M inference engine
patches/ ZLUDA, vkd3d-proton and OptiScaler patches
scripts/, config/, packaging/, docs/ build/launch scripts, the developer d4r.ini, release files, documentation

Star History

Star History Chart

License

GNU General Public License, version 3 only (GPL-3.0-only; see LICENSE). The patches in patches/ are offered under the licenses of the projects they modify: ZLUDA (Apache-2.0 or MIT) and vkd3d-proton (LGPL-2.1). See NOTICE. The downloaded NVIDIA files and the kernels built from NVIDIA's code are not covered by this license.

S
Description
NVIDIA's official DLSS 3/4/4.5 on AMD RDNA3/4 GPUs on Windows and Linux.
Readme GPL-3.0
7.3 MiB
0 Stars 1 Watchers 0 Forks
Languages
C++ 48.5%
Python 30.8%
HIP 8.4%
C 7.2%
Shell 3.6%
Other 1.5%