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 reportingS_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.dllafter 89,
nvoglv64.dllafter 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 settingflagsdid 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 withAutoExposureforced. Note that the arithmetically obvious value is
often107, which is treated as unset — Red Dead Redemption 2 declares43, so
the value to set is75.
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_mirrornow 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.