fix(vk): actor motion pairs a model's copies by place, so the Gossip Stones stay whole under frame generation #59
No reviewers
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
needs measurements
question
testing wanted
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot!59
Loading…
Reference in a new issue
No description provided.
Delete branch "pmwork-personal/Longshot:fix/actor-motion-copies"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
Under DLSS Frame Generation the four Gossip Stones by the Temple of Time break apart in the made frames: a stone is drawn part way to its neighbour, doubled or smeared. A player reported it (RTX 5080, 4x); it happens on an RTX 5090 at 3x too.
What changed
The stones are one skinned model drawn four times, and actor motion paired each draw with the frame before's by draw order. The game draws the copies in another order from frame to frame, uses two models for them, and a stone that comes into view has no draw in the frame before, so a stone took its neighbour's pose as its own and its motion pointed at the neighbour.
ub_readand staged into the pose buffer, not copied from the game's memory after the frame. A pose that cannot be read falls back to the old copy;RX_VK_DLSS_ACTOR_LIVE=1forces it for an A/B.dlss_actor::place_of; the copies share one origin on a grid of 10 units and are placed by their bones). All copies at once, the nearest pairs first, never further thanRX_VK_DLSS_ACTOR_REACHworld units in one frame (default 1; Link running moves about 0.1, the stones stand 2.3 apart); on a tie at one place the same n-th first (dlss_actor::pair_by_place). A copy without a match gets the camera's motion for that frame.Actor motion feeds the whole temporal chain, so FSR 4 and FSR 3.1 get the same motion; with
RX_VK_DLSS_ACTORS=0nothing changes.Cost, and a follow-up: the pose reads run in
temporal_note_skinned_drawwhile the temporal lock is held, one allocation a draw (up to 13 KB). A follow-up commit here moves them out of the lock, into one arena a frame, after a game run.Measurements
Before: Hookshot main @
ba3d3f73(Longshot's base before the rename)After: the same with this change, #2787's layouts and the close-up fix (the actor-motion close-up PR) @ 06ad86fe (log
v2.1.0-rc.3-281-g06ad86fe); this branch is that change on Longshot main @d4a69456Hardware: RTX 5090 32 GB, driver 621.24, Ryzen 7 9800X3D, Windows 11 Pro
Scene: Castle Town, the four Gossip Stones by the Temple of Time, running past them while the camera turns; 3840x2160, DLAA, DLSS Frame Generation 3x (NGX), Reflex On + Boost, no frame rate cap
Method: about 30 s a run, judged by eye in play; the numbers from the status lines in the log
RX_VK_DLSS_ACTORS=0: whole)One run each, not interleaved: the fault is either there or not, so no median was taken.
Not tested
Not run on Longshot main itself (only the checks below), nor on AMD or Intel GPUs: the actor motion feeds DLSS and FSR alike, so a run with FSR 3.1/4 would help. On this branch: the syntax check of
vk_temporal.cppandvk_draw.cpppasses;python -I -B tests/run_all.py: 488 passed, 37 skipped (Linux only), 4 failed, none from this change:test_portable_builder_startup.py(this PC's .NET packages),test_fpx_sticky.pyandtest_spawn_emit.py(an a64-kit test cannot find<algorithm>here; both fail on main the same way),test_invalidate_vcore.py(passes when run alone: flaky under 16 jobs);tests/test_dlss_actor.pywith the SPIR-V header check (the Khronos glslang 16.6.0) passes.Screenshots
None yet: the fault shows only in made frames. A before/after clip will follow.
Issues
Upstream: the same change is proposed to NotRexed/Hookshot as https://github.com/NotRexed/Hookshot/pull/2992.
Checklist
For everyone
type(scope): description).main.python -I -B tests/run_all.pyrun and passing (any failure that also fails onmainis named above).third_party/untouched (a new folder with aPROVENANCE.mdinstead).Assisted-by:/Co-Authored-By:trailers.If applicable
docs/tested-configurations.mdfor each measured run.mainand passing here.🤖 Generated with Claude Code
View command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.