Skip to content

Releases: NIGos/dlss5-dx11-bridge

v1.0.26

Choose a tag to compare

@NIGos NIGos released this 30 Aug 11:20

Fixed

  • A game that reports its input and output dimensions the wrong way round has them swapped back. DLSS never returns an image smaller than the one it is given, so an output below the input is not a contract. Four engines write them inverted: Gallipoli, The Elder Scrolls Online, Phantasy Star Online 2 and House Party's Unity plugin. Earlier releases patched the output from the output texture instead, which works only while the allocation equals the display size; under dynamic resolution it never does, and the feature that was built could not be evaluated. Aimed at issues #5 and #8; not verified in either.
  • An exposure texture supplied by the game is mirrored to the D3D12 side. Mount & Blade II: Bannerlord creates with AutoExposure clear and supplies a 1x1 exposure texture every frame; the bridge copied the flags faithfully and dropped the texture, so its feature accumulated with no exposure at all. Before 1.0.16 the forced flags=107 carried AutoExposure and hid this. The mirror uses the same typed-format conversion as the other four, without which a typeless exposure texture — Phantasy Star Online 2 supplies one — would have kept the defect.
  • The parameter block no longer keeps a released pointer when the exposure mirror is dropped: the key is cleared and the GPU drained first. The block is allocated once per session and NGX does not reference-count what it holds.
  • nvngx_dlssnr.dll and nvngx_dlss.dll are looked for beside the game as well as beside the add-on, and the log says which. ReShade can load add-ons from another directory, and the message claimed the game folder while only the add-on's had been searched.
  • The NGX data path is the game's folder when the two differ. Pointing NGX at a directory holding none of its files was never intended.

Added

  • The fault address and the module that owns it, as an offset into that module, when NGX initialisation or device creation raises an exception. An absolute address changes every run.
  • probe=1 creates a D3D12 device and calls Init_Ext without waiting for the game to call DLSS, for titles whose DLSS comes from another add-on. Off by default.
  • Every add-on's load address is listed.

Changed

  • The reactive mask was probed under a name that is not an NGX key. It is DLSS.Input.Bias.Current.Color.Mask; the log asked for BiasCurrentColorMask, so every "absent" it has ever reported was a probe of a name nothing sets. Whether any title supplies one is still unknown. The transparency-layer keys are probed for the same reason.
  • Absent resources distinguish a key the game left unset from one this runtime does not have. NGX results are named rather than printed as signed decimals: the -1160773616 in every previous log was 0xBAD00010, UnsupportedParameter.

Notes

  • Verified on Baldur's Gate 3 only in that the three dimension repairs stay silent there, the contract is unchanged, and the session is clean. None of the fixes above has been seen doing its work.
  • Issue #7 (Batman: Arkham Knight) is not fixed. It faults in Init_Ext like Prey 2017; this release is the first that names the module and offset.

v1.0.25

Choose a tag to compare

@NIGos NIGos released this 30 Aug 09:37

Fixed

  • The D3D12 device handed to NGX is ReShade's underlying device, not its proxy. ReShade wraps every D3D12 device created through the export, this add-on's own included, and then broadcasts init_device, init_pipeline, init_sampler and the rest to every loaded add-on for everything built from it. Luma is a DX11-only framework whose compile-time API guard is off unless a game opts in, and Prey 2017 does not: its OnInitDevice returns early for a non-D3D11 device, so ReShade never gives it per-device data, and every other handler then dereferences that null. NVSDK_NGX_D3D12_Init_Ext creating pipeline state on the device was the first such event, and it faulted at an address inside Luma-Prey.addon. The proxy is now unwrapped through ReShade's own IID_UnwrappedObject, so no other add-on is handed D3D12 objects it never asked for. unwrap=0 in dlss5-dx11-bridge.cfg restores the old behaviour. Aimed at Prey 2017; not verified there.
  • No module is patched while this add-on's own NGX initialisation is running. The loader notification runs under the loader lock and was enumerating modules, reading version resources from disk and writing jumps into code. The guard was missing from the 1.0.24 binary; it is present here and a log line marks it running.

Added

  • probe=1 creates a D3D12 device and calls NVSDK_NGX_D3D12_Init_Ext on its own, without waiting for the game to call DLSS. Prey has no DLSS of its own, so removing the add-on that provides it also removed every call and left nothing to test. Off by default.
  • Fault addresses are reported as an offset into the owning module, and every add-on's load address is listed. An absolute address changes each run and tells the owner of that module nothing.

