aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/qtquick2.cpp4
-rw-r--r--src/quick/util/qquickprofiler.cpp123
-rw-r--r--src/quick/util/qquickprofiler_p.h30
3 files changed, 26 insertions, 131 deletions
diff --git a/src/quick/qtquick2.cpp b/src/quick/qtquick2.cpp
index ecf6865895..cabf0589e2 100644
--- a/src/quick/qtquick2.cpp
+++ b/src/quick/qtquick2.cpp
@@ -190,10 +190,6 @@ void QQmlQtQuick2Module::defineModule()
QQmlEngineDebugService *debugService = QQmlDebugConnector::service<QQmlEngineDebugService>();
if (debugService)
debugService->setStatesDelegate(new QQmlQtQuick2DebugStatesDelegate);
-
- QQmlProfilerService *profilerService = QQmlDebugConnector::service<QQmlProfilerService>();
- if (profilerService)
- QQuickProfiler::initialize(profilerService);
}
void QQmlQtQuick2Module::undefineModule()
diff --git a/src/quick/util/qquickprofiler.cpp b/src/quick/util/qquickprofiler.cpp
index 5ed1ff05af..cb6212196e 100644
--- a/src/quick/util/qquickprofiler.cpp
+++ b/src/quick/util/qquickprofiler.cpp
@@ -32,9 +32,11 @@
****************************************************************************/
#include "qquickprofiler_p.h"
-#include <QCoreApplication>
-#include <private/qqmldebugserviceinterfaces_p.h>
-#include <private/qpacket_p.h>
+
+#include <QtQml/private/qqmlabstractprofileradapter_p.h>
+
+#include <QtCore/qcoreapplication.h>
+#include <QtCore/qthread.h>
QT_BEGIN_NAMESPACE
@@ -42,98 +44,10 @@ QT_BEGIN_NAMESPACE
QQuickProfiler *QQuickProfiler::s_instance = 0;
quint64 QQuickProfiler::featuresEnabled = 0;
-// convert to QByteArrays that can be sent to the debug client
-// use of QDataStream can skew results
-// (see tst_qqmldebugtrace::trace() benchmark)
-void QQuickProfilerData::toByteArrays(QList<QByteArray> &messages) const
-{
- Q_ASSERT_X(((messageType | detailType) & (1 << 31)) == 0, Q_FUNC_INFO, "You can use at most 31 message types and 31 detail types.");
- for (uint decodedMessageType = 0; (messageType >> decodedMessageType) != 0; ++decodedMessageType) {
- if ((messageType & (1 << decodedMessageType)) == 0)
- continue;
-
- for (uint decodedDetailType = 0; (detailType >> decodedDetailType) != 0; ++decodedDetailType) {
- if ((detailType & (1 << decodedDetailType)) == 0)
- continue;
-
- //### using QDataStream is relatively expensive
- QPacket ds;
- ds << time << decodedMessageType << decodedDetailType;
-
- switch (decodedMessageType) {
- case QQuickProfiler::Event:
- switch (decodedDetailType) {
- case QQuickProfiler::AnimationFrame:
- ds << framerate << count << threadId;
- break;
- case QQuickProfiler::Key:
- case QQuickProfiler::Mouse:
- ds << inputType << inputA << inputB;
- break;
- }
- break;
- case QQuickProfiler::PixmapCacheEvent:
- ds << detailUrl.toString();
- switch (decodedDetailType) {
- case QQuickProfiler::PixmapSizeKnown: ds << x << y; break;
- case QQuickProfiler::PixmapReferenceCountChanged: ds << count; break;
- case QQuickProfiler::PixmapCacheCountChanged: ds << count; break;
- default: break;
- }
- break;
- case QQuickProfiler::SceneGraphFrame:
- switch (decodedDetailType) {
- // RendererFrame: preprocessTime, updateTime, bindingTime, renderTime
- case QQuickProfiler::SceneGraphRendererFrame: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4; break;
- // AdaptationLayerFrame: glyphCount (which is an integer), glyphRenderTime, glyphStoreTime
- case QQuickProfiler::SceneGraphAdaptationLayerFrame: ds << subtime_3 << subtime_1 << subtime_2; break;
- // ContextFrame: compiling material time
- case QQuickProfiler::SceneGraphContextFrame: ds << subtime_1; break;
- // RenderLoop: syncTime, renderTime, swapTime
- case QQuickProfiler::SceneGraphRenderLoopFrame: ds << subtime_1 << subtime_2 << subtime_3; break;
- // TexturePrepare: bind, convert, swizzle, upload, mipmap
- case QQuickProfiler::SceneGraphTexturePrepare: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4 << subtime_5; break;
- // TextureDeletion: deletionTime
- case QQuickProfiler::SceneGraphTextureDeletion: ds << subtime_1; break;
- // PolishAndSync: polishTime, waitTime, syncTime, animationsTime,
- case QQuickProfiler::SceneGraphPolishAndSync: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4; break;
- // WindowsRenderLoop: GL time, make current time, SceneGraph time
- case QQuickProfiler::SceneGraphWindowsRenderShow: ds << subtime_1 << subtime_2 << subtime_3; break;
- // WindowsAnimations: update time
- case QQuickProfiler::SceneGraphWindowsAnimations: ds << subtime_1; break;
- // non-threaded rendering: polish time
- case QQuickProfiler::SceneGraphPolishFrame: ds << subtime_1; break;
- default:break;
- }
- break;
- default:
- Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid message type.");
- break;
- }
- messages << ds.data();
- }
- }
-}
-
-qint64 QQuickProfiler::sendMessages(qint64 until, QList<QByteArray> &messages)
-{
- QMutexLocker lock(&m_dataMutex);
- while (next < m_data.size()) {
- if (m_data[next].time <= until)
- m_data[next++].toByteArrays(messages);
- else
- return m_data[next].time;
- }
- m_data.clear();
- next = 0;
- return -1;
-}
-
-void QQuickProfiler::initialize(QQmlProfilerService *service)
+void QQuickProfiler::initialize(QObject *parent)
{
Q_ASSERT(s_instance == 0);
- s_instance = new QQuickProfiler(service);
- service->addGlobalProfiler(s_instance);
+ s_instance = new QQuickProfiler(parent);
}
void animationTimerCallback(qint64 delta)
@@ -160,26 +74,10 @@ public slots:
#include "qquickprofiler.moc"
-QQuickProfiler::QQuickProfiler(QQmlProfilerService *service) :
- QQmlAbstractProfilerAdapter(service), next(0)
+QQuickProfiler::QQuickProfiler(QObject *parent) : QObject(parent)
{
// This is safe because at this point the m_instance isn't initialized, yet.
m_timer.start();
-
- // We can always do DirectConnection here as all methods are protected by mutexes
- connect(this, SIGNAL(profilingEnabled(quint64)), this, SLOT(startProfilingImpl(quint64)),
- Qt::DirectConnection);
- connect(this, SIGNAL(profilingEnabledWhileWaiting(quint64)),
- this, SLOT(startProfilingImpl(quint64)), Qt::DirectConnection);
- connect(this, SIGNAL(referenceTimeKnown(QElapsedTimer)), this, SLOT(setTimer(QElapsedTimer)),
- Qt::DirectConnection);
- connect(this, SIGNAL(profilingDisabled()), this, SLOT(stopProfilingImpl()),
- Qt::DirectConnection);
- connect(this, SIGNAL(profilingDisabledWhileWaiting()), this, SLOT(stopProfilingImpl()),
- Qt::DirectConnection);
- connect(this, SIGNAL(dataRequested()), this, SLOT(reportDataImpl()),
- Qt::DirectConnection);
-
CallbackRegistrationHelper *helper = new CallbackRegistrationHelper; // will delete itself
helper->moveToThread(QCoreApplication::instance()->thread());
QMetaObject::invokeMethod(helper, "registerAnimationTimerCallback", Qt::QueuedConnection);
@@ -195,7 +93,6 @@ QQuickProfiler::~QQuickProfiler()
void QQuickProfiler::startProfilingImpl(quint64 features)
{
QMutexLocker lock(&m_dataMutex);
- next = 0;
m_data.clear();
featuresEnabled = features;
}
@@ -206,12 +103,12 @@ void QQuickProfiler::stopProfilingImpl()
QMutexLocker lock(&m_dataMutex);
featuresEnabled = 0;
}
- service->dataReady(this);
+ emit dataReady(m_data);
}
void QQuickProfiler::reportDataImpl()
{
- service->dataReady(this);
+ emit dataReady(m_data);
}
void QQuickProfiler::setTimer(const QElapsedTimer &t)
diff --git a/src/quick/util/qquickprofiler_p.h b/src/quick/util/qquickprofiler_p.h
index 78216acc7d..4983adf63b 100644
--- a/src/quick/util/qquickprofiler_p.h
+++ b/src/quick/util/qquickprofiler_p.h
@@ -45,13 +45,14 @@
// We mean it.
//
-#include <private/qtquickglobal_p.h>
#include <QtCore/private/qabstractanimation_p.h>
-#include <QtQml/private/qqmlabstractprofileradapter_p.h>
-#include <QUrl>
-#include <QSize>
-#include <QMutex>
-#include <QThreadStorage>
+#include <QtQml/private/qqmlprofilerdefinitions_p.h>
+#include <QtQuick/private/qtquickglobal_p.h>
+
+#include <QtCore/qurl.h>
+#include <QtCore/qsize.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qthreadstorage.h>
QT_BEGIN_NAMESPACE
@@ -164,8 +165,6 @@ struct Q_AUTOTEST_EXPORT QQuickProfilerData
int threadId;
int inputB; //used by input events
};
-
- void toByteArrays(QList<QByteArray> &messages) const;
};
Q_DECLARE_TYPEINFO(QQuickProfilerData, Q_MOVABLE_TYPE);
@@ -203,7 +202,7 @@ public:
}
};
-class Q_QUICK_PRIVATE_EXPORT QQuickProfiler : public QQmlAbstractProfilerAdapter {
+class Q_QUICK_PRIVATE_EXPORT QQuickProfiler : public QObject, public QQmlProfilerDefinitions {
Q_OBJECT
public:
@@ -314,7 +313,6 @@ public:
qint64 timestamp() { return m_timer.nsecsElapsed(); }
- qint64 sendMessages(qint64 until, QList<QByteArray> &messages);
static quint64 featuresEnabled;
static bool profilingSceneGraph()
@@ -322,19 +320,20 @@ public:
return featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph);
}
- static void initialize(QQmlProfilerService *service);
+ static void initialize(QObject *parent);
virtual ~QQuickProfiler();
protected:
- int next;
+ friend class QQuickProfilerAdapter;
+
static QQuickProfiler *s_instance;
QMutex m_dataMutex;
QElapsedTimer m_timer;
- QVarLengthArray<QQuickProfilerData> m_data;
+ QVector<QQuickProfilerData> m_data;
QQuickProfilerSceneGraphData m_sceneGraphData;
- QQuickProfiler(QQmlProfilerService *service);
+ QQuickProfiler(QObject *parent);
void processMessage(const QQuickProfilerData &message)
{
@@ -342,6 +341,9 @@ protected:
m_data.append(message);
}
+signals:
+ void dataReady(const QVector<QQuickProfilerData> &data);
+
protected slots:
void startProfilingImpl(quint64 features);
void stopProfilingImpl();