GPU hang (Xid 109) in the RT reflection trace (c_defer_rtrefl_trace) -- persists past ab53e12cc9 #1128
Labels
No labels
amd
avatars
bug
builder
cannot-reproduce
crash
epic
feature
from-viewer
gl-removal
known-limitation
monitoring
parity
perf
platform
priority
critical
priority
high
priority
low
priority
medium
provenance
rendering
rt
status
in-progress
status
testing
status
up-next
triage
ui
upstream
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sky_line/Slipstream#1128
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
GPU hang (device lost) in the ray-traced reflection trace. Same signature as #995 / #996 / #997, and it persists past
ab53e12cc9("RT reflections: GPU hang, Xid 109", rtRaySane: every rayQueryInitialize validated). Owner rule: this stays open until the cause is proven (a decisive repro + fix, not a plausible guess) -- it has survived several fixes.Occurrence (owner, 2026-10-27 05:17:56 UTC): RTX 5090, Linux, NVIDIA 615.78.08, dev
f3c24ffab5(desktop, not VR). Camera very close to the own avatar's hair (static, unrigged, opaque mesh), pose tool open, night, rain. Not a page fault; VRAM 4.6 / 21.5 GB.NVRM: Xid 109, CTX SWITCH TIMEOUT(a hang, the TDR class).VK_ERROR_DEVICE_LOSTfrom vkWaitForFences (vk_swapchain.cpp:258); VK_EXT_device_fault: no fault address (instruction pointers only).c_defer_rtrefl_trace, stage 0x2000 last=c_defer_rtrefl_sel-- the RT reflection TRACE dispatch started and never finished (the mark is recorded after the trace dispatch).g_gi_windowat both stages -- graphics was waiting at the GI early-trace join (asyncJoinUpTo) for the async segment; it is the waiter, not the hang.Related history: #995/#996/#997 (RTX 4070 Windows, breadcrumbs incl.
g_defer_rtrefl, 2-3 s frames = TDR); triage notes cluster 4. The AMD RX 9070 XT RT-mask hang (#874/#889/#945/#973) is the same kind (ray-query dispatch that never returns) in a different pass.Plan: root-cause pass on the reflection trace (kernel loops, indirect dispatch sizing / tile counts, any loop whose bound comes from data, what changed in this path since
ab53e12cc9incl. the visibility-queue work), a bounded-iteration guard that turns a runaway into a counted, logged event instead of a TDR, and a decisive repro. Close only with proof.Second occurrence, different kernel (owner, 2026-10-27 06:47:35 UTC, RTX 5090 Linux, driver 615.78.08, dev
674219b7bb= the #1128 guard + ray-list header build, beacon OFF,RenderVKVisQueue 30set live ~2 min earlier for an occupancy A/B):NVRM: Xid 109, CTX SWITCH TIMEOUTagain; no fault address.c_defer_shadowsunwalk, stage 0x2000 last=c_vq_prod-- with VisQueue bit 16 the frame-level walk wave runs every queued consumer's walk back to back; the GPU hung in that walk phase (sun-shadow walk or the walks right after), NOT in the RT reflection list trace. Graphics again only waiting atg_gi_window(GI join).rtRaySane refused 0 rays (float form passed 0)in every guard window this session incl. the three rings at the loss -- no non-finite rays caught (the rings are the frames before the hung one).Reading: two different ray-query kernels (reflection list trace; VQ shadow/visibility walk) have now hung the same way with no bad ray caught. Points at what they share -- the acceleration structures / driver traversal -- rather than one kernel's logic; the visibility queue (back-to-back walks, heavier async segment) makes it easier to hit. Next: extend the hang beacon to the VQ walk kernels so a hang in either names its stuck ray, and compare stuck rays' TLAS instance / region.
Two more occurrences, same signature (TheSlowly, 2026-10-27; RTX 5070 Ti, Windows, NVIDIA 610.88; test build = main
a152d3c727+ #1167 / #1168, neither touches RT):g_gi_window/g_gi_windowg_gi_window/g_gi_windowc_defer_rtrefl_trace/c_defer_rtrefl_selc_defer_rtrefl_trace/c_defer_rtrefl_selrtRaySane refused 0, query budget cut 0, candidate budget hit 0).I have the full 21:05 report (
slipstream_gpu_lost_last.txt, submission list and async segments) if you want it attached.Third owner occurrence, same signature (2026-10-29 05:01:44 UTC; RTX 5090, Linux, NVIDIA 615.78.08; test build
ae5a243897= mainf58a6c9619+ the current test batch; window focused, 787 s into the session):NVRM: Xid 109, CTX SWITCH TIMEOUT;VK_ERROR_DEVICE_LOSTfrom vkWaitForFences; no fault address.c_defer_rtrefl_trace, stage 0x2000 last=c_defer_rtrefl_sel. Graphics:g_gi_windowat both stages (only waiting at the GI join).Working hypothesis (unproven): an acceleration-structure lifetime problem. A BLAS, its compaction source, or memory freed when an object is deleted gets released or reused while a TLAS still in flight on the async queue references it, so the traversal loops. It would explain why validating rays (
ab53e12cc9) did not help. A rezzing weapon may turn this into a repeatable repro, and the owner is trying that now. Source audit of every BLAS free / compaction / retire path against the async frames-in-flight fence is in progress.User reports with the same signature:
c_defer_rtrefl_trace/c_defer_rtrefl_sel, graphicspr_early. #1060's guard: 0 rays refused, candidate budget hit 601154 walks.g_defer_rtrefl_fwd/g_defer_rtrefl_trace.