Description

In 5.8, UPrimitiveComponent::OnUnregister resets FPSOPrecacheComponentData, which clears bPSOPrecacheCalled (regression from CL 48140040). ULandscapeComponent and UGroomComponent only call PrecachePSOs() in PostLoad. When either component re-registers without a new PostLoad, its scene proxy is recreated with no precache data and fires ensure(!IsComponentPSOPrecachingEnabled() || bPSOPrecacheCalled) in FPSOPrecacheComponentData::CheckPSOPrecachingAndBoostPriority (PSOPrecache.cpp:296). Examples of such a re-register:

  • a World Partition cell that unloads and is reactivated before GC runs
  • a global re-register from a cvar sink such as r.CustomDepth or r.RayTracing.Geometry.InstancedStaticMeshes.EvaluateWPO

It only happens in cooked/game builds, because component PSO precaching is disabled in the editor.

Fix: cherry-pick CL 55798320 (//UE6/Main) to //UE5/Dev-Release-5.8. It adds a guarded PrecachePSOs() at the end of both components' OnRegister, skipped when IsPSOPrecacheCalled() is still set. Pending CL 59512334 in Dev-Release-5.8.

Validation: cooked Development Win64 builds from Dev-Release-5.8.

  • WP landscape map, player moves far away (cells unload) and back before GC: ensure fires in ULandscapeComponent::CreateSceneProxy without the fix, and doesn't with it.
  • r.RayTracing.Geometry.InstancedStaticMeshes.EvaluateWPO 1: same result.
  • EngineTest Project.Functional Tests.Tests.Rendering.DebugViewModes.DebugViewModes.BufferCustomStencil on Vulkan SM6 ([Link Removed]): Fail without the fix (groom ensure), Success with it.

Not covered: UGeometryCollectionComponent has the same gap (it precaches in PostLoad only).

Steps to Reproduce
  1. Cooked Development Win64 build with a World Partition streaming landscape.
  2. With GC delayed (gc.TimeBetweenPurgingPendingKillObjects 600), move the player far enough to unload the landscape cells (e.g. BugItGo), then return before GC runs.
  3. Result: the ensure fires in ULandscapeComponent::CreateSceneProxy. Expected: no ensure.

Alternative: run the EngineTest functional test DebugViewModes.BufferCustomStencil on Vulkan.

Callstack
Ensure condition failed: !IsComponentPSOPrecachingEnabled() || bPSOPrecacheCalled [File:Engine\Source\Runtime\Engine\Private\PSOPrecache.cpp] [Line: 296]
FPSOPrecacheComponentData::CheckPSOPrecachingAndBoostPriority() [PSOPrecache.cpp:296]
ULandscapeComponent::CreateSceneProxy() [Landscape.cpp:2270]
FActorPrimitiveComponentInterface::CreateSceneProxy() [ActorPrimitiveComponentInterface.cpp:146]
FScene::BatchAddPrimitivesInternal<UPrimitiveComponent>() [RendererScene.cpp:1455]
FScene::AddPrimitive() [RendererScene.cpp:1349]
FRegisterComponentContext::Process() [ActorComponent.cpp:250]
FRegisterComponentContext::OnIncrementalRegisterComponentsDone() [ActorComponent.cpp:205]
ULevel::IncrementalRegisterComponents() [Level.cpp:2046]
ULevel::IncrementalUpdateComponents() [Level.cpp:1906]
UWorld::AddToWorld() [World.cpp:3887]
ULevelStreaming::UpdateStreamingState() [LevelStreaming.cpp:1096]
UWorld::UpdateLevelStreaming() [World.cpp:5138]

Have Comments or More Details?

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

0
Login to Vote

Unresolved
ComponentUE - Rendering - RHI
Affects Versions5.8
Target Fix5.8.5
CreatedOct 21, 2026
UpdatedOct 21, 2026
View Jira Issue