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;
			}
		}
	}
}
Exemple #2
0
Flusher Logger::info()
{
	return Flusher("[ INF ] ", getBuffer());
}
Exemple #3
0
Flusher Logger::error()
{
	return Flusher("[ ERR ] ", getBuffer());
}
Exemple #4
0
Flusher Logger::debug()
{
	return Flusher("[ DBG ] ", getBuffer());
}
Exemple #5
0
Flusher Logger::warn()
{
	return Flusher("[ WRN ] ", getBuffer());
}