aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2021-02-12 07:43:22 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-02-25 09:06:22 +0000
commit4d77a0727e18fb3391567b55b213e8721c43cea1 (patch)
treee8e6eb675ab47039ec5b18bc0a1db5f649edf8a8 /src
parent4bc08dcb9481b700128f2aa3299e63f3f0d8466a (diff)
Don't invalidate unaffected render orders
If you have a list of render orders A, B, C, then A and C changes, we also invalidated B. This was to avoid the situation where B was ignored by the batching algorithm and A and C would end up being batched together. This has a performance impact for some scenes though, where you might have top level and bottom level items that constantly change, causing all geometry in the scene to be uploaded every frame. Instead of doing this, we skip invalidation of B, but include its bounding rect when checking for overlaps, so that we still avoid batching A and C together but without the need to re-upload B. Fixes: QTBUG-90632 Change-Id: I462cf1938360643ca9fa1425ae8c8e08b534fd76 Reviewed-by: Andy Nichols <andy.nichols@qt.io> Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> Reviewed-by: Michael Brasser <michael.brasser@live.com> (cherry picked from commit 9aa3db2e19b2e1622b878cf34b1978f4fdbcac39) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp25
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h2
2 files changed, 25 insertions, 2 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index 2272956121..cca46986e3 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -893,8 +893,10 @@ Renderer::Renderer(QSGDefaultRenderContext *ctx, QSGRendererInterface::RenderMod
, m_tmpOpaqueElements(16)
, m_rebuild(FullRebuild)
, m_zRange(0)
+#if defined(QSGBATCHRENDERER_INVALIDATE_WEDGED_NODES)
, m_renderOrderRebuildLower(-1)
, m_renderOrderRebuildUpper(-1)
+#endif
, m_currentMaterial(nullptr)
, m_currentShader(nullptr)
, m_vertexUploadPool(256)
@@ -1644,11 +1646,19 @@ void Renderer::invalidateBatchAndOverlappingRenderOrders(Batch *batch)
Q_ASSERT(batch);
Q_ASSERT(batch->first);
+#if defined(QSGBATCHRENDERER_INVALIDATE_WEDGED_NODES)
if (m_renderOrderRebuildLower < 0 || batch->first->order < m_renderOrderRebuildLower)
m_renderOrderRebuildLower = batch->first->order;
if (m_renderOrderRebuildUpper < 0 || batch->lastOrderInBatch > m_renderOrderRebuildUpper)
m_renderOrderRebuildUpper = batch->lastOrderInBatch;
+ int first = m_renderOrderRebuildLower;
+ int last = m_renderOrderRebuildUpper;
+#else
+ int first = batch->first->order;
+ int last = batch->lastOrderInBatch;
+#endif
+
batch->invalidate();
for (int i=0; i<m_alphaBatches.size(); ++i) {
@@ -1656,7 +1666,7 @@ void Renderer::invalidateBatchAndOverlappingRenderOrders(Batch *batch)
if (b->first) {
int bf = b->first->order;
int bl = b->lastOrderInBatch;
- if (bl > m_renderOrderRebuildLower && bf < m_renderOrderRebuildUpper)
+ if (bl > first && bf < last)
b->invalidate();
}
}
@@ -1731,7 +1741,11 @@ bool Renderer::checkOverlap(int first, int last, const Rect &bounds)
{
for (int i=first; i<=last; ++i) {
Element *e = m_alphaRenderList.at(i);
+#if defined(QSGBATCHRENDERER_INVALIDATE_WEDGED_NODES)
if (!e || e->batch)
+#else
+ if (!e)
+#endif
continue;
Q_ASSERT(e->boundsComputed);
if (e->bounds.intersects(bounds))
@@ -1802,8 +1816,12 @@ void Renderer::prepareAlphaBatches()
continue;
if (ej->root != ei->root || ej->isRenderNode)
break;
- if (ej->batch)
+ if (ej->batch) {
+#if !defined(QSGBATCHRENDERER_INVALIDATE_WEDGED_NODES)
+ overlapBounds |= ej->bounds;
+#endif
continue;
+ }
QSGGeometryNode *gnj = ej->node;
if (gnj->geometry()->vertexCount() == 0)
@@ -3637,8 +3655,11 @@ void Renderer::prepareRenderPass(RenderPassContext *ctx)
}
m_rebuild = 0;
+
+#if defined(QSGBATCHRENDERER_INVALIDATE_WEDGED_NODES)
m_renderOrderRebuildLower = -1;
m_renderOrderRebuildUpper = -1;
+#endif
if (m_visualizer->mode() != Visualizer::VisualizeNothing)
m_visualizer->prepareVisualize();
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h
index e94fc3866e..a42c41304f 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h
@@ -886,8 +886,10 @@ private:
uint m_rebuild;
qreal m_zRange;
+#if defined(QSGBATCHRENDERER_INVALIDATE_WEDGED_NODES)
int m_renderOrderRebuildLower;
int m_renderOrderRebuildUpper;
+#endif
int m_batchNodeThreshold;
int m_batchVertexThreshold;