Notes

  • Verified on Baldur's Gate 3, whose device is also wrapped: the unwrap runs, the session opens, and 17,000 frames and three feature rebuilds follow.
  • Prey 2017 is unverified. The diagnosis predicts the session now opens there; if it does not, the diagnosis is wrong.
  • On ReShade older than 6.6 there is no proxy to unwrap and behaviour is unchanged.

v1.0.24

Choose a tag to compare

@NIGos NIGos released this 29 Aug 23:40

Fixed

Correction. The first item did not reach this binary. The edit that guards the loader-lock callback was lost before the file was written, so OnDllLoaded still scans and patches unconditionally here. Present in 1.0.25, where a log line marks it running. The remaining items in this release are unaffected.

  • No module is patched while this add-on's own NGX initialisation is running. The loader notification runs under the loader lock, on the thread doing the load, and it was enumerating modules, reading version resources from disk and writing jumps into code. NVSDK_NGX_D3D12_Init_Ext loads nvngx_dlss.dll itself, so in Prey 2017 that notification arrived inside NGX's own initialisation and patched the snippet NGX was setting up; Init_Ext faulted 169 ms later. The scan is now deferred to a call site holding no lock. Aimed at Prey 2017; not verified there.
  • The DRED retry added in 1.0.21 did not turn DRED off. D3D12_DRED_ENABLEMENT_DISABLED is written nowhere in the add-on, so the second attempt ran under the identical setting and the message announced an action that never happened. Removed. dred=0 in dlss5-dx11-bridge.cfg remains the only way to make an attempt without DRED.
  • The command queue, list and fence event are checked before the session is marked ready. All three were created unchecked and dereferenced on the first frame. A null fence event was the worst of them: SetEventOnCompletion on a null handle blocks the render thread with no timeout.
  • A feature handle reused by NGX for super resolution is dropped from the other-features table. Nothing removed entries and NGX recycles freed handle addresses, so a recycled handle made every later evaluate take the "not super resolution" path for the rest of the session.
  • Layer slots are reused after a module unloads. Each unload and reload of an NGX module burned a slot permanently.

Added

  • The fault address and the module that owns it are logged when NGX initialisation or D3D12 device creation raises an exception. Three competing explanations previously produced the same log line.

Notes

  • Every item here was found by reading the code, not by reproducing it. None is verified in the positive: Baldur's Gate 3 reaches none of these paths and was used only to confirm nothing regressed.
  • Prey 2017 without the OptiScaler proxy present still faults in Init_Ext, so the proxy is ruled out as the cause, as are the NGX module choice fixed in 1.0.22 and the SDK version constant.
  • Verified on Baldur's Gate 3.

v1.0.23

Choose a tag to compare

@NIGos NIGos released this 29 Aug 23:03

Fixed

  • The DLSS render preset is copied to the D3D12 feature. All six DLSS.Hint.Render.Preset.* keys are mirrored when the game sets them. The preset selects which DLSS model runs, so the two sides were upscaling with different models and the neural-rendering add-on worked from the D3D12 one. Prey 2017 reaches DLSS through Luma, which sets these; DLSSTweaks, OptiScaler and many games set them directly. Unlike MV.Scale, nvsdk_ngx_helpers.h does not write these keys, so an absent one is left absent rather than given a value.

Added

  • A module that exports the NGX entry points but is not the driver's loader is named when the D3D12 session faults. Prey 2017 runs OptiScaler installed as WINMM.dll: it patches code inside the driver's NGX module and opens its own session on it first, which is the difference from titles where the same driver and module initialise. The log now says so and names the test — running without the proxy.

Notes

  • Baldur's Gate 3 sets no render presets and loads no NGX proxy, so both additions were verified only in that they stay silent. Neither has been seen doing its work.
  • Prey 2017 on 1.0.22 takes the correct NGX module and still faults in Init_Ext. The module choice fixed in 1.0.22 was a real defect but not the cause there. The SDK version is ruled out: Baldur's Gate 3 initialises with the same version, driver and module.
  • Verified on Baldur's Gate 3.

v1.0.22

Choose a tag to compare

@NIGos NIGos released this 29 Aug 22:47

