summaryrefslogtreecommitdiffstats
path: root/src/render/renderers
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-09-25 15:23:30 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-09-30 16:39:24 +0200
commitbb89fc9823eca1eca41dab1ef8ceb12beeab96d3 (patch)
tree5e618790f96a65cfe6818a8de9e662230e8b6cae /src/render/renderers
parenteb9f68599f1d94b8ee578ea18b3e3e5297cce73d (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.cpp35
-rw-r--r--src/render/renderers/opengl/renderer/renderer_p.h2
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