Hi Stu,
> Could you provide the callstack where you are seeing this?
The bug appears to have been introduced in FNiagaraSystemInstanceController::GetMaterialStreamingInfo() in 5.6 but the crash that occurs as a consequence of the bug is elsewhere. For some reason I can no longer see the callstack on the details for this question, but here it is:
[Inline Frame] TMapBase<unsigned __int64,FNDIArrayInstanceData_RenderThread<FLinearColor>,FDefaultSetAllocator,TDefaultMapHashableKeyFuncs<unsigned __int64,FNDIArrayInstanceData_RenderThread<FLinearColor>,0>>::FindChecked(const unsigned __int64) Line 716 C++
FNDIArrayProxyImpl<FLinearColor,UNiagaraDataInterfaceArrayColor>::SetShaderParameters(INDIArrayProxyBase::FShaderParameters * ShaderParameters, unsigned __int64 SystemInstanceID) Line 1053 C++
FNiagaraGpuComputeDispatch::SetDataInterfaceParameters(FRDGBuilder & GraphBuilder, const FNiagaraGPUSystemTick & Tick, const FNiagaraComputeInstanceData & InstanceData, const TShaderRefBase<FNiagaraShader,FNiagaraShaderMapPointerTable> & ComputeShader, const FNiagaraSimStageData & SimStageData, const FNiagaraShaderScriptParametersMetadata & NiagaraShaderParametersMetadata, unsigned char * ParametersStructure) Line 2514 C++
FNiagaraGpuComputeDispatch::DispatchStage(FRDGBuilder & GraphBuilder, const FNiagaraGPUSystemTick & Tick, const FNiagaraComputeInstanceData & InstanceData, const FNiagaraSimStageData & SimStageData) Line 1755 C++
FNiagaraGpuComputeDispatch::ExecuteTicks(FRDGBuilder & GraphBuilder, TStridedView<FSceneView const ,int> Views, ENiagaraGpuComputeTickStage::Type TickStage) Line 1293 C++
FNiagaraGpuComputeDispatch::PreInitViews(FRDGBuilder & GraphBuilder, bool bAllowGPUParticleUpdate, const TArrayView<FSceneViewFamily const *,int> & ViewFamilies, const FSceneViewFamily * CurrentFamily) Line 2062 C++
FNiagaraGpuComputeDispatch::ProcessPendingTicksFlush(FRHICommandListImmediate & RHICmdList, bool bForceFlush) Line 495 C++
[External Code]
[Inline Frame] UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(FRHICommandListImmediate &)>::operator()(FRHICommandListImmediate &) Line 471 C++
FRenderThreadCommandPipe::EnqueueAndLaunch::__l5::<lambda_1>::operator()() Line 1547 C++
[Inline Frame] UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(void)>::operator()() Line 471 C++
[Inline Frame] TFunctionGraphTaskImpl<void __cdecl(void),1>::DoTaskImpl(TUniqueFunction<void __cdecl(void)> & Function, ENamedThreads::Type) Line 1111 C++
[Inline Frame] TFunctionGraphTaskImpl<void __cdecl(void),1>::DoTask(ENamedThreads::Type) Line 1104 C++
TGraphTask<TFunctionGraphTaskImpl<void __cdecl(void),1>>::ExecuteTask() Line 706 C++
UE::Tasks::Private::FTaskBase::TryExecuteTask() Line 527 C++
[Inline Frame] FBaseGraphTask::Execute(TArray<FBaseGraphTask *,TSizedDefaultAllocator<32>> &) Line 505 C++
FNamedTaskThread::ProcessTasksNamedThread(int QueueIndex, bool bAllowStall) Line 779 C++
FNamedTaskThread::ProcessTasksUntilQuit(int QueueIndex) Line 668 C++
RenderingThreadMain(FEvent * TaskGraphBoundSyncEvent) Line 318 C++
FRenderingThread::Run() Line 478 C++
FRunnableThreadWin::Run() Line 159 C++
FRunnableThreadWin::GuardedRun() Line 71 C++
[External Code]
> And could you elaborate on what “the new tick code” refers to?
Sure - here is the 5.5 code:
void FNiagaraSystemInstanceController::GetMaterialStreamingInfo(FNiagaraMaterialAndScaleArray& OutMaterialAndScales) const
{
if (!SystemInstance.IsValid())
{
return;
}
for (const FNiagaraEmitterInstanceRef& EmitterInst : SystemInstance->GetEmitters())
{
EmitterInst->ForEachEnabledRenderer(
[&](UNiagaraRendererProperties* Properties)
{
Here is the same code in 5.6 with the added Tick() calls:
void FNiagaraSystemInstanceController::GetMaterialStreamingInfo(FNiagaraMaterialAndScaleArray& OutMaterialAndScales) const
{
if (!SystemInstance.IsValid())
{
return;
}
if (OverrideParameters)
{
OverrideParameters->Tick();
}
SystemInstance->GetInstanceParameters().Tick();
for (const FNiagaraEmitterInstanceRef& EmitterInst : SystemInstance->GetEmitters())
{
EmitterInst->GetRendererBoundVariables().Tick();
EmitterInst->ForEachEnabledRenderer(
[&](UNiagaraRendererProperties* Properties)
{