diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-09-25 15:23:30 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-30 16:39:24 +0200 |
commit | bb89fc9823eca1eca41dab1ef8ceb12beeab96d3 (patch) | |
tree | 5e618790f96a65cfe6818a8de9e662230e8b6cae /src/render/renderers | |
parent | eb9f68599f1d94b8ee578ea18b3e3e5297cce73d (diff) |
Renderer: cache traversal of FrameGraph
Will be retraversed only when something in the FrameGraph has changed
Change-Id: Ibb43f8f2928b10a584f468fb13f1d4773c7fcebb
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/renderers')
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer.cpp | 35 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer_p.h | 2 |
2 files changed, 20 insertions, 17 deletions
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index af9a6e7e6..66d404f4e 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -1824,26 +1824,27 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() // populate the RenderView with a set of RenderCommands that get // their details from the RenderNodes that are visible to the // Camera selected by the framegraph configuration - FrameGraphVisitor visitor(m_nodesManager->frameGraphManager()); - const QVector<FrameGraphNode *> fgLeaves = visitor.traverse(frameGraphRoot()); - - // Handle single shot subtree enablers - const auto subtreeEnablers = visitor.takeEnablersToDisable(); - for (auto *node : subtreeEnablers) - m_updatedDisables.push_back(node->peerId()); - if (m_updatedDisables.size() > 0) - renderBinJobs.push_back(m_sendDisablesToFrontendJob); - - // Remove leaf nodes that no longer exist from cache - const QList<FrameGraphNode *> keys = m_cache.leafNodeCache.keys(); - for (FrameGraphNode *leafNode : keys) { - if (!fgLeaves.contains(leafNode)) - m_cache.leafNodeCache.remove(leafNode); + if (frameGraphDirty) { + FrameGraphVisitor visitor(m_nodesManager->frameGraphManager()); + m_frameGraphLeaves = visitor.traverse(frameGraphRoot()); + // Remove leaf nodes that no longer exist from cache + const QList<FrameGraphNode *> keys = m_cache.leafNodeCache.keys(); + for (FrameGraphNode *leafNode : keys) { + if (!m_frameGraphLeaves.contains(leafNode)) + m_cache.leafNodeCache.remove(leafNode); + } + + // Handle single shot subtree enablers + const auto subtreeEnablers = visitor.takeEnablersToDisable(); + for (auto *node : subtreeEnablers) + m_updatedDisables.push_back(node->peerId()); + if (m_updatedDisables.size() > 0) + renderBinJobs.push_back(m_sendDisablesToFrontendJob); } - const int fgBranchCount = fgLeaves.size(); + const int fgBranchCount = m_frameGraphLeaves.size(); for (int i = 0; i < fgBranchCount; ++i) { - RenderViewBuilder builder(fgLeaves.at(i), i, this); + RenderViewBuilder builder(m_frameGraphLeaves.at(i), i, this); builder.setLayerCacheNeedsToBeRebuilt(layersCacheNeedsToBeRebuilt); builder.setRenderableCacheNeedsToBeRebuilt(renderableDirty); builder.setComputableCacheNeedsToBeRebuilt(computeableDirty); diff --git a/src/render/renderers/opengl/renderer/renderer_p.h b/src/render/renderers/opengl/renderer/renderer_p.h index 0ea27d91a..c7b4f8805 100644 --- a/src/render/renderers/opengl/renderer/renderer_p.h +++ b/src/render/renderers/opengl/renderer/renderer_p.h @@ -424,6 +424,8 @@ private: QMetaObject::Connection m_contextConnection; RendererCache m_cache; bool m_shouldSwapBuffers; + + QVector<FrameGraphNode *> m_frameGraphLeaves; }; } // namespace Render |