diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2021-02-12 07:43:22 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-02-25 09:06:22 +0000 |
commit | 4d77a0727e18fb3391567b55b213e8721c43cea1 (patch) | |
tree | e8e6eb675ab47039ec5b18bc0a1db5f649edf8a8 /src | |
parent | 4bc08dcb9481b700128f2aa3299e63f3f0d8466a (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.cpp | 25 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h | 2 |
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; |