Skip to content

v1.2.0

Choose a tag to compare

@NIGos NIGos released this 31 Aug 14:57
· 4 commits to main since this release

The driver's optical flow engine now works on Vulkan, which the previous release
said it never would. That claim was wrong, and this release is mostly the story of
why.

Hardware motion vectors on Vulkan

A game with no DLSS of its own, on Vulkan, can now be given a DLSS contract whose
motion vectors come from the NVIDIA driver — with no ReShade motion-vector shader
installed at all.

  • The engine creates its own two textures on a private D3D11 device and opens
    them on the private D3D12 one. It used to try the opposite: ID3D11Texture2D
    aliases of the shared D3D12 textures the transport already creates, through
    ID3D11Device1::OpenSharedResource1. That call is refused with E_INVALIDARG on
    the driver this was developed on — and always has been. The same refusal is in
    every D3D11 session log ever produced by this add-on: the mirror's
    MakeSharedPair tries that direction first, is refused for every texture and
    every format, and succeeds only by creating on D3D11 and opening on D3D12.
  • Nothing forced the failing direction. 1.1.0 documented, as a hard limit, that
    the engine's textures had to be D3D12-created because the game's Vulkan device
    imports them. That is true of the transport's four textures and false of the
    engine's two, which are imported into nothing. The sentence was the limit.
  • Each frame's colour is copied into the engine's texture on the D3D12 side under a
    CPU fence wait; NGX is handed the engine's motion-vector texture directly, with no
    copy back.

Arming no longer needs a ReShade shader

The gate wanted motion vectors before it would build the transport, and the engine
that supplies them opens inside the transport. A machine with no motion-vector
shader installed therefore never armed, and the engine never got a first chance —
one had to be enabled once purely to open the door. The gate now accepts a session
on the expectation of the engine: the first frames build the transport and open it,
deliver nothing, and the vectors are real from the next one. If the engine then
refuses to open, the transport stands down rather than evaluating over an unwritten
texture.

Fixed

  • The delivery gate refused every frame after the one that opened the engine.
    It tested the motion-vector binding for a null resource, and the branch that
    selects the engine leaves that null on purpose. The engine's branch had shipped
    without ever executing.
  • 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 Vulkan mirror for the rest of the session. A stall is
    now skipped and counted, and the mirror records nothing further until the queue is
    observed to reach the stalled frame's own copies-done event.
  • 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.
  • The status panel read the D3D11 optical flow session on a Vulkan runtime, so it
    reported an engine that would open on the first frame over one that had already
    tried and failed; and it reported no cost at all while the log printed one, because
    it took the timer frequency from a field only the D3D11 path fills.
  • The 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, and a mirror rebuild
    left the optical-flow engine's aliases on released textures.
  • A refusal told users the creation flags of a texture that had never been created,
    beating the true message one line below it: with no motion-vector shader enabled
    the panel now says so plainly.
  • Log lines corrected where they stated more than was established, including one
    that named the game's own D3D11 device for a session opened on a private one.

Changed

  • The add-on is dlss5-bridge.addon64. Delete the old dlss5-dx11-bridge.addon64
    — ReShade loads every add-on it finds, and two copies hook the same NGX entry
    points over each other. The log says so if it happens; it cannot prevent it. The
    old .cfg is read as-is, so settings carry over with nothing to do.
  • The source latch is released on D3D11 as well as Vulkan, so a game whose own DLSS
    is switched off mid-session falls back to the synthetic contract instead of
    delivering nothing until restarted.
  • Optical flow frame costs are no longer quoted. The figures from a standalone
    harness and the one the add-on's own log reports measure different things and have
    never been reconciled; the status panel reports the live cost for the session in
    front of you.

Tested on

  • Baldur's Gate 3, Vulkan: the mirror over the game's own DLSS, and the synthetic
    contract with the driver's optical flow engine and no motion-vector shader
    installed. The engine opens on its own, the conversion self-check reports zero
    disagreement over 24000 sampled cells, and frames are delivered continuously.
  • Skyrim Special Edition, D3D11: the synthetic contract and the optical flow
    engine over extended play.
  • Image quality was not assessed on either.