itchyfeetleech 8ffb0aee45 engine: SR reconstruction computes both rows' Gaussians in one pass
post_m.comp's invocations own a vertical pixel pair and ran the 3x3 (L 4x4)
Gaussian taps once per row, reading the three shared tile entries of every
tap twice. The two rows have the same column and texels and differ only in
dy, so both are now accumulated in one loop: one set of tile reads per tap,
dy, the exponent and the third accumulator as binary16 pairs (element 0 the
even row), and every operation of a row the one it had on its own, lane by
lane. The odd row keeps its own-cell residual rounding.

Every output frame byte-identical (M and L, HDR and LDR, the three tile
tiers: 1280x720 -> 1440p, 1114x626 -> 1080p, 1920x1080 -> 1440p, and the
stress inputs), and so is everything D4R_M_DUMP writes. Controls that must
differ: the odd row's weight sum times 1.01 (every frame of every input), the
rows' third accumulators swapped (every frame; in the dump only the packed
image, as g.z only enters it), the odd row's residual cast once (1114x626 ->
1080p, the one input where the rows' cells differ). Shader: 64 -> 37 shared
memory reads, 2105 -> 1969 instructions, 60 vector registers as before.

RX 9070 XT, d4r-m 720p -> 1440p, interleaved, reconstruction stage: 287 ->
265 us (L 355 -> 320), compact tier 193 -> 177 (L 244 -> 223), random motion
360 -> 347 (L 400 -> 367), 15x15 tier at 1920x1080 -> 1440p 424 -> 423 (L 427
-> 421). On the uniform-motion frames M's downsample after it measures 105 ->
117 us with the same shader (L's does not move), so the frame gains 7 us there
(1527 -> 1520), L 36 (2249 -> 2212).

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%