aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2013-09-04 14:08:41 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-05 13:28:59 +0200
commit21a08ccde3c7c2dc69e06b714549585bbf39b5c3 (patch)
tree174852af4daec800223d7345102b9f5a26f4d8b5 /src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
parent936e3f5098de389d65308aeb3c918d77647d46ab (diff)
Fix rendering errors in Qt Quick Controls gallery
First, when doing a partial rebuild, we need to mark all elements for orphaning, not just those without a batch, as the renderlist should at all times contain everything that is rendered on screen. Second, we had a small bug with material changes where we would overwrite the rebuild state instead of adding to it. This led to the render lists not being rebuilt from scratch in some scenarios. Third, after the shadow nodes rewrite, we didn't mark for a full rebuild when clips were added. Change-Id: I6707ebfa2908fcedd7fb636fb25b844be15fdea1 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp')
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index aa3c72cd44..8d4b4dd9f6 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -851,6 +851,7 @@ void Renderer::nodeWasAdded(QSGNode *node, Node *shadowParent)
} else if (node->type() == QSGNode::ClipNodeType) {
snode->data = new ClipBatchRootInfo;
+ m_rebuild |= FullRebuild;
} else if (node->type() == QSGNode::RenderNodeType) {
RenderNodeElement *e = new RenderNodeElement(static_cast<QSGRenderNode *>(node));
@@ -1037,7 +1038,7 @@ void Renderer::nodeChanged(QSGNode *node, QSGNode::DirtyState state)
if (!e->batch->isMaterialCompatible(e))
m_rebuild = Renderer::FullRebuild;
} else {
- m_rebuild = Renderer::BuildBatches;
+ m_rebuild |= Renderer::BuildBatches;
}
}
}
@@ -1111,6 +1112,9 @@ void Renderer::buildRenderLists(QSGNode *node)
} else if (node->type() == QSGNode::ClipNodeType || shadowNode->isBatchRoot) {
Q_ASSERT(m_nodes.contains(node));
BatchRootInfo *info = batchRootInfo(m_nodes.value(node));
+ Q_ASSERT(!m_explicitOrdering || info->firstOrder >= 0);
+ Q_ASSERT(!m_explicitOrdering || info->lastOrder >= 0);
+
if (m_explicitOrdering)
m_nextRenderOrder = info->firstOrder;
int currentOrder = m_nextRenderOrder;
@@ -1152,7 +1156,7 @@ static void qsg_addOrphanedElements(QDataBuffer<Element *> &orphans, const QData
orphans.reset();
for (int i=0; i<renderList.size(); ++i) {
Element *e = renderList.at(i);
- if (e && !e->removed && e->batch == 0) {
+ if (e && !e->removed) {
e->orphaned = true;
orphans.add(e);
}