diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2017-05-15 09:43:02 +0200 |
---|---|---|
committer | Jani Heikkinen <jani.heikkinen@qt.io> | 2017-05-19 04:21:03 +0000 |
commit | 041529012f7c329d786fcb7190c28afc1477f1c2 (patch) | |
tree | b732d657217b40573666df709184a684b4886134 | |
parent | 9bf4daddeb62ec6a40e2d90587a7327acbb3780f (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.cpp | 5 | ||||
-rw-r--r-- | src/render/backend/renderer.cpp | 19 | ||||
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 17 |
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 |