Fixed

  • The NGX D3D12 entry points are taken from the driver's loader, not from whichever module exports them first. Prey 2017 loads a third-party WINMM.dll that exports them too. It comes from the game folder, so it was enumerated ahead of the driver, and its Init_Ext faulted — while the DLSS 5 add-on had hooked the driver's copy, leaving the two add-ons on different NGX modules. _nvngx.dll now wins wherever it lives; a proxy in the game folder under that name still wins, because it is the one the game itself reaches. Aimed at Prey 2017 and any title with an NGX wrapper beside it; not verified there.

Added

  • The module the NGX D3D12 entry points came from is logged. Establishing this previously meant comparing an address against a module base by hand.

Notes

  • Prey 2017 on 1.0.21 creates its D3D12 device and fails at Init_Ext. The device-creation fault addressed in 1.0.21 no longer occurs there, so the retry with DRED off has still never run.
  • Verified on Baldur's Gate 3.

v1.0.21

Choose a tag to compare

@NIGos NIGos released this 29 Aug 22:27

Fixed

Correction. The retry below did not do what it says. D3D12_DRED_ENABLEMENT_DISABLED is written nowhere in the add-on, so the second attempt ran under the identical setting and the message announced an action that never happened. Removed in 1.0.24. dred=0 in dlss5-dx11-bridge.cfg is the only thing that produces an attempt without DRED.

  • Device creation is retried once with DRED off when the first attempt raises an exception. DRED is switched on immediately before that call and is the only thing this add-on changes ahead of it, so it is taken back out rather than asking anyone to edit a file. Aimed at Prey 2017; the retry path has not run on a machine where device creation succeeds.

Added

  • The NVIDIA driver version, alongside the Windows one. Reports carry 32.0.16.1656, discussions use 616.56.
  • A warning when the driver is older than the one this release is verified on. Final Fantasy XIV on 560.94 could not create a neural-rendering feature and updating the driver fixed it.
  • The denoising capability block reports its result by name and its declared minimum driver. A driver that does not carry the capability key at all is called out: that is what Final Fantasy XIV showed before the update. The minimum shown belongs to Ray Reconstruction and does not speak for neural rendering, which has no capability key of its own.
  • Frame timings are marked when the game window is not in focus. An unfocused window changes the frame interval and the bridge's share of it, and the figure then reads as a regression that is not there.

Notes

  • D3D12CreateDevice in Prey 2017 carries one hook, ReShade's, with the same bytes after the jump as a title that works. A second injector was ruled out.
  • Verified on Baldur's Gate 3 and Final Fantasy XIV.

1.0.20

Choose a tag to compare

@NIGos NIGos released this 29 Aug 18:02

Fixed

  • Parameters the game does not set now carry the neutral from nvsdk_ngx_helpers.h. That header never leaves one unset: MV.Scale, DLSS.Pre.Exposure and DLSS.Exposure.Scale all become 1.0, and the subrect bases come from a zeroed struct. Trails beyond the Horizon sets none of them. 1.0.17 invented -1.0 for MV.Scale and reversed every motion vector, which was the smear; 1.0.18 sent nothing and left it to an undocumented default, which was the flicker. Confirmed fixed on Trails beyond the Horizon: the smear and the flicker are both gone.
  • Enabling DRED and creating the D3D12 device are wrapped in exception handlers. Prey 2017 faults inside D3D12Core.dll during device creation. Prey now loses DLSS 5 rather than the game. Aimed at Prey; not verified there.
  • d3dcompiler_47.dll is loaded from System32, not by the default search order, which prefers the game's own copy. The Elder Scrolls Online ships one, and renaming it away is what made ESO work with this add-on loaded. The path taken is logged.

Changed

  • The whole of the DLSS 5 add-on's ReShade.ini section is read, not keys beginning NR. Version 3.3.5 introduced EnableHooks, which decides whether it hooks anything at all.
  • D3D12CreateDevice's prologue is logged before it is called. ReShade hooks that function by design, so a jump there is normal.

Notes

  • ESO with the game's d3dcompiler_47.dll in place is the test this release needs. No renaming should be required.
  • The host-executable hold-back added in 1.0.17 was not what fixed ESO: it was already in force in 1.0.19, which still needed the rename.
  • Verified on Baldur's Gate 3.

1.0.19

Choose a tag to compare

@NIGos NIGos released this 29 Aug 17:31

