aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph
diff options
context:
space:
mode:
authorJocelyn Turcotte <jturcotte@woboq.com>2015-08-02 19:43:23 +0200
committerJocelyn Turcotte (Woboq GmbH) <jturcotte@woboq.com>2015-08-13 11:42:35 +0000
commit26a230ee0ed68d39d4d13bfeaafd9839ee2a2a00 (patch)
tree62c4798602e8d456c06ceadd2403bf7dfe036108 /src/quick/scenegraph
parenta2ccdd33888cb0eb4516089d3418dd01c8cca25c (diff)
Avoid rebuiding batches during a material animation
Animating a complete batch of geometries bound by property bindings will cause an unnecessary rebuild of the batch on each animation step even though it will end up with the same batch as in the previous frame. Since the invalidation happens in nodeChanged, any node change in an updatePaintNode might trigger an invalitation if it is compared with a material that hasn't been updated yet. Delay the verification of the DirtyMaterial flag until all materials have been updated, later on in visitNode, to make sure that we call compare only on up-to-date materials. Change-Id: I03c095efc20817813508d959c74b41eae57beedc Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
Diffstat (limited to 'src/quick/scenegraph')
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index f49fedbbf6..6d0ed4ce9f 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -487,6 +487,11 @@ void Updater::visitGeometryNode(Node *n)
if (e->batch)
renderer->invalidateBatchAndOverlappingRenderOrders(e->batch);
}
+ if (n->dirtyState & QSGNode::DirtyMaterial) {
+ Element *e = n->element();
+ if (e->batch && e->batch->isMaterialCompatible(e) == BatchBreaksOnCompare)
+ renderer->invalidateBatchAndOverlappingRenderOrders(e->batch);
+ }
}
SHADOWNODE_TRAVERSE(n) visitNode(*child);
@@ -1216,10 +1221,7 @@ void Renderer::nodeChanged(QSGNode *node, QSGNode::DirtyState state)
if (e->isMaterialBlended != blended) {
m_rebuild |= Renderer::FullRebuild;
e->isMaterialBlended = blended;
- } else if (e->batch) {
- if (e->batch->isMaterialCompatible(e) == BatchBreaksOnCompare)
- invalidateBatchAndOverlappingRenderOrders(e->batch);
- } else {
+ } else if (!e->batch) {
m_rebuild |= Renderer::BuildBatches;
}
}