From 4d77a0727e18fb3391567b55b213e8721c43cea1 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Fri, 12 Feb 2021 07:43:22 +0100 Subject: 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 Reviewed-by: Laszlo Agocs Reviewed-by: Michael Brasser (cherry picked from commit 9aa3db2e19b2e1622b878cf34b1978f4fdbcac39) Reviewed-by: Qt Cherry-pick Bot --- src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 25 +++++++++++++++++++++-- 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; ifirst) { 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; -- cgit v1.2.3