From 32063559d6232ec9af3c9004ea66fd57d2e690f5 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 4 Aug 2017 11:28:25 +0200 Subject: shapes: Reduce stroke/fill node data Do not store the superfluous window and geometry pointers. Change-Id: Ib9cf4e62bdc6f32dc99cda25eddfebdfa05d579b Reviewed-by: Andy Nichols --- src/imports/shapes/qquickshapegenericrenderer.cpp | 34 +++++++++-------------- src/imports/shapes/qquickshapegenericrenderer_p.h | 7 +---- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/src/imports/shapes/qquickshapegenericrenderer.cpp b/src/imports/shapes/qquickshapegenericrenderer.cpp index 98ba89dc3d..8131f02f1a 100644 --- a/src/imports/shapes/qquickshapegenericrenderer.cpp +++ b/src/imports/shapes/qquickshapegenericrenderer.cpp @@ -75,38 +75,32 @@ static inline QQuickShapeGenericRenderer::Color4ub colorToColor4ub(const QColor } QQuickShapeGenericStrokeFillNode::QQuickShapeGenericStrokeFillNode(QQuickWindow *window) - : m_geometry(new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), 0, 0)), - m_window(window), - m_material(nullptr) + : m_material(nullptr) { - setGeometry(m_geometry); - activateMaterial(MatSolidColor); + setFlag(QSGNode::OwnsGeometry, true); + setGeometry(new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), 0, 0)); + activateMaterial(window, MatSolidColor); #ifdef QSG_RUNTIME_DESCRIPTION qsgnode_set_description(this, QLatin1String("stroke-fill")); #endif } -QQuickShapeGenericStrokeFillNode::~QQuickShapeGenericStrokeFillNode() -{ - delete m_geometry; -} - -void QQuickShapeGenericStrokeFillNode::activateMaterial(Material m) +void QQuickShapeGenericStrokeFillNode::activateMaterial(QQuickWindow *window, Material m) { switch (m) { case MatSolidColor: // Use vertexcolor material. Items with different colors remain batchable // this way, at the expense of having to provide per-vertex color values. - m_material.reset(QQuickShapeGenericMaterialFactory::createVertexColor(m_window)); + m_material.reset(QQuickShapeGenericMaterialFactory::createVertexColor(window)); break; case MatLinearGradient: - m_material.reset(QQuickShapeGenericMaterialFactory::createLinearGradient(m_window, this)); + m_material.reset(QQuickShapeGenericMaterialFactory::createLinearGradient(window, this)); break; case MatRadialGradient: - m_material.reset(QQuickShapeGenericMaterialFactory::createRadialGradient(m_window, this)); + m_material.reset(QQuickShapeGenericMaterialFactory::createRadialGradient(window, this)); break; case MatConicalGradient: - m_material.reset(QQuickShapeGenericMaterialFactory::createConicalGradient(m_window, this)); + m_material.reset(QQuickShapeGenericMaterialFactory::createConicalGradient(window, this)); break; default: qWarning("Unknown material %d", m); @@ -583,7 +577,7 @@ void QQuickShapeGenericRenderer::updateFillNode(ShapePathData *d, QQuickShapeGen QQuickShapeGenericStrokeFillNode *n = node->m_fillNode; updateShadowDataInNode(d, n); - QSGGeometry *g = n->m_geometry; + QSGGeometry *g = n->geometry(); if (d->fillVertices.isEmpty()) { if (g->vertexCount() || g->indexCount()) { g->allocate(0, 0); @@ -607,7 +601,7 @@ void QQuickShapeGenericRenderer::updateFillNode(ShapePathData *d, QQuickShapeGen default: Q_UNREACHABLE(); } - n->activateMaterial(gradMat); + n->activateMaterial(m_item->window(), gradMat); if (d->effectiveDirty & DirtyFillGradient) { // Gradients are implemented via a texture-based material. n->markDirty(QSGNode::DirtyMaterial); @@ -616,7 +610,7 @@ void QQuickShapeGenericRenderer::updateFillNode(ShapePathData *d, QQuickShapeGen return; } } else { - n->activateMaterial(QQuickShapeGenericStrokeFillNode::MatSolidColor); + n->activateMaterial(m_item->window(), QQuickShapeGenericStrokeFillNode::MatSolidColor); // fast path for updating only color values when no change in vertex positions if ((d->effectiveDirty & DirtyColor) && !(d->effectiveDirty & DirtyFillGeom)) { ColoredVertex *vdst = reinterpret_cast(g->vertexData()); @@ -633,8 +627,6 @@ void QQuickShapeGenericRenderer::updateFillNode(ShapePathData *d, QQuickShapeGen g = new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), d->fillVertices.count(), indexCount, d->indexType); n->setGeometry(g); - delete n->m_geometry; - n->m_geometry = g; } else { g->allocate(d->fillVertices.count(), indexCount); } @@ -653,7 +645,7 @@ void QQuickShapeGenericRenderer::updateStrokeNode(ShapePathData *d, QQuickShapeG return; QQuickShapeGenericStrokeFillNode *n = node->m_strokeNode; - QSGGeometry *g = n->m_geometry; + QSGGeometry *g = n->geometry(); if (d->strokeVertices.isEmpty()) { if (g->vertexCount() || g->indexCount()) { g->allocate(0, 0); diff --git a/src/imports/shapes/qquickshapegenericrenderer_p.h b/src/imports/shapes/qquickshapegenericrenderer_p.h index 32cec798ec..11070ae7dc 100644 --- a/src/imports/shapes/qquickshapegenericrenderer_p.h +++ b/src/imports/shapes/qquickshapegenericrenderer_p.h @@ -205,7 +205,6 @@ class QQuickShapeGenericStrokeFillNode : public QSGGeometryNode { public: QQuickShapeGenericStrokeFillNode(QQuickWindow *window); - ~QQuickShapeGenericStrokeFillNode(); enum Material { MatSolidColor, @@ -214,16 +213,12 @@ public: MatConicalGradient }; - void activateMaterial(Material m); - - QQuickWindow *window() const { return m_window; } + void activateMaterial(QQuickWindow *window, Material m); // shadow data for custom materials QQuickAbstractPathRenderer::GradientDesc m_fillGradient; private: - QSGGeometry *m_geometry; - QQuickWindow *m_window; QScopedPointer m_material; friend class QQuickShapeGenericRenderer; -- cgit v1.2.3