Skip to content

v1.3.0

Latest

Choose a tag to compare

@NIGos NIGos released this 31 Aug 16:43
· 2 commits to main since this release

Two NGX evaluates could run at once, and that was a latent defect in the whole
Vulkan mirror rather than a limitation of any one title.
It is fixed here.

Fixed

  • The mirror's D3D12 NGX evaluate and the game's own Vulkan NGX evaluate were
    not serialised.
    The worker took no lock, and the render thread's hook section
    is released before it wakes the worker, so both backends could be inside NGX at
    the same time. Red Dead Redemption 2 faults on this; Baldur's Gate 3 does not,
    and the difference is timing rather than safety. Both now take one critical
    section, held around the forwarded call on one side and around the evaluate on
    the other.

    What established it, rather than a guess: with every per-frame parameter dumped
    at the fault and all of them in range, the private device reporting S_OK, and
    the same build, game and values, the fault landed in a different module after a
    different number of delivered frames on each run — nvapi64_impl.dll after 89,
    nvoglv64.dll after 145. A malformed contract faults in the same place every
    time. After serialising: 5400 frames, no fault.

  • A game replacing its own super-resolution feature did not rebuild the
    mirror's.
    Only a change of render or output size triggered a rebuild, and a
    game can recreate at an unchanged size — switching HDR on, or going fullscreen,
    does exactly that. The mirror then carried a feature whose temporal history was
    accumulated under the configuration the game had just discarded, and the neural
    add-on downstream, which matches features by create, had nothing to match and
    said so while the mirror went on delivering.

  • The exposure-texture refusal could not be overridden, though the log said it
    could. The gate tested the flags the game declared rather than the ones the
    config resolves to, and the mirrored feature was created from the game's value
    either way, so setting flags did nothing. Both now read the resolved value, so
    a game that drives DLSS from an exposure texture this build does not mirror can
    be run with AutoExposure forced. Note that the arithmetically obvious value is
    often 107, which is treated as unset — Red Dead Redemption 2 declares 43, so
    the value to set is 75.

Added

  • The evaluate's failure branch now records the private device's removed reason,
    the module the fault landed in, the number of frames delivered before it, and
    every per-frame parameter as the block held them. This is what found the race,
    and it costs nothing on a session that never faults.

Changed

  • vk_mirror now defaults to 1, and is written into the generated config with
    the rest. It was off by default and absent from the file, so a Vulkan user got
    nothing and had no way to discover why. Hooking the Vulkan NGX entry points does
    nothing in a process that has none, which is every DirectX game.
  • The generated config explains itself: the two keys that decide whether anything
    happens are first, with a sentence each, and the rest is grouped rather than
    being a list of sixteen bare numbers.

Tested on

  • Red Dead Redemption 2, Vulkan: the mirror over the game's own DLSS, with the
    exposure override, through HDR and fullscreen changes made mid-session. 5400
    mirrored frames, no fault, and the neural add-on evaluating over the result.
  • Baldur's Gate 3, Vulkan: unchanged from 1.2.0.
  • Image quality was not formally assessed on either.