diff options
Diffstat (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index f525c83009..c9115f35fc 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -758,6 +758,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) @@ -1422,8 +1424,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) { @@ -1431,7 +1436,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(); } } @@ -1444,7 +1449,7 @@ void Renderer::invalidateBatchAndOverlappingRenderOrders(Batch *batch) */ void Renderer::cleanupBatches(QDataBuffer<Batch *> *batches) { if (batches->size()) { - std::sort(&batches->first(), &batches->last() + 1, qsg_sort_batch_is_valid); + std::stable_sort(&batches->first(), &batches->last() + 1, qsg_sort_batch_is_valid); int count = 0; while (count < batches->size() && batches->at(count)->first) ++count; @@ -2190,7 +2195,7 @@ void Renderer::renderUnmergedBatch(const Batch *batch) if (g->drawingMode() == GL_LINE_STRIP || g->drawingMode() == GL_LINE_LOOP || g->drawingMode() == GL_LINES) glLineWidth(g->lineWidth()); #if !defined(QT_OPENGL_ES_2) - else if (g->drawingMode() == GL_POINTS) + else if (!QOpenGLContext::currentContext()->isOpenGLES() && g->drawingMode() == GL_POINTS) glPointSize(g->lineWidth()); #endif @@ -2430,6 +2435,8 @@ void Renderer::render() renderBatches(); m_rebuild = 0; + m_renderOrderRebuildLower = -1; + m_renderOrderRebuildUpper = -1; if (m_visualizeMode != VisualizeNothing) visualize(); |