Developer Notes

A GPU crash may occur due to divergent barriers in ScreenProbeConvertToIrradianceCS which is a compute shader used by Lumen global illumination.  The crash has most widely been reported on Intel hardware, but may not be limited to Intel hardware.

Description

Intel reported GPU crashes on their hardware caused by divergent group barriers in ScreenProbeConvertToIrradianceCS:

[numthreads(THREADGROUP_SIZE, THREADGROUP_SIZE, 1)]
void ScreenProbeConvertToIrradianceCS(
//...
	if (ScreenProbeIndex < GetNumScreenProbes() && ScreenProbeAtlasCoord.x < ScreenProbeAtlasViewSize.x)
	{
		float SceneDepth = GetScreenProbeDepth(ScreenProbeAtlasCoord);

		if (SceneDepth > 0)
		{
			// ...
			if (all(ProbeTexelCoord < ScreenProbeGatherOctahedronResolution))
			{
				// ...
				GroupMemoryBarrierWithGroupSync();

The crash is difficult to reproduce, but the code does violate the spec, which says that barriers cannot be issued inside divergent branches for the same thread group.

ScreenProbeCompositeTracesWithScatterCS has a similar problem, and Intel's validation code also called out LightGridInjectionCS, FixupBordersAndGenerateMipsCS and ComputeProbeWorldOffsets. We should double-check the sync logic in these as well (at a quick glance, LightGridInjectionCS does your usual bounds check, but then issues a group barrier inside, which is technically wrong).

Steps to Reproduce

N/A, see description.

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-273972 in the post.

0
Login to Vote

Fixed
ComponentUE - Graphics Features - Lumen
Affects Versions5.6
Target Fix5.6
Fix Commit42242934
CreatedApr 23, 2025
ResolvedMay 5, 2025
UpdatedMay 13, 2025
View Jira Issue