From 1145d76ebad94acee602c83b59d125337d0ff193 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Wed, 19 Mar 2014 11:58:04 +0100 Subject: Invalidate all batches potentially affected by a change. When two separate changes have occurred, we need to not only invalidate the batches directly overlapping those, but also any batch which has render orders between the two. So, keep track of the range of invalidated render orders and invalidate everything in between. Task-number: QTBUG-37422 Change-Id: Ie5a289d5c569b84917ec9ac52671173c566e69b3 Reviewed-by: Laszlo Agocs --- src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp') diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index 614e1a83bc..a691ebb801 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -762,6 +762,8 @@ Renderer::Renderer(QSGRenderContext *ctx) , m_tmpOpaqueElements(16) , m_rebuild(FullRebuild) , m_zRange(0) + , m_renderOrderRebuildLower(-1) + , m_renderOrderRebuildUpper(-1) , m_currentMaterial(0) , m_currentShader(0) , m_currentClip(0) @@ -1423,8 +1425,11 @@ void Renderer::invalidateBatchAndOverlappingRenderOrders(Batch *batch) Q_ASSERT(batch); Q_ASSERT(batch->first); - int first = batch->first->order; - int last = batch->lastOrderInBatch; + 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; + batch->invalidate(); for (int i=0; ifirst) { int bf = b->first->order; int bl = b->lastOrderInBatch; - if (bl > first && bf < last) + if (bl > m_renderOrderRebuildLower && bf < m_renderOrderRebuildUpper) b->invalidate(); } } @@ -2426,6 +2431,8 @@ void Renderer::render() renderBatches(); m_rebuild = 0; + m_renderOrderRebuildLower = -1; + m_renderOrderRebuildUpper = -1; if (m_visualizeMode != VisualizeNothing) visualize(); -- cgit v1.2.3