From c2ec3fe2cbbb9dd6030fd0c85209c8f4a6a00f1a Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 3 Jun 2026 05:03:22 +0200 Subject: [PATCH] Simplify async render flushing code --- Source/Engine/Graphics/RenderTask.cpp | 7 +++++++ Source/Engine/Graphics/RenderTask.h | 5 +++++ Source/Engine/Renderer/Renderer.cpp | 8 ++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Source/Engine/Graphics/RenderTask.cpp b/Source/Engine/Graphics/RenderTask.cpp index ad8bbbdc0..94fdb11ac 100644 --- a/Source/Engine/Graphics/RenderTask.cpp +++ b/Source/Engine/Graphics/RenderTask.cpp @@ -507,3 +507,10 @@ RenderContextBatch::RenderContextBatch(const RenderContext& context) Contexts.Add(context); EnableAsync = JobSystem::GetThreadsCount() > 1; } + +void RenderContextBatch::FlushWaitLabels() +{ + for (const int64 label : WaitLabels) + JobSystem::Wait(label); + WaitLabels.Clear(); +} diff --git a/Source/Engine/Graphics/RenderTask.h b/Source/Engine/Graphics/RenderTask.h index 8cba1006e..db1332bba 100644 --- a/Source/Engine/Graphics/RenderTask.h +++ b/Source/Engine/Graphics/RenderTask.h @@ -533,4 +533,9 @@ API_STRUCT(NoDefault) struct FLAXENGINE_API RenderContextBatch { return Contexts.Get()[0]; } + + /// + /// Waits for all scheduled async jobs to complete and clears WaitLabels. + /// + void FlushWaitLabels(); }; diff --git a/Source/Engine/Renderer/Renderer.cpp b/Source/Engine/Renderer/Renderer.cpp index a1f531ac1..1098692cc 100644 --- a/Source/Engine/Renderer/Renderer.cpp +++ b/Source/Engine/Renderer/Renderer.cpp @@ -356,9 +356,7 @@ void Renderer::DrawActors(RenderContext& renderContext, const Array& cus Level::DrawActors(renderContextBatch, SceneRendering::DrawCategory::SceneDraw); Level::DrawActors(renderContextBatch, SceneRendering::DrawCategory::SceneDrawAsync); JobSystem::SetJobStartingOnDispatch(true); - for (const int64 label : renderContextBatch.WaitLabels) - JobSystem::Wait(label); - renderContextBatch.WaitLabels.Clear(); + renderContextBatch.FlushWaitLabels(); } } @@ -483,9 +481,7 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont // Wait for async jobs to finish JobSystem::SetJobStartingOnDispatch(true); - for (const int64 label : renderContextBatch.WaitLabels) - JobSystem::Wait(label); - renderContextBatch.WaitLabels.Clear(); + renderContextBatch.FlushWaitLabels(); // Perform custom post-scene drawing (eg. GPU dispatches used by VFX) for (int32 i = 0; i < renderContextBatch.Contexts.Count(); i++)