void FDeferredShadingSceneRenderer::RenderVelocitiesInnerParallel(FRHICommandListImmediate& RHICmdList, TRefCountPtr<IPooledRenderTarget>& VelocityRT) { // parallel version FScopedCommandListWaitForTasks Flusher(RHICmdList); for(int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) { const FViewInfo& View = Views[ViewIndex]; FVelocityPassParallelCommandListSet ParallelCommandListSet(View, RHICmdList, nullptr, CVarRHICmdVelocityPassDeferredContexts.GetValueOnRenderThread() > 0, VelocityRT); Scene->VelocityDrawList.DrawVisibleParallel(View.StaticMeshVelocityMap, View.StaticMeshBatchVisibility, ParallelCommandListSet); int32 NumPrims = View.DynamicMeshElements.Num(); int32 EffectiveThreads = FMath::Min<int32>(NumPrims, ParallelCommandListSet.Width); int32 Start = 0; if (EffectiveThreads) { check(IsInRenderingThread()); int32 NumPer = NumPrims / EffectiveThreads; int32 Extra = NumPrims - NumPer * EffectiveThreads; for (int32 ThreadIndex = 0; ThreadIndex < EffectiveThreads; ThreadIndex++) { int32 Last = Start + (NumPer - 1) + (ThreadIndex < Extra); check(Last >= Start); FRHICommandList* CmdList = ParallelCommandListSet.NewParallelCommandList(); FGraphEventRef AnyThreadCompletionEvent = TGraphTask<FRenderVelocityDynamicThreadTask>::CreateTask(nullptr, ENamedThreads::RenderThread) .ConstructAndDispatchWhenReady(*this, *CmdList, View, Start, Last); ParallelCommandListSet.AddParallelCommandList(CmdList, AnyThreadCompletionEvent); Start = Last + 1; } } } }
Flusher Logger::info() { return Flusher("[ INF ] ", getBuffer()); }
Flusher Logger::error() { return Flusher("[ ERR ] ", getBuffer()); }
Flusher Logger::debug() { return Flusher("[ DBG ] ", getBuffer()); }
Flusher Logger::warn() { return Flusher("[ WRN ] ", getBuffer()); }