diff options
author | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-03-19 11:58:04 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-19 15:48:50 +0100 |
commit | 1145d76ebad94acee602c83b59d125337d0ff193 (patch) | |
tree | dddd0f02f0bebf05026b1f146853821ce4fecd28 /src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | |
parent | ebbabba0a57e756b846ff49c74f3ce1f6acf6824 (diff) |
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 <laszlo.agocs@digia.com>
Diffstat (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
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; i<m_alphaBatches.size(); ++i) { @@ -1432,7 +1437,7 @@ void Renderer::invalidateBatchAndOverlappingRenderOrders(Batch *batch) if (b->first) { 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(); |