summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2017-05-15 09:43:02 +0200
committerJani Heikkinen <jani.heikkinen@qt.io>2017-05-19 04:21:03 +0000
commit041529012f7c329d786fcb7190c28afc1477f1c2 (patch)
treeb732d657217b40573666df709184a684b4886134
parent9bf4daddeb62ec6a40e2d90587a7327acbb3780f (diff)
OnDemand rendering: only skip rendering jobs
As we still need to perform some of the jobs like picking, buffer loading.... Change-Id: Ic771533b6f114400fa431f6de5ad8259a2a17c71 Task-number: QTBUG-60738 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/nodemanagers.cpp5
-rw-r--r--src/render/backend/renderer.cpp19
-rw-r--r--src/render/frontend/qrenderaspect.cpp17
3 files changed, 27 insertions, 14 deletions
diff --git a/src/render/backend/nodemanagers.cpp b/src/render/backend/nodemanagers.cpp
index 2647bbb1a..80d0562b0 100644
--- a/src/render/backend/nodemanagers.cpp
+++ b/src/render/backend/nodemanagers.cpp
@@ -113,7 +113,6 @@ NodeManagers::~NodeManagers()
delete m_layerManager;
delete m_levelOfDetailManager;
delete m_filterKeyManager;
- delete m_frameGraphManager;
delete m_transformManager;
delete m_renderTargetManager;
delete m_sceneManager;
@@ -127,6 +126,10 @@ NodeManagers::~NodeManagers()
delete m_geometryManager;
delete m_geometryRendererManager;
delete m_objectPickerManager;
+
+ // Delete after m_objectPickerManager as that manager's shutdown needs to access
+ // the frame graph manager still.
+ delete m_frameGraphManager;
// delete m_boundingVolumeDebugManager;
delete m_lightManager;
delete m_environmentLightManager;
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index bd8687d5e..a68e5dccd 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -462,7 +462,9 @@ void Renderer::setSurfaceExposed(bool exposed)
Render::FrameGraphNode *Renderer::frameGraphRoot() const
{
Q_ASSERT(m_settings);
- return m_nodesManager->frameGraphManager()->lookupNode(m_settings->activeFrameGraphID());
+ if (m_nodesManager && m_nodesManager->frameGraphManager() && m_settings)
+ return m_nodesManager->frameGraphManager()->lookupNode(m_settings->activeFrameGraphID());
+ return nullptr;
}
// QAspectThread context
@@ -1390,12 +1392,6 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
for (const QAspectJobPtr &bufferJob : bufferJobs)
m_calculateBoundingVolumeJob->addDependency(bufferJob);
- // Set values on pickBoundingVolumeJob
- m_pickBoundingVolumeJob->setFrameGraphRoot(frameGraphRoot());
- m_pickBoundingVolumeJob->setRenderSettings(settings());
- m_pickBoundingVolumeJob->setMouseEvents(pendingPickingEvents());
- m_pickBoundingVolumeJob->setKeyEvents(pendingKeyEvents());
-
m_updateLevelOfDetailJob->setFrameGraphRoot(frameGraphRoot());
// Set dependencies of resource gatherer
for (const QAspectJobPtr &jobPtr : renderBinJobs) {
@@ -1451,6 +1447,15 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
QAspectJobPtr Renderer::pickBoundingVolumeJob()
{
+ // Set values on pickBoundingVolumeJob
+ RenderSettings *renderSetting = settings();
+ if (renderSetting != nullptr) {
+ m_pickBoundingVolumeJob->setRenderSettings(renderSetting);
+ m_pickBoundingVolumeJob->setFrameGraphRoot(frameGraphRoot());
+ m_pickBoundingVolumeJob->setMouseEvents(pendingPickingEvents());
+ m_pickBoundingVolumeJob->setKeyEvents(pendingKeyEvents());
+ }
+
return m_pickBoundingVolumeJob;
}
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 1f88cb006..f7a2e2ffd 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -405,12 +405,6 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
// asked for jobs to execute (this function). If that is the case, the RenderSettings will
// be null and we should not generate any jobs.
if (d->m_renderer->isRunning() && d->m_renderer->settings()) {
- // don't spawn any jobs, if the renderer decides to skip this frame
- if (!d->m_renderer->shouldRender()) {
- d->m_renderer->skipNextFrame();
- QThread::msleep(1);
- return jobs;
- }
Render::NodeManagers *manager = d->m_renderer->nodeManagers();
QAspectJobPtr textureLoadingSync = d->m_renderer->syncTextureLoadingJob();
@@ -448,8 +442,19 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
// Add all jobs to queue
const Qt3DCore::QAspectJobPtr pickBoundingVolumeJob = d->m_renderer->pickBoundingVolumeJob();
+ // Note: the getter is also responsible for returning a job ready to run
jobs.append(pickBoundingVolumeJob);
+
+ // Don't spawn any rendering jobs, if the renderer decides to skip this frame
+ // Note: this only affects rendering jobs (jobs that load buffers,
+ // perform picking,... must still be run)
+ if (!d->m_renderer->shouldRender()) {
+ d->m_renderer->skipNextFrame();
+ QThread::msleep(1);
+ return jobs;
+ }
+
// Traverse the current framegraph and create jobs to populate
// RenderBins with RenderCommands
// All jobs needed to create the frame and their dependencies are set by