From 49ef011e33b9ef977679b3d30f883fccea0d8748 Mon Sep 17 00:00:00 2001 From: Christiaan Janssen Date: Wed, 17 Apr 2013 16:46:12 +0200 Subject: QmlProfiler: SceneGraph profiling Change-Id: Ide71b330b13fc3816ed191bd9af84e0fce0d9587 Reviewed-by: Kai Koehne --- src/qml/debugger/qqmlprofilerservice.cpp | 110 +++++++++++++++++++++++-------- 1 file changed, 83 insertions(+), 27 deletions(-) (limited to 'src/qml/debugger/qqmlprofilerservice.cpp') diff --git a/src/qml/debugger/qqmlprofilerservice.cpp b/src/qml/debugger/qqmlprofilerservice.cpp index e016b2fdb5..963a861821 100644 --- a/src/qml/debugger/qqmlprofilerservice.cpp +++ b/src/qml/debugger/qqmlprofilerservice.cpp @@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE // instance will be set, unset in constructor. Allows static methods to be inlined. QQmlProfilerService *QQmlProfilerService::instance = 0; Q_GLOBAL_STATIC(QQmlProfilerService, profilerInstance) - +bool QQmlProfilerService::enabled = false; // convert to a QByteArray that can be sent to the debug client // use of QDataStream can skew results @@ -85,12 +85,37 @@ QByteArray QQmlProfilerData::toByteArray() const default: break; } } + if (messageType == (int)QQmlProfilerService::SceneGraphFrame) { + switch (detailType) { + // RendererFrame: preprocessTime, updateTime, bindingTime, renderTime + case QQmlProfilerService::SceneGraphRendererFrame: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4; break; + // AdaptationLayerFrame: glyphCount (which is an integer), glyphRenderTime, glyphStoreTime + case QQmlProfilerService::SceneGraphAdaptationLayerFrame: ds << (int)subtime_1 << subtime_2 << subtime_3; break; + // ContextFrame: compiling material time + case QQmlProfilerService::SceneGraphContextFrame: ds << subtime_1; break; + // RenderLoop: syncTime, renderTime, swapTime + case QQmlProfilerService::SceneGraphRenderLoopFrame: ds << subtime_1 << subtime_2 << subtime_3; break; + // TexturePrepare: bind, convert, swizzle, upload, mipmap + case QQmlProfilerService::SceneGraphTexturePrepare: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4 << subtime_5; break; + // TextureDeletion: deletionTime + case QQmlProfilerService::SceneGraphTextureDeletion: ds << subtime_1; break; + // PolishAndSync: polishTime, waitTime, syncTime, animationsTime, + case QQmlProfilerService::SceneGraphPolishAndSync: ds << subtime_1 << subtime_2 << subtime_3 << subtime_4; break; + // WindowsRenderLoop: GL time, make current time, SceneGraph time + case QQmlProfilerService::SceneGraphWindowsRenderShow: ds << subtime_1 << subtime_2 << subtime_3; break; + // WindowsAnimations: update time + case QQmlProfilerService::SceneGraphWindowsAnimations: ds << subtime_1; break; + // WindowsRenderWindow: polish time, sync time, render time, swap time + case QQmlProfilerService::SceneGraphWindowsPolishFrame: ds << subtime_1; break; + default:break; + } + } + return data; } QQmlProfilerService::QQmlProfilerService() - : QQmlDebugService(QStringLiteral("CanvasFrameRate"), 1), - m_enabled(false) + : QQmlDebugService(QStringLiteral("CanvasFrameRate"), 1) { m_timer.start(); @@ -140,6 +165,11 @@ void QQmlProfilerService::animationFrame(qint64 delta) profilerInstance()->animationFrameImpl(delta); } +void QQmlProfilerService::sceneGraphFrame(SceneGraphFrameType frameType, qint64 value1, qint64 value2, qint64 value3, qint64 value4, qint64 value5) +{ + profilerInstance()->sceneGraphFrameImpl(frameType, value1, value2, value3, value4, value5); +} + void QQmlProfilerService::sendProfilingData() { profilerInstance()->sendMessages(); @@ -169,81 +199,89 @@ bool QQmlProfilerService::stopProfilingImpl() void QQmlProfilerService::sendStartedProfilingMessageImpl() { - if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled) + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) return; QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)StartTrace, - QString(), -1, -1, 0, 0, 0}; + QString(), -1, -1, 0, 0, 0, + 0, 0, 0, 0, 0}; QQmlDebugService::sendMessage(ed.toByteArray()); } void QQmlProfilerService::addEventImpl(EventType event) { - if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled) + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) return; QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, - QString(), -1, -1, 0, 0, 0}; + QString(), -1, -1, 0, 0, 0, + 0, 0, 0, 0, 0}; processMessage(ed); } void QQmlProfilerService::startRange(RangeType range, BindingType bindingType) { - if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled) + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) return; QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, - QString(), -1, -1, 0, 0, (int)bindingType}; + QString(), -1, -1, 0, 0, (int)bindingType, + 0, 0, 0, 0, 0}; processMessage(rd); } void QQmlProfilerService::rangeData(RangeType range, const QString &rData) { - if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled) + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) return; QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, - rData, -1, -1, 0, 0, 0}; + rData, -1, -1, 0, 0, 0, + 0, 0, 0, 0, 0}; processMessage(rd); } void QQmlProfilerService::rangeData(RangeType range, const QUrl &rData) { - if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled) + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) return; QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, - rData.toString(), -1, -1, 0, 0, 0}; + rData.toString(), -1, -1, 0, 0, 0, + 0, 0, 0, 0, 0}; processMessage(rd); } void QQmlProfilerService::rangeLocation(RangeType range, const QString &fileName, int line, int column) { - if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled) + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) return; QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, - fileName, line, column, 0, 0, 0}; + fileName, line, column, 0, 0, 0, + 0, 0, 0, 0, 0}; processMessage(rd); } void QQmlProfilerService::rangeLocation(RangeType range, const QUrl &fileName, int line, int column) { - if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled) + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) return; QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, - fileName.toString(), line, column, 0, 0, 0}; + fileName.toString(), line, column, 0, 0, 0, + 0, 0, 0, 0, 0}; processMessage(rd); } void QQmlProfilerService::endRange(RangeType range) { - if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled) + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) return; QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, - QString(), -1, -1, 0, 0, 0}; + QString(), -1, -1, 0, 0, 0, + 0, 0, 0, 0, 0}; processMessage(rd); } @@ -251,7 +289,8 @@ void QQmlProfilerService::pixmapEventImpl(PixmapEventType eventType, const QUrl { // assuming enabled checked by caller QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)PixmapCacheEvent, (int)eventType, - url.toString(), -1, -1, -1, -1, -1}; + url.toString(), -1, -1, -1, -1, -1, + 0, 0, 0, 0, 0}; processMessage(rd); } @@ -259,7 +298,8 @@ void QQmlProfilerService::pixmapEventImpl(PixmapEventType eventType, const QUrl { // assuming enabled checked by caller QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)PixmapCacheEvent, (int)eventType, - url.toString(), width, height, -1, -1, -1}; + url.toString(), width, height, -1, -1, -1, + 0, 0, 0, 0, 0}; processMessage(rd); } @@ -267,14 +307,28 @@ void QQmlProfilerService::pixmapEventImpl(PixmapEventType eventType, const QUrl { // assuming enabled checked by caller QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)PixmapCacheEvent, (int)eventType, - url.toString(), -1, -1, -1, count, -1}; + url.toString(), -1, -1, -1, count, -1, + 0, 0, 0, 0, 0}; + processMessage(rd); +} + +void QQmlProfilerService::sceneGraphFrameImpl(SceneGraphFrameType frameType, qint64 value1, qint64 value2, qint64 value3, qint64 value4, qint64 value5) +{ + if (!QQmlDebugService::isDebuggingEnabled() || !enabled) + return; + + // because I already have some space to store ints in the struct, I'll use it to store the frame data + // even though the field names do not match + QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)SceneGraphFrame, (int)frameType, QString(), + -1, -1, -1, -1, -1, + value1, value2, value3, value4, value5}; processMessage(rd); } void QQmlProfilerService::animationFrameImpl(qint64 delta) { Q_ASSERT(QQmlDebugService::isDebuggingEnabled()); - if (!m_enabled) + if (!enabled) return; int animCount = QUnifiedTimer::instance()->runningAnimationCount(); @@ -283,7 +337,8 @@ void QQmlProfilerService::animationFrameImpl(qint64 delta) // trim fps to integer int fps = 1000 / delta; QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame, - QString(), -1, -1, fps, animCount, 0}; + QString(), -1, -1, fps, animCount, 0, + 0, 0, 0, 0, 0}; processMessage(ed); } } @@ -300,12 +355,12 @@ void QQmlProfilerService::processMessage(const QQmlProfilerData &message) bool QQmlProfilerService::profilingEnabled() { - return m_enabled; + return enabled; } void QQmlProfilerService::setProfilingEnabled(bool enable) { - m_enabled = enable; + enabled = enable; } /* @@ -314,6 +369,7 @@ void QQmlProfilerService::setProfilingEnabled(bool enable) void QQmlProfilerService::sendMessages() { QMutexLocker locker(&m_dataMutex); + QList messages; for (int i = 0; i < m_data.count(); ++i) messages << m_data.at(i).toByteArray(); @@ -336,7 +392,7 @@ void QQmlProfilerService::stateAboutToBeChanged(QQmlDebugService::State newState return; if (state() == Enabled - && m_enabled) { + && enabled) { stopProfilingImpl(); sendMessages(); } -- cgit v1.2.3