TL;DR: Add an experimental FSR Ray Regeneration backend on Windows, run the K
network natively on HIP with Vulkan->HIP shared memory, extend K kernels to
gfx11 (RDNA3), and add dependency/packaging/test tooling around them.
Windows: FSR RR backend, native HIP K runner, gfx11 K kernels, tooling
FSR Ray Regeneration (experimental)
- Add fsr_rr_backend.{h,cpp}, fsr_rr_passes.h and the fsr_rr/ prepare and
compose compute shaders. They run AMD's FidelityFX denoiser
(amd_fidelityfx_denoiser_dx12.dll, SDK 2.3, not bundled) on a private
vkd3d-proton device.
- Add the amdxc64 shim (tools/windows/amdxc64_shim) and two vkd3d-proton
patches for libcxx includes. AMD's amdxc64.dll is never loaded.
- d4r_nvngx_windows: RrFeature now selects between the native DLSS RR
backend and the FSR backend (D4R_RR_BACKEND=fsr). After the denoiser it
runs an internal Super Sampling stage (feature 1) to upscale. If SR is
unavailable and output != render size, the frame fails; it is never
returned noisy.
- d4r.ini / player_config: new [RayReconstruction] FsrDenoiser,
FsrStabilityBias (auto or >= 0) and FsrDetail (0-1), with validation, and
matching D4R_FSR_* environment variables.
- Add the FSR RR fixture, output-check and ngx test scripts, and a shader
compile script.
Native HIP K runner (Windows)
- CMake: add d4r_engine_k_hip (d4r-k-hip) plus separate volk/engine copies,
because VK_USE_PLATFORM_WIN32_KHR changes volk's entry points.
- Share Vulkan memory with HIP via Win32 opaque handles on Windows
(VK_KHR_external_memory_win32) and via fds on Linux. Handle types are now
intptr_t, and the platform choice is in D4R_EXT_MEMORY_* macros.
- HipNetwork: add debugRepeatHashes and debugNodeMicros, exposed as
D4R_HIP_REPEAT_CHECK, D4R_HIP_REPEAT_ALL and D4R_HIP_NODE_PROFILE in
replay.cpp.
- replay.cpp: display-resolution-motion frames (FrameFlagDisplayMotion) no
longer require near2rnd == out2rnd. Both values must still be in (0, 1].
K kernels on gfx11
- Allow position-token and enc1 tiling on __GFX11__ as well as gfx12.
- Add an opt-in ds_bpermute cross-half exchange
(D4R_WINDOWS_GFX11_DS_EXCHANGE, enabled for K on Windows gfx11). M keeps
its LDS path.
- Fix a block-barrier race in the position layer. Without POS_VSHARE a fast
wave could overwrite its hb rows while a slower wave still read them for a
later head, giving rare wrong results on gfx1101 (enc0 outputs differing
between identical launches).
Packaging and install
- install.bat, d4r.ini, WINDOWS_README: FSR option, and
install_dependencies.py to install pinned NVIDIA dependencies with staged,
hash-verified replacement and rollback.
- Update the release package, local package refresh and test scripts.
- Add the InteropBatchInputCopies option (default false). Batching is faster
on some synthetic runs, but player temporal exactness is unresolved.
Tooling and tests
- K model: capture_k_weights, build_k_model, compare_k_outputs,
benchmark_k_hip, build_capture_runtime, test_k_model and the
zluda-k-output-capture patch. Captured weights and models are private
local assets and must not enter release archives.
- Synthetic probes: test_m_ngx, test_sr_dynamic,
prepare_rr_dynamic_fixture and the d3d12/rr_ngx probe updates.
- Add tests/windows/test_install_dependencies.py.
Docs
- Update the windows-fsr-rr, k-performance, local-package, rr-interop and
rr-model-cache docs. Add windows-parity-handoff.md and
windows-parity-continuation-prompt.md.
This commit is contained in:
1 parent
247fe1092d
commit
a617c818de
62 files changed
+5894
-89
No files matched your search
+158
-1
@@ -1,4 +1,152 @@
|
||||
# Native Windows FSR Ray Regeneration investigation
|
||||
# Native Windows FSR Ray Regeneration
|
||||
|
||||
## Status (2026-10-17): runs on RDNA3 through vkd3d-proton; synthetic validation only
|
||||
|
||||
`[RayReconstruction] Backend = fsr` answers a game's DLSS RR request (NGX feature 13) with AMD's FSR Ray
|
||||
Regeneration 1.2 denoiser, then upscales with an internal Super Sampling feature. Selection, `install.bat` [F]
|
||||
and `d4r\fsr` payload are described in `WINDOWS_README.txt`. **No game exposes RR to test with, so everything
|
||||
below is a synthetic scene; game compatibility and image quality against DLSS RR are unverified.**
|
||||
|
||||
Why the earlier "zero providers" result was correct: AMD's denoiser ships only `wmma_fp8` shaders, issued
|
||||
through AMD's driver extension (`AmdExtD3DShaderIntrinsicsUAV`), and RDNA3 has no FP8 WMMA hardware. Native
|
||||
Windows drivers therefore offer no provider. Linux gets one through vkd3d-proton with dxil-spirv's scalar FP8
|
||||
fallback and a Proton `amdxc64.dll` shim. The Windows route reproduces that:
|
||||
|
||||
1. **vkd3d-proton for Windows** (`tools/windows/build_fsr_payload.py`): vkd3d-proton `3dfc6f07` plus dxil-spirv
|
||||
PR 307 (`f9f6294f`) and `-Denable_extended_emulation=true`, built with llvm-mingw clang; two libc++ include
|
||||
patches in `patches/vkd3d-proton-windows/`. The shipped `d4r\fsr\d4r_vkd3d_core.dll` is `d3d12core.dll`
|
||||
renamed and loaded by path; `IVKD3DCoreInterface::CreateDevice` is called directly (the IDL has no base
|
||||
interface, so it is vtable slot 0). `DXIL_SPIRV_CONFIG=wmma_rdna3_workaround` is set in-process.
|
||||
2. **amdxc64 shim** (`tools/windows/amdxc64_shim`): recovered from the denoiser's call sites (interface IDs
|
||||
`{014937ec-…}` factory, `{f714e11a-…}` wave-matrix properties with a 16x16x16 type-0xb entry,
|
||||
`{ba019d53-…}` intrinsics enable, `{b58d6601-…}` device info). It advertises the FP8 shape the shaders use;
|
||||
the arithmetic is emulated by dxil-spirv. The device-info values are placeholders. It never forwards to
|
||||
AMD's driver.
|
||||
3. **Lookup redirect.** The denoiser finds `amdxc64.dll` with `GetModuleHandle`. In a game process AMD's own
|
||||
D3D12 driver has already loaded the real `amdxc64.dll`, which crashes on a vkd3d device. The loaded copy of
|
||||
AMD's DLL gets its `GetModuleHandleA/W` imports redirected in memory to the shim. The DLL on disk is not
|
||||
modified.
|
||||
|
||||
Data path (`tools/windows/fsr_rr_backend.cpp`): the game queue copies the guides into the same shared D3D12
|
||||
packet the native DLSS backend uses; the packet is imported into vkd3d's `VkDevice`; `fsr_rr_prepare` and
|
||||
`fsr_rr_compose` (Vulkan, recorded through vkd3d's DXVK interop) convert DLSS-RR guides to FSR inputs and back
|
||||
around `ffxDispatch`; the composed colour returns through the packet to a game-device texture, and the internal
|
||||
SR feature upscales it into the game's output. Every hand-off is CPU-synchronized; no vkd3d patch is needed.
|
||||
|
||||
Evidence (all synthetic, RX 7700 XT, static camera, zero jitter):
|
||||
- Probe (`fsr_rr_probe`, 960x540, 4 signals): provider found, context created, 48 frames finite, denoised, reset
|
||||
handled; GPU median 20.3 ms (`build/fsr-vkd3d-probe-v1/out3`).
|
||||
- NGX feature-13 path (`tools/windows/test_fsr_rr_ngx.py`, noisy scene with a known noise-free answer):
|
||||
640x360 render=output without SR, RMSE vs clean 0.488 -> 0.060 (`build/fsr-rr-shim-run-v9`); 640x360 ->
|
||||
1280x720 with SR from the extracted v9 package, RMSE 0.289 against 0.581 for the noisy input and 0.314 for the
|
||||
noise-free render-size image nearest-upsampled (`build/fsr-rr-ngx-upscale-v9-v1`). About 10-11 ms per frame
|
||||
(convert+denoise+compose ~7 ms, SR submit ~2.6 ms); first RR start compiles AMD's shaders (~65 s cold).
|
||||
- Native DLSS RR regression with the same shim: `PASS NGX RR ... standalone_exact=1`.
|
||||
|
||||
Guide conversion check: a diagnostic (`D4R_FSR_RR_DUMP_DIR`, first `D4R_FSR_RR_DUMP_FRAMES` frames) dumps the
|
||||
converted linear depth, motion and normals. On the moving fixture the converted motion equals the ground-truth
|
||||
`PreviousUV - CurrentUV` (FFX's contract) to 1.5e-6, the view-z delta is 0 for lateral motion, and linear depth is
|
||||
reconstructed to 5e-7 (`build/fsr-rr-dump-moving-v2`).
|
||||
|
||||
Motion vectors matter, measured (FSR alone, same-size, moving camera, RMSE vs noise-free): with AMD's default
|
||||
stability bias the ordering was misleading (correct 0.107, flipped 0.066, zeroed 0.158, because default bias
|
||||
over-weights history and rejection scored better); at stability bias 0 it is physically ordered (correct 0.033,
|
||||
flipped 0.042, zeroed 0.061). `FsrStabilityBias` (`D4R_FSR_RR_STABILITY_BIAS`), `FsrDetail` (`D4R_FSR_RR_DETAIL`),
|
||||
`D4R_FSR_RR_KEY_<n>`, `D4R_FSR_RR_DEMOD_FLOOR` and `D4R_FSR_RR_HALO_LIMIT` follow the Linux adapter. Through the
|
||||
full pipeline (FSR then SR): same size, bias 0 gives 0.036 against 0.107 for auto (3x); with a 2x SR upscale auto
|
||||
gives 0.214 against 0.248 for 0 (auto 14% better). The shipped default is therefore `auto`.
|
||||
|
||||
Timing (RX 7700 XT, synthetic, two direct signals, SR included, per frame, median): 1080p Quality
|
||||
(1280x720 -> 1920x1080) 29.8 ms total, 1440p Quality (1707x960 -> 2560x1440) 50.6 ms total. GPU timestamps
|
||||
(`D4R_FSR_RR_LOG`) at 1280x720 render: prepare 0.5 ms, **AMD's denoiser dispatch 21 ms**, compose+copy 0.2 ms: the
|
||||
denoiser itself dominates. Linux reports about 8 ms for AMD's denoiser at 1280x720 on gfx1101 under RADV; the same
|
||||
vkd3d-proton/dxil-spirv stack is about 2.6x slower here, on AMD's Windows Vulkan driver. Optimization parity with
|
||||
Linux is NOT achieved, and the cause (driver code generation for the emulated FP8 shaders, cooperative-matrix use,
|
||||
a missing vkd3d/dxil-spirv option) has not been identified. The 3-4 ms outside the denoiser (packet copies and
|
||||
the CPU-synchronized hand-offs) is also unoptimized.
|
||||
|
||||
Limits: output may exceed render size only through the SR stage (without SR, output must equal render size);
|
||||
dynamic render sizes must stay within creation dimensions and the SR library's queried dynamic range;
|
||||
unsupported sizes fail before submission (see the newer dynamic-resolution evidence below);
|
||||
diffuse is a direct signal (no diffuse hit distance); the exposure texture only goes to the SR stage; HDR +
|
||||
render-resolution unjittered motion only; RGBA16F/RGBA32F output without SR; mapped float guide formats and depth
|
||||
planes have focused synthetic coverage, while additional guide encodings remain unsupported; alpha output is not produced;
|
||||
first RR start compiles AMD's shaders (~65 s, cached per game exe in
|
||||
`%LOCALAPPDATA%\d4r\cache\vkd3d`). Each evaluation blocks the CPU until its GPU work completes (as the
|
||||
native DLSS RR backend does), so it is not asynchronous. No game evidence exists for FSR RR.
|
||||
|
||||
## Dynamic resolution: SR range identified and enforced (2026-10-17)
|
||||
|
||||
The earlier `0xBAD00005` was caused by an invalid SR render size, not a blanket lack of dynamic-resolution support.
|
||||
NVIDIA's own log reports Quality's minimum as half the output dimensions: the previous 640x360 -> 1280x720
|
||||
fixture tried 576x324, below the 640x360 minimum. Plain SR reproduces that rejection with flags 0 and 11,
|
||||
including reset-every-frame (`build/sr-dynamic-isolation-v1/`). Valid plain-SR subrects pass 24 synthetic frames
|
||||
with creation 426x256, output 640x384 and smaller render 384x224 (`build/sr-dynamic-isolation-v2/summary.json`).
|
||||
|
||||
The internal SR feature now queries `DLSSOptimalSettingsCallback` using
|
||||
[NVIDIA's helper contract](https://github.com/NVIDIA/DLSS/blob/main/include/nvsdk_ngx_helpers.h).
|
||||
FSR intersects the returned range with its existing creation-size bounds and rejects invalid sizes synchronously
|
||||
before recording a command boundary. A missing or invalid query retains the previous creation-size-only range.
|
||||
No ratio is hardcoded in production. The plain-SR probe validates/logs its requested subrect; the FSR wrapper
|
||||
checks every reported extent and SR submission count. `--sr-bounds` tests each axis below the pinned Quality
|
||||
minimum, restores valid dimensions, and completes subsequent evaluations on the same command list.
|
||||
|
||||
Moving-camera FSR+SR: creation 640x360, output 960x540, render sizes 640x360 / 576x324 / 480x270 and back,
|
||||
24 frames per run. Both retained creation-sized textures and resized textures pass, without feature recreation.
|
||||
Queried SR range is 480x270..960x540; creation dimensions still cap this FSR feature at 640x360.
|
||||
Evidence: `build/fsr-rr-valid-dynamic-maxres-bounds-v1/summary.json` and
|
||||
`build/fsr-rr-valid-dynamic-resized-bounds-v1/summary.json`. Both below-minimum axes reject before submission;
|
||||
all 24 subsequent SR outputs are finite and nonuniform. Tail RMSE is 0.07665 versus noisy 0.48826 and ideal
|
||||
nearest-resampled clean input 0.03894. This is synthetic denoising evidence, not exact/reference-quality parity:
|
||||
maximum error within the sky mask reaches 0.78223. Alpha, other encodings, broader motion and games remain open.
|
||||
|
||||
## Format coverage and denoiser optimization trials (2026-10-17, later pass)
|
||||
|
||||
FSR-only output now accepts RGBA32F, including temporal switching with RGBA16F. Composition still runs at
|
||||
half precision. A checked Vulkan nearest blit widens the completed half image into a lazily allocated float
|
||||
image, then copies it through the existing shared packet. No CPU tensor conversion is added, and no new alpha
|
||||
or FP32-denoiser claim is made. The ordinary FSR+SR path continues to hand SR a half image.
|
||||
|
||||
Synthetic moving-camera tests at 640x360 pass 24 frames each: canonical half output; alternating half/float
|
||||
output plus alternating canonical/float guides; and RGBA32F output with typeless D32S8 depth and unchanged
|
||||
stencil. `--verify-output-widening` compares every final output component against a diagnostic readback of
|
||||
the same frame's composed half image, widening the independent reference where needed. All components match
|
||||
exactly. Converted linear depth, motion and normals also match canonical dumps byte-for-byte across all 24
|
||||
guide-switch frames. Evidence: `build/fsr-formats-{half,switch,d32s8}-composed-v1/`.
|
||||
`test_fsr_rr_ngx.py --without-sr` uses the existing diagnostic environment contract because player startup
|
||||
requires SR dependencies. It is not an installer/player-without-dependencies compatibility claim.
|
||||
|
||||
Three denoiser/compiler trials produced no reliable gain and are not promoted: cooperative conversion-loop
|
||||
unrolling, forcing the minimum subgroup size, and retaining the RDNA3 layout workaround without global FP16
|
||||
RTZ. AMD's denoiser and all quality settings/signals remain unchanged. At 1280x720, these fixtures start near
|
||||
21.5 ms and reach about 31-32 ms in later frames, so a single whole-run median can mislead. Late-frame timings
|
||||
stay within the control spread. Static and moving noisy fixtures retain the existing finite/nonuniform and
|
||||
RMSE < 0.5 * noisy-input gate. No lower-resolution or skipped-signal shortcut is substituted.
|
||||
|
||||
Cross-process FSR output is not bit-exact even for repeated unchanged controls: in the 720p moving fixture,
|
||||
frame 0 has 2,087,117 differing components and maximum absolute difference 0.1435546875 between two controls.
|
||||
Their tail RMSE remains about 0.0612 versus noisy 0.4872. This precludes attributing inter-process image
|
||||
differences solely to a candidate. The same-frame format-conversion gate avoids that ambiguity; K keeps its
|
||||
strict full-frame exact gate. The FSR numerical variability is recorded, not fixed or reclassified as exact.
|
||||
Evidence: `build/fsr-perf-720-{baseline-v2,baseline-repeat-v1,unroll-v2,wave32-v1,rte-v1}/` and
|
||||
`build/fsr-perf-static-720-{baseline,unroll}-v1/`. Experimental binaries remain private under build/;
|
||||
the shipped payload stays `build/fsr-payload-v1`. The two third-party source files edited for experiments
|
||||
were restored; pre-existing libc++ include fixes remain. Linux denoiser performance parity is still open.
|
||||
|
||||
## History: the investigation before the vkd3d route
|
||||
|
||||
## Corrected provider descriptor recheck
|
||||
|
||||
The query now passes `FFX_API_CREATE_CONTEXT_DESC_TYPE_DENOISER` in
|
||||
`ffxQueryDescGetVersions.createDescType`, rather than its effect ID. AMD's
|
||||
[API contract](https://github.com/GPUOpen-LibrariesAndSDKs/FidelityFX-SDK/blob/main/Kits/FidelityFX/api/include/ffx_api.h)
|
||||
defines this field as the creation description type. A bounded query against
|
||||
the unchanged pinned AMD DLL and real RX 7700 XT still returns OK with zero
|
||||
providers. The adapter reports shader model 6.6. No context is created or
|
||||
denoiser dispatch attempted; FSR remains unavailable. Evidence:
|
||||
`build/fsr-rr-correct-descriptor-v1/validation.json`. The earlier probe binary is
|
||||
preserved in `build/fsr-rr-descriptor-baseline-v1/`. No driver, identity,
|
||||
security, GPU setting or game changes occurred.
|
||||
|
||||
The native D3D12 provider check currently fails on RX 7700 XT. This does not
|
||||
implement a working Windows FSR RR backend or DLSS RR replacement.
|
||||
@@ -16,6 +164,15 @@ parity requires a compatible shader execution route as well as the DLSS guide
|
||||
conversion and internal SR adapter. Merely importing the Linux backend or
|
||||
selecting `Backend=fsr` would not supply those pieces.
|
||||
|
||||
The DLSS native D/E path already uses Linux's gfx11 shaders and lowering. A
|
||||
read-only comparison against `34e6b0fe71d770729000a553f79b784e9b2dc279` verifies
|
||||
25 shader/runtime/packer sources after CRLF/LF normalization. Both installer-built
|
||||
D/E models verify all 66 products, 11 native 32-wide stages and the translated
|
||||
64-wide output stage. Evidence: `build/rr-rdna3-source-parity-v1.json`.
|
||||
This establishes source/recipe parity for native DLSS RR only. It provides no
|
||||
FSR dispatch, FSR optimization parity or measured GPU-time parity. FSR's missing
|
||||
native execution route remains a separate prerequisite.
|
||||
|
||||
## Reproduce without a game
|
||||
|
||||
```powershell
|
||||
|
||||
@@ -1,5 +1,150 @@
|
||||
# Windows K performance work
|
||||
|
||||
## Current optimization pass: strict DS exchange, 1080p and 1440p (2026-10-17)
|
||||
|
||||
After the position-layer barrier fix, the explicit gfx11 DS cross-half exchange passes the strict gate.
|
||||
`kernels/common/wave32_exchange.h` uses `ds_bpermute` with the current wave's lane XOR 16 instead of the
|
||||
volatile LDS array and its fences. No arithmetic, half rounding, weights or tensor layouts change.
|
||||
Windows gfx11 K selects it through `D4R_WINDOWS_GFX11_DS_EXCHANGE`; M retains its validated LDS path.
|
||||
The experimental builder retains explicit `-LaneExchange lds|ds` selection for comparisons.
|
||||
|
||||
Final CMake-built candidates, authentic private K model, synthetic 24-frame temporal cases, 25 frames/submit,
|
||||
12 timing trials with three warmup trials excluded. Timestamps span Vulkan front, HIP network, Vulkan back
|
||||
and the CPU synchronization gaps; these are not network-only or game timings:
|
||||
|
||||
| Output | Fixed LDS baseline | Strict DS candidate | Change |
|
||||
|---|---:|---:|---:|
|
||||
| 1920x1080 | 2286.4 us | 1811.9 us | 20.8% faster |
|
||||
| 2560x1440 | 3587.7 us | 2885.4 us | 19.6% faster |
|
||||
|
||||
All five frame products match baseline hashes exactly at both sizes (120 products per case).
|
||||
Evidence: `build/k-ds-cmake-1080-final-v1/summary.json`, `build/k-ds-cmake-1440-final-v1/summary.json`.
|
||||
Independent manual-build comparisons also pass, at 1808.7/2877.0 us. CMake/manual code objects differ as
|
||||
artifacts; the actual CMake objects receive their own full output checks. Final native objects are under
|
||||
`build/k-ds-native-cmake-v2/`. The v1 CMake candidate is rejected: an intermediate CMake regex overwrote the
|
||||
captured per-source flags; the capture is now saved immediately, preserving CU and QKV-split flags.
|
||||
|
||||
Further experiments retained no reliable additional gain: position token counts 1/2/4, shared V values,
|
||||
SPIR-V size optimization of input/output, and all-WGP scheduling. Every compared candidate here is exact;
|
||||
many are slower. WGP measured 2862.3 vs 2847.2 us at 1440p and 1795.7 vs 1813.9 at 1080p, within small
|
||||
run-to-run differences and inconsistent across sizes. It is not promoted. Evidence is under
|
||||
`build/k-hip-opt-sweep-v1/`, `k-hip-opt-ds-share-v1/`, `k-hip-opt-stage-mt1-v1/`, and `k-ds-wgp-*-v1/`.
|
||||
|
||||
The HIP standalone engine/model is still separate from the package's NGX feature-1 path. The package can
|
||||
use the same faster K layer objects through its existing ZLUDA/NGX route; that route requires separate
|
||||
whole-frame validation and CPU interop timing. Linux targets of 1.5/2.47 ms remain unmet. Further substantial
|
||||
work would require the Vulkan front/output stages or the cross-API synchronization path; it is outside this
|
||||
bounded optimization pass. Broader K temporal/reference-quality and production-adapter work remains open.
|
||||
|
||||
The final v14 ZIP's loader/INI passes 64 exact synthetic NGX K frames per size in control/candidate/candidate/control
|
||||
order. CPU interop medians: 1080p 3.900 -> 3.3915 ms (13.0%); 1440p 5.4015 -> 4.820 ms (10.8%). Unlike the
|
||||
standalone timestamp table, these include CPU API/copy/synchronization/NGX overhead. They are not game FPS.
|
||||
Evidence: `build/k-ds-local-v14-{1080,1440}-v1/summary.json`. An earlier legacy 1080p run overlaps build activity;
|
||||
its exactness evidence remains valid, but the packaged player runs supersede its timings.
|
||||
|
||||
Stability diagnostic: `build/k-ds-repeat-node-final-v1.log`, 300 frozen-input rounds x 8 window phases (2,400
|
||||
launches), zero output-hash mismatches. Its individually instrumented network nodes total 1,926.04 us at 1440p.
|
||||
That instrumentation is separate from accepted frame timings. Raw readbacks created by this pass were checked
|
||||
against recorded hashes and pruned to recover 5.05 GiB; logs, summaries, hashes and final previews remain.
|
||||
Cleanup inventory: `build/k-opt-readback-cleanup-v1.json`. No earlier artifacts were deleted.
|
||||
|
||||
## Temporal isolation follow-up
|
||||
|
||||
The intermittent drift is not fixed or attributed to a specific layer. New
|
||||
`benchmark_k_interop.py --reset-every-frame` passes an explicit diagnostic option
|
||||
to the D3D12 harness, verifies its application and records it in the report.
|
||||
This mode does not represent normal temporal inference or game performance.
|
||||
|
||||
With the validated private CU output, 16 frames per run and four player runs:
|
||||
|
||||
| Isolation | Exact evaluations | Evidence under build/ |
|
||||
|---|---:|---|
|
||||
| Reset every frame, ABBA input batching | 64 | k-player-reset-every-frame-1080-v1 |
|
||||
| All K network layers translated, CU output retained, temporal ABBA | 64 | k-player-translated-network-temporal-v2 |
|
||||
| All native K, unbatched identical controls | 64 | k-player-native-temporal-controls-v1 |
|
||||
| Native encoders only, translated decoders, temporal ABBA | 64 | k-player-native-encoders-temporal-v1 |
|
||||
| Translated encoders, native decoders only, temporal ABBA | 64 | k-player-native-decoders-temporal-v1 |
|
||||
| All native K and CU output, temporal ABBA rerun | 64 | k-player-native-temporal-abba-v2 |
|
||||
|
||||
Each row has an authoritative `summary.json`. Reset-every-frame also produces
|
||||
one identical output hash across all frames within each run. Thus accumulated
|
||||
state matters in the earlier failing case, but that alone does not establish a
|
||||
history implementation defect. The mixed native/translated cases do not isolate
|
||||
an individual layer, and the full native ABBA rerun passes after the earlier
|
||||
failure. Initialization, cache state, scheduling and arithmetic remain possible
|
||||
investigation targets; no one cause is demonstrated.
|
||||
|
||||
Diagnostic manifests select translated or native K layers while preserving the
|
||||
same object files, private CU output, dependencies and baseline. Runtime logs
|
||||
verify actual translated enc0/dec0 selection for the all-translated case. Those
|
||||
manifest variants remain private under `build/k-network-*-native-output-cu-v1/`
|
||||
and `build/k-translated-network-output-cu-v1/`; no source kernel, runtime default,
|
||||
game or delivered ZIP was changed to use them. First translated-network fixture
|
||||
v1 failed before NGX because its setup command had a quoting error and did not
|
||||
create the selected directory. A native Python fixture setup corrected it; v2
|
||||
passes. No security policy block or bypass occurred.
|
||||
|
||||
The reset diagnostic's timings are not normal K timings. Mixed/translated cases
|
||||
also are not proposed performance configurations. The full native rerun records
|
||||
CPU medians 3.018/2.9155 ms, unbatched/batched, but earlier drift still prevents
|
||||
promoting a default or claiming deterministic behavior. No GPU-time/Linux parity,
|
||||
image-quality or real-game speed conclusion follows from these isolation runs.
|
||||
|
||||
## Latest: rejected kernel candidates and unresolved player temporal exactness
|
||||
|
||||
No new kernel or batching default is promoted. The current delivered ZIP remains
|
||||
v8 with batching off. The working tree adds an experimental
|
||||
`[Interop] BatchInputCopies` switch, default false, plus parser/environment tests
|
||||
and checker support. Missing/invalid values keep older unbatched behavior.
|
||||
CPU player-config tests pass; checker syntax parses. Exactness in the player
|
||||
performance fixture remains unresolved, so keep the switch false.
|
||||
|
||||
`benchmark_k_interop.py --control-native DIR` selects an explicit verified native
|
||||
baseline. `--player-config` stages dependencies and selects batching/native paths
|
||||
through actual INI. It preserves per-run player logs. `--sequence controls` or
|
||||
`batches` repeats identical settings to diagnose determinism. Failed comparisons
|
||||
record mismatching frame names and hashes; they do not receive accepted timing.
|
||||
`compare_k_outputs.py` measures preserved half-output differences without GPU work.
|
||||
|
||||
New private experiments, all artifacts retained and excluded from ZIPs:
|
||||
|
||||
- WGP scheduling for the existing native output override: 64 exact 1080p frames,
|
||||
with CU/WGP warmed CPU interop medians 3.048/3.0455 ms (no reliable gain).
|
||||
At 1440p the candidate failed the exact-output gate: five of 16 compared
|
||||
frames differ, 14,836 components, max absolute difference 0.00537109375;
|
||||
all values finite. Candidate rejected. Evidence:
|
||||
`build/k-output-wgp-vs-cu-{1080,1440}-v1/` and 1440p `mismatch-analysis.json`.
|
||||
- CU input override: recipe changes only eight round-to-zero idioms; no surface
|
||||
stores matched this LDR input variant. Four of 16 frames differ, 993 components,
|
||||
max absolute difference 0.00048828125; finite. Candidate rejected. Evidence:
|
||||
`build/k-input-cu-vs-output-cu-1080-v1/mismatch-analysis.json`.
|
||||
- Legacy/environment mode with validated private CU output plus existing input
|
||||
batching: 128 exact frames across 1080p/1440p ABBA comparisons. Warmed CPU
|
||||
interop medians: 3.072/2.9305 ms at 1080p, 4.4605/4.3345 ms at 1440p,
|
||||
unbatched/batched. `build/k-output-cu-batch-{1080,1440}-v1/summary.json`.
|
||||
|
||||
Player-mode checks exposed an important limit to those narrow successful runs:
|
||||
|
||||
- In the baseline-kernel 16-frame ABBA run, both batched runs match first control
|
||||
exactly, but the final unbatched control differs in 15 frames, 38,472
|
||||
components, max absolute difference 0.01318359375. This does not isolate a
|
||||
batching defect. `build/k-batch-player-1080-v1/repeat-analysis.json`.
|
||||
- Four identical unbatched player runs of eight frames each pass all 32 exact
|
||||
frames. `build/k-player-control-repeat-1080-v1/summary.json`.
|
||||
- A 16-frame player comparison using the validated private CU output differs
|
||||
between control and batched run in eight frames, 1,416 components, max absolute
|
||||
difference 0.00048828125. First difference is frame 8, with RGB differences
|
||||
spread across the image and unchanged alpha. Candidate is not accepted.
|
||||
`build/k-batch-player-output-cu-1080-v1/difference-locations.json`.
|
||||
|
||||
These results leave temporal determinism, arithmetic/initialization and ordering
|
||||
as investigation targets. They do not prove any one of those causes. The kernel
|
||||
candidates failed acceptance, but baseline drift prevents attributing every
|
||||
difference solely to a candidate. No relaxed tolerance was substituted for the
|
||||
exact gate. Private candidates, validated CU control and original runtime remain
|
||||
separate. No GPU-time/Linux parity or game-speed claim, game access, driver/GPU/
|
||||
security change, commit or publication occurred.
|
||||
|
||||
Linux's reported 1.5 ms at 1080p and 2.47 ms at 1440p remain targets, not verified
|
||||
Windows results. The synthetic measurements below include CPU synchronization,
|
||||
format/array copies and NGX execution. They are not directly comparable to a
|
||||
|
||||
@@ -1,6 +1,150 @@
|
||||
# Local gfx1101 drop-in package
|
||||
|
||||
## Current local development package: v4
|
||||
## Current local development package: v14 (2026-10-17)
|
||||
|
||||
`build/d4r-windows-gfx1101-local-v14.zip`, 133,240,107 bytes, SHA256
|
||||
`2f88dec3b4086371efefa8fbfa316c3f7b86fb7858ca1c1bdee63146056f7edf`.
|
||||
Every manifest hash and the exact ZIP entry set verify. It adds strict DS lane exchange in all eleven K objects
|
||||
and FSR-only RGBA32F output with temporal format switching. The original FSR denoiser payload is unchanged;
|
||||
compiler/subgroup/rounding trials produced no reliable gain. v13 and older packages remain preserved.
|
||||
|
||||
Actual fresh extraction, architecture loader and player INI: K control/candidate/candidate/control passes 64 exact
|
||||
frames per size. Warmed CPU interop medians are 3.900 -> 3.3915 ms at 1080p and 5.4015 -> 4.820 ms at 1440p,
|
||||
about 13%/11% faster. These include CPU synchronization/copies/NGX and are separate from standalone HIP GPU
|
||||
timestamps (1.812/2.885 ms). The HIP runner/private model is not in the ZIP.
|
||||
|
||||
FSR-only test through the fresh loader passes 24 moving-camera frames with alternating float guides and half/float
|
||||
output, typeless D32S8 and preserved stencil. Every output component equals the same-frame composed half result,
|
||||
widened independently where needed. FSR+SR dynamic regression passes another 24 frames, retained resources and
|
||||
minimum-bound rejections. Native RR passes six exact camera/reset frames with contracts and enhanced/inherited
|
||||
states. Evidence: `build/k-ds-local-v14-{1080,1440}-v1/`, `build/fsr-local-v14-format-switch-v1/`,
|
||||
`build/fsr-local-v14-dynamic-sr-v1/`, `build/rr-native-local-v14-regression-v1/`.
|
||||
|
||||
All execution is synthetic on gfx1101. Full install.bat was not rerun, and no game, driver/security/GPU setting,
|
||||
commit, branch, PR or publication was involved. Linux targets, FSR denoiser speed, broader encodings/alpha/reference
|
||||
quality and the original remaining parity gaps are not declared complete. This ends the user's narrowed pass.
|
||||
|
||||
## Preserved v13 package evidence
|
||||
|
||||
`build/d4r-windows-gfx1101-local-v13.zip`, 133,239,594 bytes, SHA256
|
||||
`b2ff1157e27b9353afcf287fa8df011c7efa119ac4e26ab7746166ff87b05b34`.
|
||||
Every manifest hash verifies. This is v12 plus FSR/SR dynamic render-size support within the loaded SR library's
|
||||
queried bounds. Below-minimum sizes reject before command recording. The three fixed K objects remain included;
|
||||
the HIP standalone K engine/model is still outside the package. All older packages remain preserved.
|
||||
|
||||
Fresh-extracted architecture loader/INI passes 24 moving-camera dynamic FSR+SR frames, including both below-minimum
|
||||
axis rejections, retained input resources and all SR submissions (`build/fsr-rr-local-v13-dynamic-bounds-v1/`).
|
||||
Native RR regression passes six exact camera/reset frames with contracts and enhanced/inherited states
|
||||
(`build/rr-native-local-v13-dynamic-regression-v1/`). These are synthetic tests with separately staged dependencies.
|
||||
|
||||
Full `install.bat` was not rerun: the NGX core is absent from the download cache and would require the 945 MiB
|
||||
driver archive. No driver runs, game interaction, commit or publication occurred. See `windows-fsr-rr.md` and the
|
||||
newest checklist entry for exact synthetic coverage and remaining limits. Real-game/reference-quality and Linux
|
||||
performance parity remain unverified.
|
||||
|
||||
## Preserved v8 package evidence
|
||||
|
||||
`build/d4r-windows-gfx1101-local-v8.zip` is 130,975,742 bytes; SHA256
|
||||
`962530d1a914268cc6f9d2ec908185f8e4d9e5baafca6800d77ebc3281a647fe`.
|
||||
It adds GPU RGBA32F RR output conversion and temporal RGBA16F/RGBA32F output
|
||||
switching to v7 coverage. Packaged loader/INI E passes 12 exact evaluations
|
||||
across two live features, inverted D32S8 and unchanged stencil. Float32 results
|
||||
match widened standalone half output; this is synthetic engine consistency,
|
||||
not NVIDIA reference quality or game/timing parity.
|
||||
|
||||
Installer still installs pinned SR, RR DLL and NGX core through bundled Python,
|
||||
with optional D/E model generation/deployment. No NVIDIA DLL, private K override
|
||||
or generated model is bundled. Every ZIP manifest hash verifies. Evidence:
|
||||
`build/d4r-windows-gfx1101-local-v8.validation.json` and
|
||||
`build/rr-ngx-local-v8-output-switch-e-v1/summary.json`. Other output encodings,
|
||||
external exposure, FSR execution, K timing parity and original engine gaps remain.
|
||||
|
||||
## Preserved v7 package evidence
|
||||
|
||||
`build/d4r-windows-gfx1101-local-v7.zip` is 130,973,094 bytes; SHA256
|
||||
`b7c68e6f6148c648b6e8e6f47362e0d5f0f6c6796d651d1e762a80d8f07e8d54`.
|
||||
It retains the v6 native Python installer/clean portable tools and adds native
|
||||
RR dynamic render-size handling. NVIDIA SR/RR/core DLLs still download locally;
|
||||
no NVIDIA binary, private K override or RR model is bundled. All final manifest
|
||||
hashes verify. Older ZIPs are preserved.
|
||||
|
||||
Native RR supports per-frame render dimensions from 64 pixels through creation
|
||||
size, with fixed output size and implicit history reset on dimension changes.
|
||||
Model weights/pipelines and the shared packet/fence remain loaded. Packaged
|
||||
loader/INI E tests pass 16 exact evaluations across two live features and changing
|
||||
sizes, both with resized input textures and retained creation-sized textures.
|
||||
Six static D depth/format-switch frames also pass. These are synthetic engine
|
||||
consistency checks, not NVIDIA reference quality, real-game RR or timing parity.
|
||||
See `windows-rr-interop.md` for coverage and limitations. Evidence:
|
||||
`build/d4r-windows-gfx1101-local-v7.validation.json` and
|
||||
`build/rr-ngx-local-v7-dynamic-two-e-v1/`,
|
||||
`build/rr-ngx-local-v7-max-dynamic-two-e-v1/`, and
|
||||
`build/rr-ngx-local-v7-static-regression-v2/`.
|
||||
|
||||
## Preserved v6 package evidence
|
||||
|
||||
`build/d4r-windows-gfx1101-local-v6.zip` is 130,970,436 bytes; SHA256
|
||||
`a144185823af334483543d4989584d65cfa0418049e56fb8e58410b91ae8700b`.
|
||||
It adds the pristine portable-tools v2 inputs and native Python dependency
|
||||
installer to the verified runtime. Every ZIP manifest hash verifies. No NVIDIA
|
||||
DLL, private K override or generated RR model is bundled. All earlier ZIPs,
|
||||
including intermediate v5, remain preserved. V5 lacks the final README update;
|
||||
use v6 for the documented installer flow.
|
||||
|
||||
Extract beside the game executable and run `install.bat`. The batch wrapper
|
||||
uses bundled isolated Python, without PowerShell, system Python or Git Bash.
|
||||
It installs pinned SR 310.9.1 at `d4r/dlss/nvngx_dlss.dll`, RR 310.9.1 at
|
||||
`d4r/rr/nvngx_dlssd.dll`, and 617.14 core at `d4r/ngx/_nvngx.dll`. Driver archive
|
||||
is only extracted, never executed. The Python installer retains the exact
|
||||
existing PowerShell installer URLs and SHA256 pins. Hash identity excludes old
|
||||
596.36 core fixtures.
|
||||
|
||||
Choose N to retain existing RR settings. Optional D/E selection builds and
|
||||
enables a private exact gfx1101 model. Tool inputs copy by manifest into the
|
||||
external cache; generated products remain there and in a versioned private
|
||||
runtime model directory. Existing models remain intact. Configuration selection
|
||||
preserves comments/BOM/newlines and creates an exact external INI backup.
|
||||
Model failure leaves verified DLLs installed and does not select an incomplete
|
||||
model. Automatic RR building currently requires a gfx1101-only package.
|
||||
|
||||
DLL replacement first stages and verifies all changes and external original
|
||||
backups. Replacement failure rolls back applied entries; concurrent edits are
|
||||
preserved. Reruns skip matching DLLs and reuse only verified model products.
|
||||
`install.bat --yes --offline --cache-root PATH --backup-root PATH` supports
|
||||
preverified DLL caches. Add `--rr-preset D` or `E` and `--enable-rr` for model
|
||||
generation/selection without the interactive prompts. Cache and backups must
|
||||
stay outside the game directory.
|
||||
|
||||
Validation uses ignored mock game folders only:
|
||||
|
||||
- Eight CPU tests cover preservation, rollback including newly created files,
|
||||
concurrent edits, cache rejection, pin parity and manifest-only tool copying.
|
||||
- Actual v5 batch wrapper builds/deploys D in 48 steps, verifies 66 model
|
||||
products, exact DLL/INI backups, unrelated-file preservation and an unchanged
|
||||
repeat. E also completes its actual 48-step installer path.
|
||||
- Actual v6 ZIP interactive default installs all three pinned DLLs while
|
||||
declining model generation leaves INI unchanged. E cache reuse/deployment,
|
||||
repeat safety and tampered-tool rejection with unchanged runtime hashes pass.
|
||||
- Native downloader fetches verified official 7-Zip, reuses the hash-verified
|
||||
617.14 driver archive and extracts a core matching its exact pin. No driver runs.
|
||||
- Installer-deployed E selected solely through INI passes six exact synthetic
|
||||
NGX hardware-depth frames through the packaged architecture loader, with
|
||||
optional guides, enhanced/inherited access and stencil preservation. This is
|
||||
engine consistency, not NVIDIA quality reference or real-game RR evidence.
|
||||
|
||||
Evidence: `build/native-installer-v1/validation.json`,
|
||||
`build/native-installer-v2/validation.json`,
|
||||
`build/native-installer-download-v1/validation.json`,
|
||||
`build/rr-ngx-native-installer-e-v1/summary.json`, and
|
||||
`build/d4r-windows-gfx1101-local-v6.validation.json`. The final v6 fixture also
|
||||
passes the same six exact E frames:
|
||||
`build/rr-ngx-local-v6-installer-e-v1/summary.json`. Modified PowerShell release
|
||||
packager passed static parser validation; its fixture suite was not rerun under
|
||||
the recorded script policy. No policy bypass, game access, commit, publication
|
||||
or system setting change occurred. FSR execution, broad game/quality validation,
|
||||
K timing parity and remaining original engine requirements remain open.
|
||||
|
||||
## Preserved v4 package evidence
|
||||
|
||||
`build/d4r-windows-gfx1101-local-v4.zip` is 90,720,715 bytes; SHA256
|
||||
`74fbb4c78dba3e616b9bbba7dc1fe4cddf0a17855968b174f8ea69968d873dfc`.
|
||||
@@ -96,3 +240,38 @@ depth and high-resolution motion vectors; other variants retain the normal path.
|
||||
The workflow output under `build/k-native-cache-workflow/native` is byte-identical
|
||||
to the previously validated 17-object candidate. The new player-mode smoke loaded
|
||||
that directory. These NVIDIA-derived objects stay local and are absent from V3.
|
||||
|
||||
## Local v9: experimental FSR RR payload (2026-10-17)
|
||||
|
||||
`build/d4r-windows-gfx1101-local-v9.zip`, 133,200,126 bytes, SHA256
|
||||
`332719443a9b050e6a5b479816a81fb4d3e482a8956e2c20f2596904f7f6152d`. Built by `tools/windows/refresh_local_package.py`
|
||||
from the verified v8 ZIP (`--fsr-payload build/fsr-payload-v1`); all manifest hashes verified; v2-v8 preserved.
|
||||
|
||||
Added over v8: the shim with the FSR RR backend and its Super Sampling stage (`d4r/_nvngx_gfx1101.dll`);
|
||||
`d4r/fsr/d4r_vkd3d_core.dll` (vkd3d-proton built by `tools/windows/build_fsr_payload.py`, LGPL-2.1, source offer
|
||||
and patches in `d4r/fsr/SOURCE.txt` and `d4r/fsr/patches/`) and `d4r/fsr/amdxc64.dll` (d4r's capability shim, not AMD
|
||||
software); vkd3d-proton, dxil-spirv and dxbc-spirv licence texts in `d4r/licenses/`; `install.bat` with an [F]SR
|
||||
choice and `install-dependencies.py --enable-fsr` / `--install-fsr` (AMD's denoiser, SHA256 `48f1e588...`, is
|
||||
downloaded hash-verified, backed up and rolled back like the NVIDIA DLLs, and `Backend = fsr` is written to
|
||||
`d4r.ini` with an external backup); `d4r.ini` key `[RayReconstruction] FsrDenoiser`; README text.
|
||||
|
||||
Still not bundled: NVIDIA DLLs, any RR/K model, AMD's denoiser. FSR RR is off by default.
|
||||
|
||||
Verification (synthetic only, no game): ZIP extracted fresh and `test_fsr_rr_ngx.py` run against the extracted files
|
||||
(`build/fsr-rr-ngx-upscale-v9-v1`: PASS, SR used, RMSE 0.289 vs 0.581 noisy input); release-package test PASS
|
||||
cases=7 including FSR payload accept/reject cases (`build/release-package-fsr-v1`); installer unit tests 12 OK;
|
||||
player-config test PASS cases=2; installer FSR path run for real on the extracted copy (AMD DLL downloaded,
|
||||
hash matched, installed, single `Backend` line changed, backup equals original, second run changes nothing).
|
||||
A full `install.bat` run was not repeated: the NGX core is not in the local download cache and would pull the
|
||||
945 MiB driver archive. The new K work (HIP network, authentic K model) is NOT in v9.
|
||||
|
||||
## Local v11: v9 plus FSR tuning, GPU timing and dynamic-size refusal (2026-10-17)
|
||||
|
||||
`build/d4r-windows-gfx1101-local-v11.zip`, 133,236,207 bytes, SHA256
|
||||
`ba91dd6cc178865244c9903a461f213cdcacf38bcf6905e919ba5e8ee652b228`; built the same way as v9 (verified v8 base,
|
||||
`--fsr-payload build/fsr-payload-v1`), all hashes verified. v9 and an intermediate v10 are preserved but superseded.
|
||||
Differences from v9: `d4r.ini` keys `FsrStabilityBias` (default auto) and `FsrDetail`; the shim's GPU-timestamp log
|
||||
(`D4R_FSR_RR_LOG`), motion/depth dump diagnostic, tuning keys, exposure handled by the SR stage, and a clean refusal
|
||||
of render sizes below the creation size. Validated from a fresh extraction with `test_fsr_rr_ngx.py`: static
|
||||
same-size 0.127 (noisy 0.485), moving 640x360 -> 1280x720 0.2135 (noisy 0.554), moving same-size 0.1069 (noisy 0.486);
|
||||
all use SR. Synthetic only, no game. The HIP K network and authentic K model are NOT in this package.
|
||||
@@ -1,5 +1,95 @@
|
||||
# Native RR D3D12/Vulkan bridge gate
|
||||
|
||||
## Current output coverage: RGBA16F and RGBA32F
|
||||
|
||||
Native RR now accepts `DXGI_FORMAT_R32G32B32A32_FLOAT` output as well as the
|
||||
existing RGBA16F output. Model inference remains unchanged. A same-size nearest
|
||||
Vulkan image blit widens the model's half output on the GPU, then copies the
|
||||
float32 image through the shared packet into the borrowed D3D12 output texture.
|
||||
The backend checks source/destination blit support and allocates a private
|
||||
device-local conversion image only when needed. Packet output space reserves
|
||||
the largest supported texel size. No CPU tensor conversion enters production.
|
||||
|
||||
Output format may change between frames without feature/model recreation or
|
||||
history reset. The conversion image is retained, with explicit transfer
|
||||
read/write barriers. Output dimensions remain fixed. Other encodings, external
|
||||
exposure conversion and game/reference-quality validation remain open.
|
||||
|
||||
Synthetic D: eight frames across dynamic dimensions, two live features,
|
||||
creation-sized input resources, optional guides and enhanced/inherited states
|
||||
pass all 16 evaluations. Every RGBA32F component matches the independently
|
||||
widened standalone half reference exactly. Synthetic E: six inverted D32S8
|
||||
frames alternate half/float32 output without losing temporal consistency or
|
||||
changing stencil. Packaged v8 loader/INI with two live E features passes all 12
|
||||
evaluations. Final handles/parameters are released before queued submission.
|
||||
This establishes output conversion and engine consistency, not NVIDIA reference
|
||||
quality, game RR or a performance improvement.
|
||||
|
||||
Evidence: `build/rr-ngx-output32-d-v1/summary.json`,
|
||||
`build/rr-ngx-output-switch-e-v1/summary.json`, and
|
||||
`build/rr-ngx-local-v8-output-switch-e-v1/summary.json`. Prior baseline binaries
|
||||
remain in `build/rr-output32-baseline-v1/`; older ZIPs remain unchanged.
|
||||
|
||||
## Current native RR coverage: dynamic render sizes and two live features
|
||||
|
||||
Native NGX feature 13 accepts per-frame render dimensions from 64 pixels through
|
||||
the feature's creation dimensions. Output size remains fixed. Each queued frame
|
||||
owns its render dimensions alongside the existing resource/scalar/matrix
|
||||
snapshot. Dimension changes rebuild size-dependent views, descriptors and
|
||||
temporal history only after prior GPU work retires. Vulkan model pipelines,
|
||||
uploaded weights, the creation-sized shared packet and timeline fence survive.
|
||||
History resets implicitly on a size change, even without a caller Reset flag.
|
||||
Unchanged dimensions preserve history. Invalid dimensions fail before recording
|
||||
or submission; failed reconfiguration poisons the backend rather than allowing
|
||||
partially rebuilt history to run.
|
||||
|
||||
`prepare_rr_dynamic_fixture.py` generates independent standalone segment
|
||||
references and combines them into an NGX sequence with no explicit reset at size
|
||||
changes. The sequence is 96x96 twice, 64x64 twice, 96x96 twice, and 72x80 twice,
|
||||
with fixed 192x192 output and alternating absent/present optional guides.
|
||||
The 48x48 first fixture failed at the engine's existing 64-pixel minimum before
|
||||
NGX testing; it remains preserved. Corrected D/E fixtures each pass eight exact
|
||||
frames. D passes without SR dependencies; E passes player INI selection.
|
||||
|
||||
`test_rr_ngx.py --dynamic-extents` checks every size/output and the exact resize
|
||||
diagnostic sequence. `--two-features` evaluates two live RR features with separate
|
||||
Vulkan devices on each game command list. It reads back both outputs separately
|
||||
and releases both handles/parameters before final submission. Packaged v7 E
|
||||
passes all 16 evaluations with enhanced/inherited access, optional guides and
|
||||
owned geometry. `--max-resources` retains creation-sized D3D12 input textures
|
||||
while the render rectangles change; that path also passes 16 exact evaluations.
|
||||
This tests multiple live handles and ordered delayed submission, not parallel
|
||||
GPU inference, threaded submission or asynchronous throughput.
|
||||
|
||||
Six static D frames still pass inverted D32S8 depth, unchanged stencil,
|
||||
RGBA32/RG32/scalar-R16 guide switching and AutoExposure. All comparisons are
|
||||
against the same standalone engine, not NVIDIA quality-reference frames or game
|
||||
RR. No performance gain is claimed for resize support or model reuse.
|
||||
|
||||
Evidence: `build/rr-ngx-dynamic-d-v2/summary.json`,
|
||||
`build/rr-ngx-dynamic-e-v2/summary.json`,
|
||||
`build/rr-ngx-dynamic-two-features-d-v1/summary.json`,
|
||||
`build/rr-ngx-local-v7-dynamic-two-e-v1/summary.json`,
|
||||
`build/rr-ngx-local-v7-max-dynamic-two-e-v1/summary.json`, and
|
||||
`build/rr-ngx-local-v7-static-regression-v2/summary.json`.
|
||||
The first E wrapper run completed all exact GPU outputs but failed its diagnostic
|
||||
check because player mode redirects stderr to d4r_nvngx.log. The verifier now
|
||||
reads that log in player mode; the corrected run passes. Earlier artifacts and
|
||||
baseline shim/probe copies remain intact under build/rr-dynamic-baseline-v1/.
|
||||
The first v7 static regression invoked the target DLL directly beside its
|
||||
player INI while requesting an environment-only/no-SR test. Player configuration
|
||||
correctly overrode those environment settings and rejected missing local SR
|
||||
dependencies before GPU evaluation. The corrected packaged-loader/player-INI
|
||||
fixture supplies pinned dependencies and passes all six frames; no policy block
|
||||
or bypass occurred.
|
||||
|
||||
Other existing native coverage includes optional guides, float/UNORM inputs,
|
||||
typed/typeless D32/D32S8 depth, preserved stencil and creation-flag validation.
|
||||
Guide encodings, external exposure conversion, output-format conversion, output
|
||||
size changes, broader concurrency, game/reference-quality validation and FSR
|
||||
execution remain incomplete. Older sections below describe earlier milestones;
|
||||
the newest checklist entries supersede those earlier limitations.
|
||||
|
||||
## Runtime extraction in progress (2026-10-16)
|
||||
|
||||
The packet layout now has a geometry-only constructor with no fixture I/O.
|
||||
|
||||
@@ -1,5 +1,25 @@
|
||||
# Local Windows RR model cache
|
||||
|
||||
## Installer integration (supersedes earlier integration gaps below)
|
||||
|
||||
The local v6 runtime ZIP now includes clean portable tools and
|
||||
`tools/windows/install_dependencies.py` as `install-dependencies.py`.
|
||||
`install.bat` uses bundled Python to install all three pinned NVIDIA dependencies,
|
||||
including `d4r/rr/nvngx_dlssd.dll`. It optionally builds/deploys/enables D/E.
|
||||
No system Python, pip, PowerShell build wrapper or Git Bash is required.
|
||||
Only gfx1101-only packages support automatic RR building at present.
|
||||
|
||||
Tool sources copy by verified manifest to the external dependency cache;
|
||||
private model products stay outside package inputs. D and E actual installer
|
||||
builds complete 48 steps. D deployment verifies all 66 products and repeats
|
||||
without new backups or INI changes. V6 interactive DLL-only installation and E
|
||||
cache reuse pass. A modified bundled tool is rejected without runtime changes.
|
||||
The installer-deployed E model passes six exact synthetic NGX hardware-depth
|
||||
frames through packaged loader/INI selection. Model-build failure leaves the
|
||||
separately verified DLL installation in place. See `windows-local-package.md`
|
||||
for archive identity, commands and evidence. No new inference speed or image
|
||||
quality claim follows from this installer integration.
|
||||
|
||||
## Native Python builder without Git Bash
|
||||
|
||||
`tools/windows/build_rr_model.py` now runs the extraction, template generation,
|
||||
|
||||
Reference in new issue
Block a user