Description

Reported alongside [Link Removed]

Context: Some ActorComponents can schedule end-of-frame work which UWorld executes later in the frame in UWorld::SendAllEndOfFrameUpdates(). By-design it appears that it's not allowed to schedule more end-of-frame work while executing such work, since this assertion in MarkActorComponentForNeededEndOfFrameUpdate() is meant to catch that:

check(!bPostTickComponentUpdate); // can't call this while we are doing the updates 

The provided callstack shows EOF work scheduling more EOF work so this should be addressed.

Issue: No specific repro steps provided except that NiagaraMeshRenderer is involved and the crash isn't reliable to repro. Looking at the callstack it seems that 

UNiagaraComponent::CreateRenderState_Concurrent can cause FStaticMeshCompilingManager::FinishCompilation to be called, which causes some component to ultimately call UActorComponent::MarkRenderStateDirty(). This is not allowed while inside SendAllEndOfFrameUpdates() so should be addressed somewhere along the callstack.

Steps to Reproduce
  • See UDN case
Callstack

KERNELBASE!RaiseException() [:-1]
UnrealEditor_Core!ReportAssert(wchar_t* ErrorMessage, void* ProgramCounter) [WindowsPlatformCrashContext.cpp:1834]
UnrealEditor_Core!FWindowsErrorOutputDevice::Serialize(wchar_t* Msg, ELogVerbosity::Type Verbosity = SetColor (0n64), FName* Category) [WindowsErrorOutputDevice.cpp:84]
UnrealEditor_Core!FOutputDevice::LogfImpl(wchar_t* Fmt) [OutputDevice.cpp:70]
UnrealEditor_Core!FOutputDevice::Logf() [OutputDevice.h:250]
UnrealEditor_Core!AssertFailedImplV(char* Expr, char* File, int Line = 0n889, void* ProgramCounter, wchar_t* Format, char* Args) [AssertionMacros.cpp:148]
UnrealEditor_Core!FDebug::CheckVerifyFailedImpl2(char* Expr, char* File, int Line = 0n889, wchar_t* Format) [AssertionMacros.cpp:649]
UnrealEditor_Engine!UWorld::MarkActorComponentForNeededEndOfFrameUpdate(UActorComponent* Component, bool bForceGameThread = false) [LevelTick.cpp:889]
UnrealEditor_Engine!UActorComponent::MarkRenderStateDirty() [ActorComponent.cpp:1961]
UnrealEditor_Engine!FShaderCompilingManager::PropagateMaterialChangesToPrimitives(TMap<TRefCountPtr<FMaterial>,TRefCountPtr<FMaterialShaderMap>,FDefaultSetAllocator,TDefaultMapHashableKeyFuncs<TRefCountPtr<FMaterial>,TRefCountPtr<FMaterialShaderMap>,0>>* MaterialsToUpdate) [ShaderCompiler.cpp:7048]
UnrealEditor_Engine!FShaderCompilingManager::ProcessCompiledShaderMaps(TMap<int,FShaderMapCompileResults,FDefaultSetAllocator,TDefaultMapHashableKeyFuncs<int,FShaderMapCompileResults,0>>* CompiledShaderMaps, float TimeBudget = 0.005865002051) [ShaderCompiler.cpp:7020]
UnrealEditor_Engine!FShaderCompilingManager::ProcessAsyncResults(float TimeSlice, bool bBlockOnGlobalShaderCompletion = false) [ShaderCompiler.cpp:7554]
UnrealEditor_Engine!AsyncCompilationHelpers::FinishCompilation(TFunctionRef<AsyncCompilationHelpers::ICompilable & __cdecl(int)>* Getter, int Num = 0n1, FText* AssetType, FLogCategoryBase* LogCategory, TFunctionRef<void __cdecl(AsyncCompilationHelpers::ICompilable*)>* PostCompileSingle) [AsyncCompilationHelpers.cpp:187]
UnrealEditor_Engine!FStaticMeshCompilingManager::FinishCompilation(TArrayView<UStaticMesh* const,int>* InStaticMeshes) [StaticMeshCompiler.cpp:406]
UnrealEditor_Engine!UStaticMesh::WaitUntilAsyncPropertyReleased(EStaticMeshAsyncProperties AsyncProperties = 0n1205876736 (No matching enumerant)) [StaticMesh.cpp:3471]
UnrealEditor_Engine!UStaticMesh::GetRenderData() [StaticMesh.cpp:3498]
UnrealEditor_Niagara!NiagaraMeshRendererPropertiesInternal::ResolveRenderableMeshInternal(FNiagaraMeshRendererMeshProperties* MeshProperties, FNiagaraEmitterInstance* EmitterInstance, INiagaraRenderableMeshInterface** OutInterface, UStaticMesh** OutStaticMesh) [NiagaraMeshRendererProperties.cpp:203]
UnrealEditor_Niagara!UNiagaraMeshRendererProperties::GetUsedMaterials(FNiagaraEmitterInstance* EmitterInstance, TArray<UMaterialInterface*,TSizedDefaultAllocator<32>>* OutMaterials) [NiagaraMeshRendererProperties.cpp:741]
UnrealEditor_Niagara!`FNiagaraSystemInstanceController::GetUsedMaterials'::`9'::<lambda_1>::operator()(UNiagaraRendererProperties* Properties) [NiagaraSystemInstanceController.cpp:140]
UnrealEditor_Niagara!FNiagaraEmitterInstance::ForEachEnabledRenderer() [NiagaraEmitterInstance.h:135]
UnrealEditor_Niagara!FNiagaraSystemInstanceController::GetUsedMaterials(TArray<UMaterialInterface*,TSizedDefaultAllocator<32>>* OutMaterials) [NiagaraSystemInstanceController.cpp:133]
UnrealEditor_Niagara!UNiagaraComponent::GetUsedMaterials(TArray<UMaterialInterface*,TSizedDefaultAllocator<32>>* OutMaterials, bool bGetDebugMaterials = true) [NiagaraComponent.cpp:2428]
UnrealEditor_Engine!FPrimitiveSceneProxy::FPrimitiveSceneProxy(FPrimitiveSceneProxyDesc* InProxyDesc, FName* InResourceName) [PrimitiveSceneProxy.cpp:716]
UnrealEditor_Engine!FPrimitiveSceneProxy::FPrimitiveSceneProxy(UPrimitiveComponent* InComponent, FName* InResourceName) [PrimitiveSceneProxy.cpp:465]
UnrealEditor_Niagara!FNiagaraSceneProxy::FNiagaraSceneProxy(UNiagaraComponent* InComponent) [NiagaraComponent.cpp:192]
UnrealEditor_Niagara!UNiagaraComponent::CreateSceneProxy() [NiagaraComponent.cpp:2406]
UnrealEditor_Engine!FActorPrimitiveComponentInterface::CreateSceneProxy() [PrimitiveComponent.cpp:5316]
UnrealEditor_Renderer!FScene::BatchAddPrimitivesInternal<UPrimitiveComponent>(TArrayView<UPrimitiveComponent*,int>* InPrimitives) [RendererScene.cpp:2131]
UnrealEditor_Renderer!FScene::AddPrimitive(UPrimitiveComponent* Primitive) [RendererScene.cpp:2040]
UnrealEditor_Engine!UPrimitiveComponent::CreateRenderState_Concurrent(FRegisterComponentContext* Context) [PrimitiveComponent.cpp:637]
UnrealEditor_Niagara!UNiagaraComponent::CreateRenderState_Concurrent(FRegisterComponentContext* Context) [NiagaraComponent.cpp:2247]
UnrealEditor_Engine!UActorComponent::RecreateRenderState_Concurrent() [ActorComponent.cpp:1852]
UnrealEditor_Engine!UActorComponent::DoDeferredRenderUpdates_Concurrent() [ActorComponent.cpp:1928]
UnrealEditor_Engine!`UWorld::SendAllEndOfFrameUpdates'::`2'::<lambda_3>::operator()() [LevelTick.cpp:1129]
UnrealEditor_Engine!UWorld::SendAllEndOfFrameUpdates() [LevelTick.cpp:1149]
UnrealEditor_UnrealEd!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode = false) [EditorEngine.cpp:2176]
UnrealEditor_UnrealEd!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) [UnrealEdEngine.cpp:563]
UnrealEditor_GbxNetGameEditor!UGbxNetGameUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) [GbxNetGameUnrealEdEngine.cpp:17]
UnrealEditor!FEngineLoop::Tick() [LaunchEngineLoop.cpp:6165]
UnrealEditor!EngineTick() [Launch.cpp:64]
UnrealEditor!GuardedMain(wchar_t* CmdLine) [Launch.cpp:198]

Have Comments or More Details?

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

1
Login to Vote

Fixed
ComponentUE - Niagara - Rendering
Affects Versions5.4
Target Fix5.5
Fix Commit33520713
CreatedJul 23, 2024
ResolvedJul 24, 2024
UpdatedSep 20, 2024
View Jira Issue