First non-beta release of the 0.6 line, covering everything since v0.6.0-beta.1 (11 commits).
Applying DLSS 5 settings could freeze the whole machine (32-bit path)
Hitting Apply to the DLSS 5 host could wedge the GPU hard enough to take the entire desktop with it, needing a hard reset. If you have ever seen this, upgrade.
The game queues a GPU-side Wait(fence_out, n) every frame before the host has signalled it. Applying settings closed the pipe and terminated the host without draining that wait, and the host's serve loop broke out on pipe close without signalling the frame it had been asked for. Nothing could ever satisfy the wait, so everything queued behind it — Present included — stalled until the driver gave up. Because the wedged queue owned the fullscreen swapchain, the desktop stopped compositing rather than just the game: nvlddmkm 153 (UCodeReset TDR), repeated resets, and a failed shutdown.
Both sides are fixed:
- The host drains its own queue and signals
fence_outtoUINT64_MAXon every exit from its serve loop, releasing any wait the game could hold — including for a frame message it never got to read. - The feed drains the last submitted frame before closing the pipe, while the host is still alive to signal it, and now releases both fences on every close. That also fixes a second instance of the same wedge: a crash-driven respawn used to keep waiting on the dead host's fence forever while ignoring the new one.
- Game exit drains too.
Washed-out image and lifted blacks on Vulkan (#11)
The copy home was always vkCmdBlitImage, chosen because it tolerates a format difference — but a blit converts, and that conversion is sRGB-aware. A linear-typed output blitted into a VK_FORMAT_*_SRGB swapchain got a linear→sRGB encode applied on top of frames that were already encoded, so everything came back brighter with visibly lifted blacks.
The bytes now go home untouched: the output keeps the backbuffer's channel order, layout comparison ignores the transfer function (an _SRGB backbuffer and a UNORM output are interchangeable for a raw copy), and the Vulkan path takes vkCmdCopyImage whenever the layouts match. D3D12 benefits too — its copy_resource was outright invalid across format families. Since typed UAV stores to B8G8R8A8_UNORM are an optional D3D12 feature, the format resolver probes for UAV_TYPED_STORE and falls back to RGBA where the device lacks it. A startup log line records which copy path was chosen.
Verified in The Surge 2 (the original report), regression-checked in DOOM (2016) Vulkan.
Adjustable work resolution (#19)
DLSS can now run at a fraction of the native resolution while the game and its backbuffer stay native-sized — a 50–100% slider, on both the 64-bit and 32-bit paths. Thanks to @Phroster for the original implementation.
Two things landed on top of it:
- Every value below 100% did nothing. The feed hit an early return before building anything, so DLSS disappeared entirely and only 100% ever worked. Neither colour source could actually be sampled:
DLSS5_ColorInput : COLORis a semantic texture whose binding is null, and ReShade's backbuffer has noD3D11_BIND_SHADER_RESOURCE. The frame is now copied into a texture we own and downsampled from that — one extra copy, only on the sub-100% path. Verified in Metro 2033 Redux at 50/67/73/90%. - Ported to the 32-bit path, on the same terms and with no host changes (
FeedBuildalready carries the size over the pipe). Motion vectors scale with the resolution ratio; depth is point-sampled so interpolation across a silhouette cannot invent geometry. Verified in Fable Anniversary at 3578x2013.
At 100% nothing changes on either path — no staging texture is allocated and the blit samples 1:1.
The DLSS 5 panel now matches the add-on it drives
The overlay exposed 7 of the add-on's 16 settings, used sliders where the add-on has dropdowns, and invented its own labels and ranges — which is how an out-of-range NRStyle could be written into your host config.
It now mirrors the add-on one-for-one — same order, same labels, same dropdown entries and grouping:
- New settings: Enable Upscaling, NR Preset, Skin Structure Strength, Scene Paper-White Scale, HDR Transfer Strength, Color Strength, Depth Convention, Motion Scale X/Y.
- Dropdowns instead of sliders: NR Style (Default / Natural / Cinematic), NR Preset (Default / Preset #1–#3), Depth Convention (Use game NGX flag / Force normal / Force inverted).
- NR Intensity is a float slider, not an integer one.
- Settings you never touch are no longer written at all, so the feed's defaults cannot overwrite the add-on's own. An out-of-range stored value is flagged in the panel.
- New Reload from host button.
Applying no longer steals focus
The host asks DXGI to leave its window alone (MakeWindowAssociation) and parks it at the bottom of the Z-order; the feed restores the game's foreground window once the replacement host connects.
The restart is also advertised as up to 15 s rather than 2 s — which is what the pipe wait has always actually budgeted for, since the replacement host re-initialises NGX and reloads the ~165 MB DLSSNR model before it can serve a frame.
Build and CI
- Every pull request now builds all five targets on a hosted Windows runner — both add-ons, the host, the Vulkan layer and the spike — fetching the NGX SDK and Vulkan headers from upstream, and uploading the binaries as an artifact. Compile-and-link only: nothing in the README's games table can be verified without an RTX GPU and a real swapchain.
- The build scripts enter the toolchain through
tools\vcvars.bat(vswhere first,%VCVARSALL%honoured, VS 18 BuildTools as fallback) instead of hardcoding that path five times..gitattributespins*.batto CRLF, sincecmd.exemis-parses labels in LF-only batch files. - The NGX import library is now taken from
lib/Windows_x86_64/x64/exactly — an alphabeticalfind|headwas picking thevs2010one and dying inLNK2038CRT mismatches.
Documentation
The README covers the 0.6 motion-vector provider system, with LumeniteFX Kernel as the recommended provider. If you installed a release up to 0.5.2 and followed the old instructions, your feed has most likely been running on zero motion vectors — ReshadeMotionEstimation does not compile on ReShade 6.8, yet ReShade still lists it as enabled. This release detects that and says so in the overlay and the log.
Upgrading
Replace dlss5-feed.addon32 and host64/dlss5-feed-host64.exe together — the freeze fix needs both halves. 64-bit and Vulkan users need dlss5-feed.addon64 (or the layer) for the colour fix.
Full Changelog: v0.6.0-beta.1...v0.6.1