v1.1.0
The biggest release this project has had, and the last one. Three things are
new: Vulkan games are supported, motion vectors come straight from the NVIDIA
driver, and a game with no DLSS at all can now be given a DLSS contract built from
the two. All three are off unless turned on, and all three are NVIDIA-only.
The bridge is no longer D3D11-only, and no longer needs a third-party shader to
supply motion vectors. Both additions are off by default.
The Vulkan bridge
A Vulkan game's own DLSS contract is now read from the NGX evaluate and mirrored
onto the add-on's private D3D12 session, so the neural rendering add-on runs over
the game's own upscale at the game's own quality preset. Set vk_mirror=1 in
dlss5-dx11-bridge.cfg.
- The game's colour, depth and motion vectors are copied inside the same open
command buffer the detour arrives on. At that point the game's own images do
not yet hold this frame, so a copy recorded anywhere else reads the previous
one. - Depth is unpacked on the D3D12 side. A depth aspect copies as
X8_D24_UNORM_PACK32by specification, so the staging texture isR32_UINT
and a compute shader unpacks it into theR32_FLOATthe feature reads. No
Vulkan-side conversion and no format negotiation. - A frame the game's queue does not reach within 300 ms is skipped rather than
fatal, and the mirror records nothing further until the queue is observed to
reach that frame's own copies-done event.
Motion vectors from the NVIDIA driver
nvofapi64.dll — installed with the display driver — is driven directly through
its D3D11 interface, and its output is converted to the R16G16_FLOAT screen-space
vectors NGX expects. It is the first motion-vector provider tried; while it is
running, the three ReShade shader names are not consulted at all.
- No ReShade motion-vector shader is required. Previously the synthetic path
depended onvort_Motion.fxor an equivalent being installed and compiled. - Measured at 0.18 ms per frame at 3840x1600.
ofa_gridselects the grid size
(4 is the default; 2 costs about 63 MB more) andofa_perfthe performance
level. - Falls back to the shader providers, with a log line naming the reason, when the
driver is absent or will not open a session on the game's device.
Neural rendering for a game with no DLSS
What the two above add up to. For a game that never calls DLSS at all, a DLSS
contract is built from ReShade's depth buffer and the driver's motion vectors and
handed to the add-on as though the game had produced it — no engine support, no
DLSS in the game, no third-party shaders. Delivered at reshade_begin_effects.
synth_after sets the delay in seconds before it may arm; 0, the shipped
default, leaves it off.
A status panel in the ReShade overlay states which of the two sources is running,
the transport, the session and feature state, and the frame count.
Limitations
- NVIDIA only. The optical flow engine is the driver's. On a hybrid laptop
where the game renders on the integrated adapter, the driver will not open a
session and the shader providers are used instead. - The synthetic contract needs a depth buffer bound by generic_depth, at back
buffer size. A game that runs its own DLSS renders depth at render resolution
while ReShade presents at output resolution, so the sizes differ and the
contract is refused — correctly, since such a game has DLSS and needs the mirror
rather than the synthetic path. - Motion vectors from a ReShade shader are one frame old and lower quality
than an engine's own. The optical flow engine measures the finished frame, so it
has no access to what the engine knows about camera and object motion. Both are
reconstructions; the mirror, where it applies, is not. - A D3D11 game that switches its DLSS off mid-session stops being served until
it is restarted. The Vulkan path recovers from this; the D3D11 path does not. - The source-latch release is not verified. The path that hands the frame back
to the synthetic contract when a mirrored game's DLSS goes quiet has not been
exercised on any title. - Image quality was not assessed.
Fixed
- An add-on unloaded while a frame was parked could hang the game. The worker's
stop path left the loop without setting the release event, and shutdown signalled
the events before stopping the worker rather than after. - A stalled queue retired the mirror for the rest of the session.
- The render thread's guard on the previous frame's park was shorter than the
worker's own budget, so one slow but successful evaluate stood the mirror down
permanently. It is now derived from the two budgets it covers. - The status panel reported no session for a working Vulkan mirror, and printed
the render size where the output size belonged. - A superseded synthetic session forced a second feature build.
- A mirror rebuild left the optical-flow engine's D3D11 aliases on released
textures. - Log lines corrected where they stated more than was established: a stand-down
claiming to discard a feature that is released elsewhere, a rebuild reason naming
a size change on a handover, and a stall message naming causes never observed
reaching it.
Changed
- The source for the synthetic path, the Vulkan mirror and the ReShade add-on
API headers is now in the repository. The previously published source did not
include them and could not be built as documented. BRIDGE_VERSIONandversion.rcare back in step. The 1.0.28 binary reported
itself as 1.0.27.
Tested on
Two titles, and the coverage is uneven.
- Skyrim Special Edition, D3D11: the synthetic contract and the driver's
optical flow, over extended play. - Baldur's Gate 3, Vulkan: the mirror, but narrowly — four sessions, roughly
25000 mirrored frames, no crash. The mirror builds, delivers, the neural add-on
creates its feature over the result, and the stall path was exercised once and
recovered. Image quality was not compared.
Project status
This is the last feature release. The DLSS 5 add-on now supports D3D11 and
D3D9 directly, which was this bridge's original reason to exist — for those games,
use that add-on on its own; it is the one that gets updated. The three features
above are what it does not cover, and are why this release is still worth taking.
There is no active development after this. The repository stays up and stays MIT,
the source is complete and builds from a clean copy with the command in the README,
and issues can be opened and will be read — but assume nothing is fixed unless
someone picks it up. Fork it freely.