Skip to content

Commit e774fee

Browse files
committed
reduce using tasks in graphics
1 parent 32a59ef commit e774fee

1 file changed

Lines changed: 12 additions & 20 deletions

File tree

sources/libsimple/graphics.cpp

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)