偶现 SetPSO

偶现在访问PipelineStateCache时出现多线程冲突,提交DrawCommand获取缓存的PSO过程中缓存被consolidate​

CallStack:

TSharedPipelineStateCache<FGraphicsPipelineStateInitializer,FGraphicsPipelineState *>::Find() [[EngineDir]Engine/Source/Runtime/RHI/Private/PipelineStateCache.cpp:1376]

PipelineStateCache::GetAndOrCreateGraphicsPipelineState() [[EngineDir]Engine/Source/Runtime/RHI/Private/PipelineStateCache.cpp:3783]

SetGraphicsPipelineStateCheckApply() [[EngineDir]Engine/Source/Runtime/RHI/Private/PipelineStateCache.cpp:1265]

FMeshDrawCommand::SubmitDrawBegin() [[EngineDir]Engine/Source/Runtime/Renderer/Private/MeshPassProcessor.cpp:1422]

FMeshDrawCommand::SubmitDraw() [[EngineDir]Engine/Source/Runtime/Renderer/Private/MeshPassProcessor.cpp:1725]

FInstanceCullingContext::SubmitDrawCommands() [[EngineDir]Engine/Source/Runtime/Renderer/Private/InstanceCulling/InstanceCullingContext.cpp:1730]

FDrawVisibleMeshCommandsAnyThreadTask::DoTask() [[EngineDir]Engine/Source/Runtime/Renderer/Private/MeshDrawCommands.cpp:1640]

TGraphTask<FDrawVisibleMeshCommandsAnyThreadTask>::ExecuteTask() [[EngineDir]Engine/Source/Runtime/Core/Public/Async/TaskGraphInterfaces.h:646]

UE::Tasks::Private::FTaskBase::TryExecuteTask() [[EngineDir]Engine/Source/Runtime/Core/Public/Tasks/TaskPrivate.h:506]

LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::TTaskDelegateImpl<`LowLevelTasks::FTask::Init<`UE::Tasks::Private::FTaskBase::Init’::`2’::<lambda_1> >’::`17’::<lambda_2>,0>::CallAndMove() [[EngineDir]Engine/Source/Runtime/Core/Public/Async/Fundamental/TaskDelegate.h:171]

LowLevelTasks::FTask::ExecuteTask() [[EngineDir]Engine/Source/Runtime/Core/Public/Async/Fundamental/Task.h:627]

LowLevelTasks::FScheduler::ExecuteTask() [[EngineDir]Engine/Source/Runtime/Core/Private/Async/Fundamental/Scheduler.cpp:244]

LowLevelTasks::FScheduler::WorkerLoop() [[EngineDir]Engine/Source/Runtime/Core/Private/Async/Fundamental/Scheduler.cpp:514]

`LowLevelTasks::FScheduler::CreateWorker’::`2’::<lambda_1>::operator()() [[EngineDir]Engine/Source/Runtime/Core/Private/Async/Fundamental/Scheduler.cpp:75]

FThreadImpl::Run() [[EngineDir]Engine/Source/Runtime/Core/Private/HAL/Thread.cpp:71]

FRunnableThreadWin::Run() [[EngineDir]Engine/Source/Runtime/Core/Private/Windows/WindowsRunnableThread.cpp:168]

FRunnableThreadWin::GuardedRun() [[EngineDir]Engine/Source/Runtime/Core/Private/Windows/WindowsRunnableThread.cpp:81]

UnknownFunction []

Hi,

可能需要合入这三个改动试试

https://github.com/EpicGames/UnrealEngine/commit/050be6a8477d8485c0923b04abfbfa78e9208e95

https://github.com/EpicGames/UnrealEngine/commit/f9e12f51033161499b92d0744de4d2caad765a90

https://github.com/EpicGames/UnrealEngine/commit/bad09d9ce17a5f09db9907c758e6571c1a7e930b