diff options
Diffstat (limited to 'src/quick/scenegraph/coreapi')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsggeometry.cpp | 18 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgmaterial.cpp | 1 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgmaterial.h | 1 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgnode.cpp | 52 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgnode.h | 11 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgnode_p.h | 76 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgrenderer.cpp | 52 |
7 files changed, 180 insertions, 31 deletions
diff --git a/src/quick/scenegraph/coreapi/qsggeometry.cpp b/src/quick/scenegraph/coreapi/qsggeometry.cpp index 818b9b26aa..7f09af4da3 100644 --- a/src/quick/scenegraph/coreapi/qsggeometry.cpp +++ b/src/quick/scenegraph/coreapi/qsggeometry.cpp @@ -332,42 +332,42 @@ const QSGGeometry::AttributeSet &QSGGeometry::defaultAttributes_ColoredPoint2D() /*! \fn const QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D() const - Convenience function to access the vertex data as an immuatble + Convenience function to access the vertex data as an immutable array of QSGGeometry::ColoredPoint2D. */ /*! \fn QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D() - Convenience function to access the vertex data as a muatble + Convenience function to access the vertex data as a mutable array of QSGGeometry::ColoredPoint2D. */ /*! \fn const QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D() const - Convenience function to access the vertex data as an immuatble + Convenience function to access the vertex data as an immutable array of QSGGeometry::TexturedPoint2D. */ /*! \fn QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D() - Convenience function to access the vertex data as a muatble + Convenience function to access the vertex data as a mutable array of QSGGeometry::TexturedPoint2D. */ /*! \fn const QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D() const - Convenience function to access the vertex data as an immuatble + Convenience function to access the vertex data as an immutable array of QSGGeometry::Point2D. */ /*! \fn QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D() - Convenience function to access the vertex data as a muatble + Convenience function to access the vertex data as a mutable array of QSGGeometry::Point2D. */ @@ -705,7 +705,8 @@ void QSGGeometry::updateTexturedRectGeometry(QSGGeometry *g, const QRectF &rect, The default is AlwaysUploadPattern. When set to anything other than the default, the user must call markIndexDataDirty() after changing - the index data. + the index data, in addition to calling QSGNode::markDirty() with + QSGNode::DirtyGeometry. */ void QSGGeometry::setIndexDataPattern(DataPattern p) @@ -728,7 +729,8 @@ void QSGGeometry::setIndexDataPattern(DataPattern p) The default is AlwaysUploadPattern. When set to anything other than the default, the user must call markVertexDataDirty() after changing - the vertex data. + the vertex data, in addition to calling QSGNode::markDirty() with + QSGNode::DirtyGeometry. */ void QSGGeometry::setVertexDataPattern(DataPattern p) diff --git a/src/quick/scenegraph/coreapi/qsgmaterial.cpp b/src/quick/scenegraph/coreapi/qsgmaterial.cpp index c0794d0d69..9346236db9 100644 --- a/src/quick/scenegraph/coreapi/qsgmaterial.cpp +++ b/src/quick/scenegraph/coreapi/qsgmaterial.cpp @@ -556,6 +556,7 @@ static void qt_print_material_count() QSGMaterial::QSGMaterial() : m_flags(0) + , m_reserved(0) { #ifndef QT_NO_DEBUG if (qsg_leak_check) { diff --git a/src/quick/scenegraph/coreapi/qsgmaterial.h b/src/quick/scenegraph/coreapi/qsgmaterial.h index ee8889deac..20ab21ad28 100644 --- a/src/quick/scenegraph/coreapi/qsgmaterial.h +++ b/src/quick/scenegraph/coreapi/qsgmaterial.h @@ -133,6 +133,7 @@ public: void setFlag(Flags flags, bool on = true); private: + friend class QSGContext; Flags m_flags; void *m_reserved; Q_DISABLE_COPY(QSGMaterial) diff --git a/src/quick/scenegraph/coreapi/qsgnode.cpp b/src/quick/scenegraph/coreapi/qsgnode.cpp index 6a22e0e7f9..25f8f342c9 100644 --- a/src/quick/scenegraph/coreapi/qsgnode.cpp +++ b/src/quick/scenegraph/coreapi/qsgnode.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "qsgnode.h" +#include "qsgnode_p.h" #include "qsgrenderer_p.h" #include "qsgnodeupdater_p.h" #include "qsgmaterial.h" @@ -128,12 +129,12 @@ static void qt_print_node_count() before rendering starts. \value OwnsGeometry Only valid for QSGGeometryNode and QSGClipNode. The node has ownership over the QSGGeometry instance and will - delete it when the node is destroyed. + delete it when the node is destroyed or a geometry is assigned. \value OwnsMaterial Only valid for QSGGeometryNode. The node has ownership - over the material and will delete it when the node is destroyed. + over the material and will delete it when the node is destroyed or a material is assigned. \value OwnsOpaqueMaterial Only valid for QSGGeometryNode. The node has ownership over the opaque material and will delete it when the node is - destroyed. + destroyed or a material is assigned. */ /*! @@ -267,6 +268,26 @@ QSGNode::QSGNode(NodeType type) } /*! + * Constructs a new node with the given node type. + * + * \internal + */ +QSGNode::QSGNode(QSGNodePrivate &dd, NodeType type) + : m_parent(0) + , m_type(type) + , m_firstChild(0) + , m_lastChild(0) + , m_nextSibling(0) + , m_previousSibling(0) + , m_subtreeRenderableCount(type == GeometryNodeType || type == RenderNodeType ? 1 : 0) + , m_nodeFlags(OwnedByParent) + , m_dirtyState(0) + , d_ptr(&dd) +{ + init(); +} + +/*! * \internal */ void QSGNode::init() @@ -678,6 +699,18 @@ QSGBasicGeometryNode::QSGBasicGeometryNode(NodeType type) /*! + \internal + */ +QSGBasicGeometryNode::QSGBasicGeometryNode(QSGBasicGeometryNodePrivate &dd, NodeType type) + : QSGNode(dd, type) + , m_geometry(0) + , m_matrix(0) + , m_clip_list(0) +{ +} + + +/*! Deletes this QSGBasicGeometryNode. If the node has the flag QSGNode::OwnsGeometry set, it will also delete the @@ -808,6 +841,19 @@ QSGGeometryNode::QSGGeometryNode() /*! + \internal + */ +QSGGeometryNode::QSGGeometryNode(QSGGeometryNodePrivate &dd) + : QSGBasicGeometryNode(dd, GeometryNodeType) + , m_render_order(0) + , m_material(0) + , m_opaque_material(0) + , m_opacity(1) +{ +} + + +/*! Deletes this geometry node. The flags QSGNode::OwnsMaterial, QSGNode::OwnsOpaqueMaterial and diff --git a/src/quick/scenegraph/coreapi/qsgnode.h b/src/quick/scenegraph/coreapi/qsgnode.h index 3fa2f7fc04..d83e6bcc81 100644 --- a/src/quick/scenegraph/coreapi/qsgnode.h +++ b/src/quick/scenegraph/coreapi/qsgnode.h @@ -58,6 +58,9 @@ class QSGRootNode; class QSGGeometryNode; class QSGTransformNode; class QSGClipNode; +class QSGNodePrivate; +class QSGBasicGeometryNodePrivate; +class QSGGeometryNodePrivate; class Q_QUICK_EXPORT QSGNode { @@ -149,6 +152,7 @@ public: protected: QSGNode(NodeType type); + QSGNode(QSGNodePrivate &dd, NodeType type); private: friend class QSGRootNode; @@ -167,7 +171,8 @@ private: Flags m_nodeFlags; DirtyState m_dirtyState; - void *m_reserved; +protected: + QScopedPointer<QSGNodePrivate> d_ptr; }; class Q_QUICK_EXPORT QSGBasicGeometryNode : public QSGNode @@ -184,6 +189,7 @@ public: protected: QSGBasicGeometryNode(NodeType type); + QSGBasicGeometryNode(QSGBasicGeometryNodePrivate &dd, NodeType type); private: friend class QSGNodeUpdater; @@ -218,6 +224,9 @@ public: void setInheritedOpacity(qreal opacity); qreal inheritedOpacity() const { return m_opacity; } +protected: + QSGGeometryNode(QSGGeometryNodePrivate &dd); + private: friend class QSGNodeUpdater; diff --git a/src/quick/scenegraph/coreapi/qsgnode_p.h b/src/quick/scenegraph/coreapi/qsgnode_p.h new file mode 100644 index 0000000000..b0d8088af2 --- /dev/null +++ b/src/quick/scenegraph/coreapi/qsgnode_p.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB) +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QSGNODE_P_H +#define QSGNODE_P_H + +#include <qglobal.h> + +QT_BEGIN_NAMESPACE + +class QSGNodePrivate +{ +public: + QSGNodePrivate() {} + virtual ~QSGNodePrivate() {} +}; + + +class QSGBasicGeometryNodePrivate : public QSGNodePrivate +{ +public: + QSGBasicGeometryNodePrivate() + : QSGNodePrivate() + {} +}; + + +class QSGGeometryNodePrivate: public QSGBasicGeometryNodePrivate +{ +public: + QSGGeometryNodePrivate() + : QSGBasicGeometryNodePrivate() + {} +}; + +QT_END_NAMESPACE + +#endif // QSGNODE_P_H diff --git a/src/quick/scenegraph/coreapi/qsgrenderer.cpp b/src/quick/scenegraph/coreapi/qsgrenderer.cpp index b46d45be57..805cfaad0d 100644 --- a/src/quick/scenegraph/coreapi/qsgrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgrenderer.cpp @@ -53,6 +53,8 @@ #include <qdatetime.h> +#include <private/qqmlprofilerservice_p.h> + QT_BEGIN_NAMESPACE //#define RENDERER_DEBUG @@ -62,9 +64,9 @@ QT_BEGIN_NAMESPACE #ifndef QSG_NO_RENDER_TIMING static bool qsg_render_timing = !qgetenv("QSG_RENDER_TIMING").isEmpty(); -static QTime frameTimer; -static int preprocessTime; -static int updatePassTime; +static QElapsedTimer frameTimer; +static qint64 preprocessTime; +static qint64 updatePassTime; #endif void QSGBindable::clear(QSGRenderer::ClearMode mode) const @@ -238,10 +240,11 @@ void QSGRenderer::renderScene(const QSGBindable &bindable) #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) + bool profileFrames = qsg_render_timing || QQmlProfilerService::enabled; + if (profileFrames) frameTimer.start(); - int bindTime = 0; - int renderTime = 0; + qint64 bindTime = 0; + qint64 renderTime = 0; #endif m_bindable = &bindable; @@ -249,8 +252,8 @@ void QSGRenderer::renderScene(const QSGBindable &bindable) bindable.bind(); #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - bindTime = frameTimer.elapsed(); + if (profileFrames) + bindTime = frameTimer.nsecsElapsed(); #endif #ifndef QT_NO_DEBUG @@ -270,8 +273,8 @@ void QSGRenderer::renderScene(const QSGBindable &bindable) render(); #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - renderTime = frameTimer.elapsed(); + if (profileFrames) + renderTime = frameTimer.nsecsElapsed(); #endif glDisable(GL_SCISSOR_TEST); @@ -292,12 +295,22 @@ void QSGRenderer::renderScene(const QSGBindable &bindable) #ifndef QSG_NO_RENDER_TIMING if (qsg_render_timing) { printf(" - Breakdown of render time: preprocess=%d, updates=%d, binding=%d, render=%d, total=%d\n", - preprocessTime, - updatePassTime - preprocessTime, - bindTime - updatePassTime, - renderTime - bindTime, - renderTime); + int(preprocessTime / 1000000), + int((updatePassTime - preprocessTime) / 1000000), + int((bindTime - updatePassTime) / 1000000), + int((renderTime - bindTime) / 1000000), + int(renderTime / 1000000)); + } + + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphRendererFrame, + preprocessTime, + updatePassTime - preprocessTime, + bindTime - updatePassTime, + renderTime - bindTime); } + #endif } @@ -380,16 +393,17 @@ void QSGRenderer::preprocess() } #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - preprocessTime = frameTimer.elapsed(); + bool profileFrames = qsg_render_timing || QQmlProfilerService::enabled; + if (profileFrames) + preprocessTime = frameTimer.nsecsElapsed(); #endif nodeUpdater()->setToplevelOpacity(context()->renderAlpha()); nodeUpdater()->updateStates(m_root_node); #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - updatePassTime = frameTimer.elapsed(); + if (profileFrames) + updatePassTime = frameTimer.nsecsElapsed(); #endif } |