@@ -265,14 +265,13 @@ namespace cage
265265 return res;
266266 }
267267
268- void renderCameras () const
268+ std::vector<CameraData> generateCameras () const
269269 {
270+ std::vector<CameraData> cameras;
270271 if (!preparedScene)
271- return ;
272+ return cameras ;
272273
273- std::vector<CameraData> cameras;
274274 cameras.reserve (preparedScene->config .scene ->component <CameraComponent>()->count ());
275-
276275 entitiesVisitor (
277276 [&](Entity *e, const CameraComponent &cam)
278277 {
@@ -302,19 +301,8 @@ namespace cage
302301 },
303302 preparedScene->config .scene , false );
304303
305- if (cameras.size () == 1 )
306- {
307- cameras[0 ]();
308- }
309- else
310- {
311- std::stable_sort (cameras.begin (), cameras.end ()); // ensure render-to-texture before render-to-window
312- tasksRunBlocking<CameraData>(" render scene" , cameras);
313- }
314-
315- for (const auto &cam : cameras)
316- for (const auto &it : cam.encoders )
317- it->submit ();
304+ std::stable_sort (cameras.begin (), cameras.end ()); // ensure render-to-texture before render-to-window
305+ return cameras;
318306 }
319307
320308 void dispatch (uint64 dispatchTime, Holder<GuiRender> guiBundle)
@@ -365,10 +353,14 @@ namespace cage
365353 if (cfg.device )
366354 {
367355 ProfilingScope profiling (" scene prepare & render" );
368- Holder<AsyncTask> task = tasksRunAsync (" render cameras" , [this ](uint32) { renderCameras (); });
369- Holder<PreparedScene> nextScene = scenePrepare (cfg); // this runs in parallel with the rendering task
356+ std::vector<CameraData> cameras = generateCameras ();
357+ PointerRange<CameraData> camerasRange = cameras;
358+ Holder<AsyncTask> task = tasksRunAsync<CameraData>(" render scene" , Holder<PointerRange<CameraData>>(&camerasRange, nullptr ));
359+ Holder<PreparedScene> nextScene = scenePrepare (cfg); // this runs in parallel with the cameras rendering
370360 task->wait ();
371- task.clear ();
361+ for (const auto &cam : cameras)
362+ for (const auto &it : cam.encoders )
363+ it->submit ();
372364 entitiesRendering = entitiesPreparation.share (); // these must update after the rendering task has completed
373365 preparedScene = std::move (nextScene);
374366 }
0 commit comments