After the cache-corruption incident described above (deleting 442 MB Fossilize + 1.5 GB NVIDIA cache), the game crashed consistently at `wait_for_free_roam_start` within 73–91 seconds even after rebuilding some cache — faster than before the caches were cleared.
Root cause: with a cold shader cache the NVIDIA driver must compile pipeline states at runtime during the initial world load. The concurrent GPU work (sparse page commits + runtime shader compilation) was enough to trigger Xid 109 even with the forza-workarounds use-before-alloc fix active. Anything that increases the number of shader variants (RT pipelines, DLSS variants, etc.) makes the window narrower.
Fix that got past initial loading:
Setting RT Reflections = Off (was Low) in the game graphics settings:
<!-- UserConfigSelections -->
<option id="RTReflectionQuality" value="0"/> <!-- was value="1" (Low) -->
RT shaders are among the most expensive pipeline variants to compile. Removing them from the compile queue during loading reduced concurrent GPU pressure enough that the game pushed through `wait_for_free_roam_start` while the caches are still rebuilding.
| Setting | Value |
|---|---|
| VKD3D-Proton | forza-workarounds CI build (merge 3d98c83d) |
| VKD3D_CONFIG | no_upload_hvv,single_queue |
| RT Reflections | Off (value=0) |
| RT GI | Off |
| DLSS / FG / Reflex | Off |
| Fossilize cache | ~107 MB (rebuilding; was 442 MB before incident) |
| NVIDIA shader cache | ~263 MB (rebuilding; was 1.5 GB before incident) |
<UPTIME Value="2011.903076"/> <!-- 33.5 minutes total -->
<UPTIME_DRIVING Value="885.358032"/> <!-- 14.75 minutes driving -->
<LAST_STATE_MACHINE_STACK Value="wait_for_event_start, main_loop_internal, main_loop, root"/>
<SYSTEM_MODEL_BUFFER_ALLOCATOR_STATUS Value="590112608, 805306368, 2147483648"/>
<!-- 562 MB used / 768 MB soft limit = 73% -->
<VRAM_USED Value="4070899712"/> <!-- 3.79 GB / 5.19 GB budget -->
Game loaded successfully, completed a race, and played open world for ~33 minutes before crashing at event/race loading — same 805 MB sparse commit boundary as previously reported. This is consistent with the pre-incident behaviour.
The shader caches are continuing to grow with each session. The crash at the 805 MB boundary during race/event loading is the remaining unfixed issue.
This crash is highly sensitive to GPU scheduling during sparse commit windows:
The underlying race (use-before-alloc on sparse page commit) appears to be partially mitigated by the forza-workarounds build but not fully covered for all commit sizes/timing patterns, particularly the large 590 MB commit during race/event loading.
The work-around branch seems to rely on the descriptor heap implementation. Is that even in the 580 branch of drivers?
No, it's added in 595 branch but not working very well. Vulkan beta drivers 596 improve that a lot.
Slop. Root cause is known and NV is aware. Closing.
proton experimentalx1 2026-05VKD3D_CONFIGx2 2026-05VKD3D_CONFIG=no_upload_hvv,single_queue`**x1 2026-05
System
3d98c83dd7ce3a00a22165eccacbd71b057e7846(2026-05-20, includes all 5 commits from PR #3033)no_upload_hvv,single_queueGame
Forza Horizon 6 (Steam AppID 2483190)
All NVIDIA-specific features disabled in-game: Frame Generation = Off, NVIDIA Reflex = Off, RT = Off.
Symptom
Kernel Xid 109 (CTX_SWITCH_TIMEOUT) causes a GPU hard hang. Game reports
FHC00 Video Card Crash. Reproducible every session at two distinct crash points described below.Crash history and what each change affected
no_upload_hvvno_upload_hvvno_upload_hvvsection_two_transition_in, model buffer 580/640 MB (91%)no_upload_hvv,single_queue+ lower geometrywait_for_car_loading_flow_load_cars, model buffer 380/805 MB (47%)no_upload_hvv,single_queue+ lower geometrywait_for_free_roam_start, model buffer 198/201 MB (98.5%)no_upload_hvv,single_queue+ lower geometrywait_for_free_roam_start, model buffer 198/201 MB (98.5%)Crash report detail (latest best run — race loading, 36 min)
From the game's own
CrashReport.xml:Earlier crash detail (open-world section transition, partially fixed by single_queue)
DLSS Super Resolution also triggers the bug — and corrupts the shader cache
Enabling DLSS Super Resolution (not Frame Generation) caused an immediate regression: the crash moved from the race-loading boundary (~36 min) back to the initial open-world loading phase (
wait_for_free_roam_start, ~5 min). The model buffer soft limit during this phase is only 201 MB and DLSS pushed usage to 198 MB (98.5%) — the same sparse commit boundary, just hit much earlier because DLSS initialization loads additional GPU resources.Disabling DLSS (back to NoAA) did not restore stability — the game continued crashing at the same
wait_for_free_roam_startboundary within ~2 minutes. Root cause: toggling DLSS on and off corrupted the Fossilize pipeline cache (1.9 GB total — 442 MB Fossilize.fozfiles + 1.5 GB NVIDIA shader cache), leaving it with a mix of DLSS and non-DLSS shader variants. The game was stalling during runtime shader compilation at the exact moment of the large sparse commit batch, changing the timing enough to consistently trigger the race.Fix: deleting both caches (
shadercache/2483190/fozpipelinesv6/andshadercache/2483190/nvidiav1/) and allowing them to rebuild from scratch restored stability to the previous level (able to reach race-loading boundary again).This confirms that the crash is sensitive to the exact timing of GPU operations during the sparse page commit window — anything that changes shader compilation timing (new pipeline variants, cache misses) can move the crash point earlier or later within the same session.
Hypothesis
All crashes share the pattern:
SYSTEM_MODEL_BUFFER_ALLOCATOR_TYPE = Sparse— the game commits large batches of sparse buffer pages during scene/asset transitionsD3D_HR_ERROR = 0x00000000) — the hang is not reported by the D3D12 runtimesingle_queueserialises the submission ordering and pushed the crash from the 640 MB boundary (~5 min) to the 805 MB boundary (~36 min). It does not prevent the hang at either boundary — it only changes which one is hit first.What partially worked (workarounds)
forza-workarounds CI build (PR #3033 merge) — replaced VKD3D-Proton DLLs in Proton Experimental with the CI artifact from the
forza-workaroundsbranch. Moved crash from ~20 min (first open-world entry) to ~5 min (section_two_transition_in).VKD3D_CONFIG=no_upload_hvv,single_queue— addingsingle_queuemoved the crash fromsection_two_transition_in(~5 min, 640 MB boundary) towait_for_car_loading_flow_load_cars(~36 min, 805 MB boundary).Lowering Environment Geometry Quality (Medium → Low) — reduced model buffer peak from 91% to 47% at the 640 MB boundary, helping
single_queueget past it.Keeping DLSS / Reflex / Frame Generation off — DLSS Super Resolution alone (without FG) is enough to push the 201 MB initial-load boundary to 98.5%, causing an earlier crash than the 640 MB boundary.
The race-loading crash at ~36 min remains unsolved. Opponent car loading triggers a fresh large sparse commit while VRAM is already at 81%, and
single_queuealone does not prevent the hang at that boundary.Notes