Repository navigation
fix(render): reset temporal history when reprojection is invalid - #1715
Conversation
8a9f7a5 to
4daa515
Compare
5f221ff to
ec1b03e
Compare
hckrman101
left a comment
There was a problem hiding this comment.
Looks good. The reprojection now rejects non-finite inputs and float-overflowing outputs, and both the DLSS and FSR paths promote a failed reprojection to a history reset, which is the right thing when motion vectors are off. Existing first-frame, frame-gap and FSR size-change resets are untouched, and the new test is registered in run_all.py. CI is green.
Nit: the first-frame/gap case already forces reset, so the new line only matters when the matrix math fails, which is exactly the intent. Nothing to change.
ec1b03e to
4f5f0db
Compare
|
Heads-up: this conflicts with main now (a lot landed today). Could you merge main into the branch (or rebase) and resolve the conflicts? Thanks! |
0888482 to
11bdf4e
Compare
|
Refreshed on main |
Assisted-by: OpenAI Codex Co-Authored-By: OpenAI Codex <noreply@openai.com>
11bdf4e to
19b81b7
Compare
hckrman101
left a comment
There was a problem hiding this comment.
Re-reviewed after the rebase onto main. The change is the same as the one I approved, now applied to the shared chain in vk_temporal.cpp (DLSS/FSR 4) and to vk_fsr3_inputs.cpp (FSR 3.1): a failed reprojection forces reset, and reprojection() rejects non-finite inputs and float-overflowing results. The conflict I flagged is resolved and GitHub reports the branch mergeable.
I checked that the reset reaches each consumer: f.reset = reset in vk_temporal.cpp feeds InReset in vk_dlss.cpp and d.reset in vk_fsr4.cpp, and FSR 3.1 sets f.reset = reset directly. The new test splices those production fragments into its fixture, so it follows the code.
CI: the Windows builder, DLSS/FSR 4 link check, AppImage, actionlint and the SPIR-V/F2I jobs pass. Python source checks fail on both OSes, but main's own source-regressions run at 8c92fe3 is red too, and the author documents the same bake and logging failures there. I found nothing temporal in them.
Nit: SDK recreation and render-scale transitions are untested, as the author says. Nothing to change here.
Summary
Invalid camera reprojection disables motion vectors but can leave temporal history without a valid mapping. Reset that history in the same frame.
Technical changes
Validation
Actual reprojection, reset policies and consumers pass singular/non-finite, overflow, recovery, gap and ultrawide projection cases.
Head
19b81b7, main8c92fe3: full local suite 301 passed / 3 failed / 21 skipped, versus 299 / 4 / 21 on the exact base. Three shared failures: Windows symlink privilege, missingzstdCLI in the new bake fixture, and the local Windows-header harness. Baseline also timed out in frame-wait; its identical production block and fixtures passed all18 cases in focused reruns on both base and candidate. Original counts are preserved.Matching NGX host/backend build passed with officially regenerated runtime. Windows builder, Linux AppImage and NGX CIs passed. Source CI failed: Windows cannot load libzstd and hits a logging timing assertion; Linux rejects the bake compiler's C++23 probe. Exact upstream baseline CI has those failures too. This run additionally timed out in Windows bake_skeleton (600s). No temporal check failed; the source workflow remains red. Bounded native smoke on RTX5070Ti passed: copied Kokiri checkpoint, official DLSS310.9.16/preset K loaded and evaluated, window/fullscreen, pause/resume and exit0; eight3440x1440 engine captures. Internal upscale dimensions stayed fixed. SDK recreation, render-scale transitions, quality and performance comparisons remain untested.