Repository navigation
PR684 - Intel GPU crash fixes, fixed overexposed image on intel, pipeline cache crash mitigation for intel GPUs - #754
Merged
Merged
Conversation
Before these changes, intel dGPU device loss would occur soon after boot. These changes also fix several intel dGPU crashes and banding. Task shaders: payload word 1 was never set which caused Intel device loss. Now zeroed at start, followed by a barrier. Banding: shaders that previously lost a conditional barrier raced on Intel dGPU, those shaders are now forced to subgroup size 32. Pipeline cache: Intel driver crashed when cache was read during pipeline builds. Flush is now skipped for the driver. Closing the game: state tracker kept stale pointer to channel state which crashed on shutdown. ClearChannel() resets it. Size 32 is a workaround, not a real barrier Tested A770, driver 32.0.101.9150, Windows, MKW Assisted-by: Claude Opus 5.5 (debugging, code, testing)
Pipeline Cache now waits for shader build workers before saving cache on drivers where CanReadPipelineCacheDuringBuilds() is false. Tested on A770, MKW. Closing during shader builds closed cleanly. Assisted-by: Claude Opus 5.5 (debugging, code, testing)
New ClearRequests() in ThreadWorker, close waits only for running builds Tested A770, MKW, closing during shader builds Assisted-by: Claude Opus 5.5 (debugging, code, testing)
Info::UsesWarpOps() replaces the copy in the compute pipeline so graphics mesh/task stages can use the same condition, including shaders that lost a conditional barrier.
Graphics pipelines built the required-subgroup-size struct but never attached it (it was [[maybe_unused]]). Compute pipelines already require 32 when they use warp ops. Mainly applies to intel, because there we have 16-wide pipelines. Foliage rendered as glowing white on Intel ANV. Its leaf mesh shaders compact visible leaves with Ballot + BitCount(ballot & LtMask). ANV compiled the large colour-pass shader 16-wide, so the two halves of each workgroup wrote the same slots, while the small pre-pass shader ran 32-wide. The colour pass then failed its depth-EQUAL test against the pre-pass, and the sky showed through. Signed-off-by: Andreas Heider <andreas@heider.io> Assisted-by: Claude Opus 5.5 (debugging with RenderDoc, fix)
Shaders that lost a conditional barrier now get the guest warp size on mesh and task stages too, matching compute.
|
Retargeted to |
Contributor
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait...
|
Collaborator
Author
Test resultsIntel GPU users
Remaining visual artifacts include:
AMD/NVIDIA users
|
12 of 21 tasks
10 of 20 tasks
GoatTech-42
added a commit
to GoatTech-42/Lichii
that referenced
this pull request
Nov 7, 2026
…e (ports Eglantine #754) Port of Djihads80/Eglantine#754 commit 8e87cf5. A task that culls all threads left the payload undefined; Intel garbage there launches enough workgroups to lose the device (Intel Windows device loss in Mario Kart World).
EddieRicobom
pushed a commit
to EddieRicobom/eggcellent
that referenced
this pull request
Nov 8, 2026
…e (ports Eglantine #754) Port of Eglantine-Community/Eglantine#754 commit 8e87cf5. A task that culls all threads left the payload undefined; Intel garbage there launches enough workgroups to lose the device (Intel Windows device loss in Mario Kart World). (cherry picked from commit a2721909d26671f84e6796257cea6f76c9199879)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.




Summary
Intel Arc dGPUs lost the device soon after boot in Mario Kart World, and also showed banding and crashed on shutdown. This PR fixes those.
Shader::Info::UsesWarpOps()holds the warp-op condition so compute and graphics can't drift apart.vkGetPipelineCacheDatawhile pipelines build. The periodic flush is skipped, and queued builds are dropped and running ones drained before the final save, on that driver only.ClearChannel()resets it when the bound channel is released and when the rasterizer is destroyed.Vendor reach
ClearChannel()requiredSubgroupSizeStagesincludes the stage: ANV, RADV on GFX10+, others per driver.Checked against Mesa (ANV, RADV) and the Vulkan spec. ANV reports subgroup sizes 8 to 32 and lists compute, task and mesh as required-size stages. RADV on GFX10+ reports 32 to 64 and accepts 32 or 64.
#541 sets
supports_conditional_barriers = true. On my A770 keeping those barriers on Windows causes device loss. I am not doing that here and will revisit it separately.Assisted-by: Claude Opus 5.5 (debugging, code, testing, review)
Type of change
Testing
Cross-testing on NVIDIA/Linux, Intel/Linux and AMD/Linux is in progress. Results will be posted here. The change most worth watching on other vendors is the task prologue.
Games tested:
Mario Kart World 1.8.0: no more crash on startup or banding
Donkey Kong Bananza 3.2.0: black screen with these changes and with the stock build
Checklist
Related to #130, #706, #66, #745
Fix these before you post it:
Summary by CodeRabbit