aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar@sletta.org>2014-10-22 13:32:27 +0200
committerGunnar Sletta <gunnar@sletta.org>2014-11-02 11:27:55 +0100
commitd252ba67dadba9471160ce2ec277763178fea9db (patch)
tree8dc235fc6613b22a49a4e94ff2c78d64d05c213c /src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
parentd1b39ca5c9444a8c54edd3aa4548e27458cee718 (diff)
Use an allocator for QSGBatchRenderer::Node and Element instances.
Cuts down quite a bit on the time spent on the render thread during the sync phase. Change-Id: Ide8c4348141c84ed8abd9a869607a022652c2828 Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
Diffstat (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp')
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index ef125e07a9..ca5b038efa 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -832,8 +832,8 @@ Renderer::~Renderer()
for (int i=0; i<m_batchPool.size(); ++i) qsg_wipeBatch(m_batchPool.at(i), this);
}
- // The shadowtree
- qDeleteAll(m_nodes.values());
+ foreach (Node *n, m_nodes.values())
+ m_nodeAllocator.release(n);
// Remaining elements...
for (int i=0; i<m_elementsToDelete.size(); ++i) {
@@ -841,7 +841,7 @@ Renderer::~Renderer()
if (e->isRenderNode)
delete static_cast<RenderNodeElement *>(e);
else
- delete e;
+ m_elementAllocator.release(e);
}
}
@@ -980,7 +980,8 @@ void Renderer::nodeWasAdded(QSGNode *node, Node *shadowParent)
if (node->isSubtreeBlocked())
return;
- Node *snode = new Node(node);
+ Node *snode = m_nodeAllocator.allocate();
+ snode->sgNode = node;
m_nodes.insert(node, snode);
if (shadowParent) {
snode->parent = shadowParent;
@@ -988,7 +989,8 @@ void Renderer::nodeWasAdded(QSGNode *node, Node *shadowParent)
}
if (node->type() == QSGNode::GeometryNodeType) {
- snode->data = new Element(static_cast<QSGGeometryNode *>(node));
+ snode->data = m_elementAllocator.allocate();
+ snode->element()->setNode(static_cast<QSGGeometryNode *>(node));
} else if (node->type() == QSGNode::ClipNodeType) {
snode->data = new ClipBatchRootInfo;
@@ -1051,7 +1053,7 @@ void Renderer::nodeWasRemoved(Node *node)
}
Q_ASSERT(m_nodes.contains(node->sgNode));
- delete m_nodes.take(node->sgNode);
+ m_nodeAllocator.release(m_nodes.take(node->sgNode));
}
void Renderer::turnNodeIntoBatchRoot(Node *node)
@@ -1234,8 +1236,8 @@ void Renderer::buildRenderLists(QSGNode *node)
if (node->isSubtreeBlocked())
return;
- Q_ASSERT(m_nodes.contains(node));
Node *shadowNode = m_nodes.value(node);
+ Q_ASSERT(shadowNode);
if (node->type() == QSGNode::GeometryNodeType) {
QSGGeometryNode *gn = static_cast<QSGGeometryNode *>(node);
@@ -1256,7 +1258,7 @@ 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));
+ BatchRootInfo *info = batchRootInfo(shadowNode);
if (node == m_partialRebuildRoot) {
m_nextRenderOrder = info->firstOrder;
QSGNODE_TRAVERSE(node)
@@ -2460,7 +2462,7 @@ void Renderer::deleteRemovedElements()
if (e->isRenderNode)
delete static_cast<RenderNodeElement *>(e);
else
- delete e;
+ m_elementAllocator.release(e);
}
m_elementsToDelete.reset();
}