diff options
author | Christiaan Janssen <christiaan.janssen@digia.com> | 2013-04-17 16:46:12 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-05-06 14:19:15 +0200 |
commit | 49ef011e33b9ef977679b3d30f883fccea0d8748 (patch) | |
tree | 96a17090cc17ab04796094a10809274e7a1f3944 /src/quick/scenegraph/qsgthreadedrenderloop.cpp | |
parent | f314fd4327167dd6af88f9b7050b34144d75241d (diff) |
QmlProfiler: SceneGraph profiling
Change-Id: Ide71b330b13fc3816ed191bd9af84e0fce0d9587
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/quick/scenegraph/qsgthreadedrenderloop.cpp')
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop.cpp | 77 |
1 files changed, 52 insertions, 25 deletions
diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index de1e2517db..c4a9328ceb 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -55,6 +55,8 @@ #include "qsgthreadedrenderloop_p.h" +#include <private/qqmlprofilerservice_p.h> + /* Overall design: @@ -138,10 +140,10 @@ static inline int qsgrl_animation_interval() { #ifndef QSG_NO_RENDER_TIMING static bool qsg_render_timing = !qgetenv("QSG_RENDER_TIMING").isEmpty(); -static QTime threadTimer; -static int syncTime; -static int renderTime; -static int sinceLastTime; +static QElapsedTimer threadTimer; +static qint64 syncTime; +static qint64 renderTime; +static qint64 sinceLastTime; #endif extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha); @@ -545,8 +547,11 @@ void QSGRenderThread::sync() void QSGRenderThread::syncAndRender() { #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - sinceLastTime = threadTimer.restart(); + bool profileFrames = qsg_render_timing || QQmlProfilerService::enabled; + if (profileFrames) { + sinceLastTime = threadTimer.nsecsElapsed(); + threadTimer.start(); + } #endif QElapsedTimer waitTimer; waitTimer.start(); @@ -573,8 +578,8 @@ void QSGRenderThread::syncAndRender() } #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - syncTime = threadTimer.elapsed(); + if (profileFrames) + syncTime = threadTimer.nsecsElapsed(); #endif RLDEBUG(" Render: - rendering starting"); @@ -588,8 +593,8 @@ void QSGRenderThread::syncAndRender() gl->makeCurrent(w.window); d->renderSceneGraph(w.size); #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing && i == 0) - renderTime = threadTimer.elapsed(); + if (profileFrames && i == 0) + renderTime = threadTimer.nsecsElapsed(); #endif gl->swapBuffers(w.window); d->fireFrameSwapped(); @@ -599,10 +604,18 @@ void QSGRenderThread::syncAndRender() #ifndef QSG_NO_RENDER_TIMING if (qsg_render_timing) qDebug("window Time: sinceLast=%d, sync=%d, first render=%d, after final swap=%d", - sinceLastTime, - syncTime, - renderTime - syncTime, - threadTimer.elapsed() - renderTime); + int(sinceLastTime/1000000), + int(syncTime/1000000), + int((renderTime - syncTime)/1000000), + int(threadTimer.elapsed() - renderTime/1000000)); + + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphRenderLoopFrame, + syncTime, + renderTime - syncTime, + threadTimer.nsecsElapsed() - renderTime); + } #endif } @@ -950,10 +963,11 @@ void QSGThreadedRenderLoop::polishAndSync() #ifndef QSG_NO_RENDER_TIMING QElapsedTimer timer; - int polishTime = 0; - int waitTime = 0; - int syncTime; - if (qsg_render_timing) + qint64 polishTime = 0; + qint64 waitTime = 0; + qint64 syncTime = 0; + bool profileFrames = qsg_render_timing || QQmlProfilerService::enabled; + if (profileFrames) timer.start(); #endif @@ -964,8 +978,8 @@ void QSGThreadedRenderLoop::polishAndSync() d->polishItems(); } #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - polishTime = timer.elapsed(); + if (profileFrames) + polishTime = timer.nsecsElapsed(); #endif m_sync_triggered_update = false; @@ -977,8 +991,8 @@ void QSGThreadedRenderLoop::polishAndSync() RLDEBUG("GUI: - wait for sync..."); #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - waitTime = timer.elapsed(); + if (profileFrames) + waitTime = timer.nsecsElapsed(); #endif m_thread->waitCondition.wait(&m_thread->mutex); m_thread->guiIsLocked = false; @@ -986,8 +1000,8 @@ void QSGThreadedRenderLoop::polishAndSync() RLDEBUG("GUI: - unlocked after sync..."); #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) - syncTime = timer.elapsed(); + if (profileFrames) + syncTime = timer.nsecsElapsed(); #endif killTimer(m_update_timer); @@ -1006,7 +1020,20 @@ void QSGThreadedRenderLoop::polishAndSync() #ifndef QSG_NO_RENDER_TIMING if (qsg_render_timing) - qDebug(" - polish=%d, wait=%d, sync=%d -- animations=%d", polishTime, waitTime - polishTime, syncTime - waitTime, int(timer.elapsed() - syncTime)); + qDebug(" - polish=%d, wait=%d, sync=%d -- animations=%d", + int(polishTime/1000000), + int((waitTime - polishTime)/1000000), + int((syncTime - waitTime)/1000000), + int((timer.nsecsElapsed() - syncTime)/1000000)); + + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphPolishAndSync, + polishTime, + waitTime - polishTime, + syncTime - waitTime, + timer.elapsed() - syncTime); + } #endif } |