GPU Crash with PageFault in ScreenProbeTraceVoxelsCS

Hello Unreal Engine Support team!

We have found a GPU crash with necessary debug symbols that happens in LumenScreenProbeTracing.usf|ScreenProbeTraceVoxelsCS.

This error was reported for users playing on low settings, but associated breadcrumbs reported for users with GlobalIlluminationQuality settings 1(majority), 2, 3.

Private ticket with a message provided below contains Nvidia Aftermath Dump with Symbols.

GPU crashes in EvaluateGlobalDistanceFieldHit.

[Content removed]

Based on my understanding of the bug causing this crash I have made a PR https://github.com/EpicGames/UnrealEngine/pull/14159

Please, take a look on it and let me know if Unreal Engine engineers maintaining this code suggest a different fix.

Thank you

[Attachment Removed]

Steps to Reproduce
This crash was reported by crash report system.

[Attachment Removed]

Hello,

Thank you for providing this fix. We’ve received the PR and are taking a look, but the Epic team will be on holiday break starting next week (Dec 22, 2025) and ending Jan 5, 2026 so you will likely not hear back regarding this issue until then.

We wish you happy holidays!

[Attachment Removed]

Hi! Thanks for the heads up!

Happy holidays to you, too!

[Attachment Removed]

Hi, I’m passing this case to the assigned engineer in case there are questions about the issue or fix.

[Attachment Removed]

Hi Oleksii,

Thank you for your report. I looked at the changes and it looks like this:

float3 VolumeUV = frac(frac(saturate(some_math)));
int3 VolumeCoord = VolumeUV * VolumeSize;
// Here you added min:
VolumeCoord = min(VolumeCoord, VolumeSize - 1);
LoadFromSomeBuffer(VolumeCoord);

This min would help only if frac(x) returns a value >= 1, which shouldn’t happen given that frac returns values in [0;1). Given that this code is executed in an inner loop of a SDF ray marcher I’m a bit hesitant of just adding extra instructions. Did this fix crashes in your case? Do you have any more information about it?

[Attachment Removed]

Hi [mention removed]​ !

I have encountered this issue in our project crash reporting tool. You could check this info below:

Private ticket with a message provided below contains Nvidia Aftermath Dump with Symbols.

GPU crashes in EvaluateGlobalDistanceFieldHit.

[Content removed]

Unfortunately, I can’t reproduce it locally and it will take at least few weeks to confirm the issue is fixed. If you can suggest anything else I can add to fix this I would add extra checks. I’m OK with losing a little bit of performance in DF in favor of stability.

[Attachment Removed]

The thing, which I’m mostly interested here is what’s the value of ClipmapVolumeUV at the point of the crash. Does it go outside of [0;1)? Or what’s the value of PageTableCoord? Does it go outside of bounds? I tried to investigate crash dump, but while PageTableCoord.x and PageTableCoord.z are still in the registers and look fine (2 and 0), PageTableCoord.x is already overwritten.

For a speculative fix, maybe Page.PageIndex < GlobalDistanceFieldMaxPageNum would be a good tradeoff? It shouldn’t be slower than the existing code, but still offers some bounds checking. Though ideally I would like to understand what’s going on here.

[Attachment Removed]

Thank you. I will proceed with Page.PageIndex < GlobalDistanceFieldMaxPageNum. I will update this thread if I have new info regarding crashes in this shader.

Change that I applied to ClipmapVolumeUV was purely speculative. I thought there is possible rounding error, but now I see CellOffsetInPage can’t exceed 63 anyway. Thank you for providing feedback.

[Attachment Removed]

I’ve added bounds checking for GlobalDistanceFieldPageObjectGridBuffer in CL 49603723, as it doesn’t have much downside to it. It’s not great to do such fixes without understanding what’s going on, but I don’t have any better idea how to proceed here.

[Attachment Removed]

What i did in CL 49603723 is this:

if (PageObjectGridBufferIndex < GlobalDistanceFieldPageObjectGridBufferSize)
{
	uint4 DistanceFieldObjectGridCell = GlobalDistanceFieldPageObjectGridBuffer[PageObjectGridBufferIndex];
 
}

With the idea that maybe there’s some stale GlobalDistanceFieldPageObjectGridBuffer or smth.

[Attachment Removed]