Fixed

  • The host-executable hold-back announced in 1.0.17 was not in the binary. The test lived in the diagnostic enumerator, which runs only at detach; the function that writes the fourteen bytes never had it. skip_exe was parsed, logged and echoed into the config, so a report showed skip_exe=1 while the executable was patched on the first scan. It is now in the loop that patches. 1.0.17's notes described behaviour that could not occur.
  • CfgReload ran on the render thread every frame when the bridge never delivered one — a file open, parse and close inside the lock the game's own threads contend for. It was throttled on a frame counter that stops when delivery stops. The throttle is on the clock now.
  • The game's own DLSS was suppressed on three frames into which nothing was written. BridgeWillDeliver is answered before the frame runs; BridgeFail left frame_ready standing until the third failure. It clears on the first now.
  • The rebuild pause could never escalate. Its counter was zeroed on every resume, so a shape that never settles rebuilt eight times every three seconds for the whole session, silently.
  • msaa_reported was cleared by the opposite condition, so a game alternating sample counts traded two messages forever.
  • DLSS.Render.Subrect.Dimensions were swept into 1.0.18's mirror-only rule. They describe the region this feature is asked to process, which this bridge knows exactly. Restored.

Changed

  • NGX results are named, not printed as hex: 0xBAD0000B, UnableToInitializeFeature.

Notes

  • Baldur's Gate 3 exports NGX from bg3_dx11.exe too. With the executable held back its calls still arrive through the driver's loader and everything works — the first evidence that holding it back costs nothing.
  • Three of these were one shape: a state reset at the wrong point of its own cycle.
  • Verified on Baldur's Gate 3. The Elder Scrolls Online mitigation is still unverified there.

1.0.18

Choose a tag to compare

@NIGos NIGos released this 29 Aug 16:49

Fixed

  • A parameter the game does not set was filled in with an invented default. Trails beyond the Horizon sets no MV.Scale, and the -1.0 supplied for it reversed every motion vector, so DLSS gathered its temporal history from the wrong side of the movement. That is the smeared ground and foliage. Seventeen per-frame parameters now mirror the game or stay unset. Aimed at Trails; not verified there.
  • A feature covering only part of its output texture was given the whole one. Gallipoli's map screen creates a 1440x1440 feature while its textures stay 2560x1440. NGX answers 0xBAD00005, and where it does not, DLSS writes 1440 columns of a 2560-wide texture and the rest stays stale — the two halves. The bridge stands aside for that shape and the game renders it. Aimed at Gallipoli; not verified there.

Changed

  • The log names every parameter the game leaves unset.
  • Only the create flags and the quality preset keep a fallback, because a feature cannot be created without them.

Notes

  • Fourth defect from one mistake: create flags 107, quality preset MaxQuality, DoSharpening inside that 107, and now MV.Scale. Each was Baldur's Gate 3's own answer, and one of them was its answer at one particular quality preset.
  • On the map screen and any similar sub-region, DLSS 5 does not apply. The alternative was a broken frame.
  • Verified on Baldur's Gate 3, where both changes are inert.

1.0.17

Choose a tag to compare

@NIGos NIGos released this 29 Aug 16:23

Fixed

Correction. The hold-back described below was written into the diagnostic enumerator, which runs only at detach. The function that patches never had it, so on this version the host executable is still hooked on the first scan and skip_exe has no effect. Fixed in 1.0.19.

  • The game's own code section was patched when a game links the NGX client statically. The Elder Scrolls Online exports the entry points from eso64.exe; it is the only reported title that dies with no exception, no shutdown marker, and a log that simply stops. The host executable is now held back and hooked only if nothing has called DLSS a minute later. skip_exe=0 hooks it at once, 2 never.
  • The adapter and driver were recorded only when the D3D12 session opened, so a game that died before that left a report with no machine in it. Read from the game's own device at the first DLSS call now.

Added

  • Windows named as 10 or 11, not only the build number.
  • Adapter vendor, device and subsystem ids.
  • TdrDelay, the timeout a GPU reset is measured against.
  • Video memory used against budget, at session open and when a device is lost.
  • What the driver reports about the formats handed to DLSS, with an alarm if the output format takes no typed UAV store.
  • Two builds of one NGX snippet in a single process are called out. Escape from Tarkov runs nvngx_dlss.dll at 310.7.129.0 beside a hand-placed 310.8.0.0.
  • The calling thread id on every create and evaluate.
  • DRED explains the shape of the command list, so an operation can be attributed without counting. Shared textures carry names.

Notes

  • Escape from Tarkov: the GPU reset happens inside NGX's own recorded work, on a resource barrier, with no page fault. Not this add-on's operation.
  • Aimed at The Elder Scrolls Online; not verified there.
  • Verified on Baldur's Gate 3.