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 | |
parent | f314fd4327167dd6af88f9b7050b34144d75241d (diff) |
QmlProfiler: SceneGraph profiling
Change-Id: Ide71b330b13fc3816ed191bd9af84e0fce0d9587
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgrenderer.cpp | 52 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgadaptationlayer.cpp | 21 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgcontext.cpp | 10 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop.cpp | 36 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop.cpp | 77 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgwindowsrenderloop.cpp | 45 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgtexture.cpp | 58 |
7 files changed, 208 insertions, 91 deletions
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 } diff --git a/src/quick/scenegraph/qsgadaptationlayer.cpp b/src/quick/scenegraph/qsgadaptationlayer.cpp index 1d534e3563..3536975e94 100644 --- a/src/quick/scenegraph/qsgadaptationlayer.cpp +++ b/src/quick/scenegraph/qsgadaptationlayer.cpp @@ -48,6 +48,7 @@ #include <QtGui/qguiapplication.h> #include <qdir.h> +#include <private/qqmlprofilerservice_p.h> #include <QElapsedTimer> QT_BEGIN_NAMESPACE @@ -162,7 +163,8 @@ void QSGDistanceFieldGlyphCache::update() return; #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) + bool profileFrames = qsg_render_timing || QQmlProfilerService::enabled; + if (profileFrames) qsg_render_timer.start(); #endif @@ -176,10 +178,10 @@ void QSGDistanceFieldGlyphCache::update() } #ifndef QSG_NO_RENDER_TIMING - int renderTime = 0; + qint64 renderTime = 0; int count = m_pendingGlyphs.size(); - if (qsg_render_timing) - renderTime = qsg_render_timer.elapsed(); + if (profileFrames) + renderTime = qsg_render_timer.nsecsElapsed(); #endif m_pendingGlyphs.reset(); @@ -190,11 +192,18 @@ void QSGDistanceFieldGlyphCache::update() if (qsg_render_timing) { printf(" - glyphs: count=%d, render=%d, store=%d, total=%d\n", count, - renderTime, - (int) qsg_render_timer.elapsed() - renderTime, + int(renderTime/1000000), + (int) qsg_render_timer.elapsed() - int(renderTime/1000000), (int) qsg_render_timer.elapsed()); } + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphAdaptationLayerFrame, + count, + renderTime, + qsg_render_timer.nsecsElapsed() - renderTime); + } #endif } diff --git a/src/quick/scenegraph/qsgcontext.cpp b/src/quick/scenegraph/qsgcontext.cpp index 5d894e5236..14f0fabbdd 100644 --- a/src/quick/scenegraph/qsgcontext.cpp +++ b/src/quick/scenegraph/qsgcontext.cpp @@ -67,6 +67,8 @@ #include <private/qobject_p.h> #include <qmutex.h> +#include <private/qqmlprofilerservice_p.h> + DEFINE_BOOL_CONFIG_OPTION(qmlFlashMode, QML_FLASH_MODE) DEFINE_BOOL_CONFIG_OPTION(qmlTranslucentMode, QML_TRANSLUCENT_MODE) DEFINE_BOOL_CONFIG_OPTION(qmlDisableDistanceField, QML_DISABLE_DISTANCEFIELD) @@ -482,7 +484,7 @@ QSGMaterialShader *QSGContext::prepareMaterial(QSGMaterial *material) return shader; #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) + if (qsg_render_timing || QQmlProfilerService::enabled) qsg_renderer_timer.start(); #endif @@ -494,6 +496,12 @@ QSGMaterialShader *QSGContext::prepareMaterial(QSGMaterial *material) #ifndef QSG_NO_RENDER_TIMING if (qsg_render_timing) printf(" - compiling material: %dms\n", (int) qsg_renderer_timer.elapsed()); + + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphContextFrame, + qsg_renderer_timer.nsecsElapsed()); + } #endif return shader; diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index f71ccea294..3a608a911d 100644 --- a/src/quick/scenegraph/qsgrenderloop.cpp +++ b/src/quick/scenegraph/qsgrenderloop.cpp @@ -56,6 +56,7 @@ #include <QtQuick/QQuickWindow> #include <QtQuick/private/qquickwindow_p.h> #include <QtQuick/private/qsgcontext_p.h> +#include <private/qqmlprofilerservice_p.h> QT_BEGIN_NAMESPACE @@ -273,20 +274,21 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window) QQuickWindowPrivate *cd = QQuickWindowPrivate::get(window); cd->polishItems(); - int renderTime = 0, syncTime = 0; - QTime renderTimer; - if (qsg_render_timing()) + qint64 renderTime = 0, syncTime = 0; + QElapsedTimer renderTimer; + bool profileFrames = qsg_render_timing() || QQmlProfilerService::enabled; + if (profileFrames) renderTimer.start(); cd->syncSceneGraph(); - if (qsg_render_timing()) - syncTime = renderTimer.elapsed(); + if (profileFrames) + syncTime = renderTimer.nsecsElapsed(); cd->renderSceneGraph(window->size()); - if (qsg_render_timing()) - renderTime = renderTimer.elapsed() - syncTime; + if (profileFrames) + renderTime = renderTimer.nsecsElapsed() - syncTime; if (data.grabOnly) { grabContent = qt_gl_read_framebuffer(window->size(), false, false); @@ -298,17 +300,29 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window) cd->fireFrameSwapped(); } + qint64 swapTime = 0; + if (profileFrames) { + swapTime = renderTimer.nsecsElapsed() - renderTime - syncTime; + } + if (qsg_render_timing()) { static QTime lastFrameTime = QTime::currentTime(); - const int swapTime = renderTimer.elapsed() - renderTime - syncTime; - qDebug() << "- Breakdown of frame time; sync:" << syncTime - << "ms render:" << renderTime << "ms swap:" << swapTime - << "ms total:" << swapTime + renderTime + syncTime + qDebug() << "- Breakdown of frame time; sync:" << syncTime/1000000 + << "ms render:" << renderTime/1000000 << "ms swap:" << swapTime/1000000 + << "ms total:" << (swapTime + renderTime + syncTime)/1000000 << "ms time since last frame:" << (lastFrameTime.msecsTo(QTime::currentTime())) << "ms"; lastFrameTime = QTime::currentTime(); } + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphRenderLoopFrame, + syncTime, + renderTime, + swapTime); + } + // Might have been set during syncSceneGraph() if (data.updatePending) maybeUpdate(window); 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 } diff --git a/src/quick/scenegraph/qsgwindowsrenderloop.cpp b/src/quick/scenegraph/qsgwindowsrenderloop.cpp index 3e21af6ac0..ce43ccf531 100644 --- a/src/quick/scenegraph/qsgwindowsrenderloop.cpp +++ b/src/quick/scenegraph/qsgwindowsrenderloop.cpp @@ -51,6 +51,8 @@ #include <QtQuick/QQuickWindow> +#include <private/qqmlprofilerservice_p.h> + QT_BEGIN_NAMESPACE extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha); @@ -67,7 +69,7 @@ static QElapsedTimer qsg_debug_timer; #ifndef QSG_NO_RENDER_TIMING static bool qsg_render_timing = !qgetenv("QSG_RENDER_TIMING").isEmpty(); static QElapsedTimer qsg_render_timer; -#define QSG_RENDER_TIMING_SAMPLE(sampleName) int sampleName = 0; if (qsg_render_timing) sampleName = qsg_render_timer.elapsed() +#define QSG_RENDER_TIMING_SAMPLE(sampleName) qint64 sampleName = 0; if (qsg_render_timing || QQmlProfilerService::enabled) sampleName = qsg_render_timer.nsecsElapsed() #else #define QSG_RENDER_TIMING_SAMPLE(sampleName) #endif @@ -174,9 +176,16 @@ void QSGWindowsRenderLoop::show(QQuickWindow *window) #ifndef QSG_NO_RENDER_TIMING if (qsg_render_timing) { qDebug("WindowsRenderLoop: GL=%d ms, makeCurrent=%d ms, SG=%d ms", - int(time_created - time_start), - int(time_current - time_created), - int(qsg_render_timer.elapsed() - time_current)); + int((time_created - time_start)/1000000), + int((time_current - time_created)/1000000), + int((qsg_render_timer.nsecsElapsed() - time_current)/1000000)); + } + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphWindowsRenderShow, + time_created - time_start, + time_current - time_created, + qsg_render_timer.nsecsElapsed() - time_current); } #endif @@ -368,7 +377,12 @@ void QSGWindowsRenderLoop::render() #ifndef QSG_NO_RENDER_TIMING if (qsg_render_timing) { qDebug("WindowsRenderLoop: animations=%d ms", - int(qsg_render_timer.elapsed() - time_start)); + int((qsg_render_timer.nsecsElapsed() - time_start)/1000000)); + } + if (QQmlProfilerService::Enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphWindowsAnimations, + qsg_render_timer.nsecsElapsed() - time_start); } #endif @@ -424,10 +438,23 @@ void QSGWindowsRenderLoop::renderWindow(QQuickWindow *window) qDebug("WindowsRenderLoop(t=%d): window=%p, polish=%d ms, sync=%d ms, render=%d ms, swap=%d ms", int(qsg_render_timer.elapsed()), window, - int(time_polished - time_start), - int(time_synced - time_polished), - int(time_rendered - time_synced), - int(time_swapped - time_rendered)); + int((time_polished - time_start)/1000000), + int((time_synced - time_polished)/1000000), + int((time_rendered - time_synced)/1000000), + int((time_swapped - time_rendered)/1000000)); + } + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphWindowsPolishFrame, + time_polished - time_start + ); + + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphRenderLoopFrame, + time_synced - time_polished, + time_rendered - time_synced, + time_swapped - time_rendered + ); } #endif } diff --git a/src/quick/scenegraph/util/qsgtexture.cpp b/src/quick/scenegraph/util/qsgtexture.cpp index ad98fe9d47..a104e4af2f 100644 --- a/src/quick/scenegraph/util/qsgtexture.cpp +++ b/src/quick/scenegraph/util/qsgtexture.cpp @@ -614,7 +614,8 @@ void QSGPlainTexture::bind() m_dirty_texture = false; #ifndef QSG_NO_RENDER_TIMING - if (qsg_render_timing) + bool profileFrames = qsg_render_timing || QQmlProfilerService::enabled; + if (profileFrames) qsg_renderer_timer.start(); #endif @@ -628,6 +629,11 @@ void QSGPlainTexture::bind() m_texture_size.width(), m_texture_size.height()); } + if (QQmlProfilerService::enabled) { + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphTextureDeletion, + qsg_renderer_timer.nsecsElapsed()); + } #endif } m_texture_id = 0; @@ -645,9 +651,9 @@ void QSGPlainTexture::bind() glBindTexture(GL_TEXTURE_2D, m_texture_id); #ifndef QSG_NO_RENDER_TIMING - int bindTime = 0; - if (qsg_render_timing) - bindTime = qsg_renderer_timer.elapsed(); + qint64 bindTime = 0; + if (profileFrames) + bindTime = qsg_renderer_timer.nsecsElapsed(); #endif // ### TODO: check for out-of-memory situations... @@ -659,9 +665,9 @@ void QSGPlainTexture::bind() : m_image.convertToFormat(QImage::Format_ARGB32_Premultiplied); #ifndef QSG_NO_RENDER_TIMING - int convertTime = 0; - if (qsg_render_timing) - convertTime = qsg_renderer_timer.elapsed(); + qint64 convertTime = 0; + if (profileFrames) + convertTime = qsg_renderer_timer.nsecsElapsed(); #endif updateBindOptions(m_dirty_bind_options); @@ -684,16 +690,16 @@ void QSGPlainTexture::bind() } #ifndef QSG_NO_RENDER_TIMING - int swizzleTime = 0; - if (qsg_render_timing) - swizzleTime = qsg_renderer_timer.elapsed(); + qint64 swizzleTime = 0; + if (profileFrames) + swizzleTime = qsg_renderer_timer.nsecsElapsed(); #endif glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, w, h, 0, externalFormat, GL_UNSIGNED_BYTE, tmp.constBits()); #ifndef QSG_NO_RENDER_TIMING - int uploadTime = 0; - if (qsg_render_timing) - uploadTime = qsg_renderer_timer.elapsed(); + qint64 uploadTime = 0; + if (profileFrames) + uploadTime = qsg_renderer_timer.nsecsElapsed(); #endif @@ -704,23 +710,35 @@ void QSGPlainTexture::bind() } #ifndef QSG_NO_RENDER_TIMING - int mipmapTime = 0; + qint64 mipmapTime = 0; if (qsg_render_timing) { - mipmapTime = qsg_renderer_timer.elapsed(); + mipmapTime = qsg_renderer_timer.nsecsElapsed(); printf(" - plaintexture(%dx%d) bind=%d, convert=%d, swizzle=%d (%s->%s), upload=%d, mipmap=%d, total=%d\n", m_texture_size.width(), m_texture_size.height(), - bindTime, - convertTime - bindTime, - swizzleTime - convertTime, + int(bindTime/1000000), + int((convertTime - bindTime)/1000000), + int((swizzleTime - convertTime)/1000000), externalFormat == GL_BGRA ? "BGRA" : "RGBA", internalFormat == GL_BGRA ? "BGRA" : "RGBA", - uploadTime - swizzleTime, - mipmapTime - uploadTime, + int((uploadTime - swizzleTime)/1000000), + int((mipmapTime - uploadTime)/1000000), (int) qsg_renderer_timer.elapsed()); } + if (QQmlProfilerService::enabled) { + mipmapTime = qsg_renderer_timer.nsecsElapsed(); + + QQmlProfilerService::sceneGraphFrame( + QQmlProfilerService::SceneGraphTexturePrepare, + bindTime, + convertTime - bindTime, + swizzleTime - convertTime, + uploadTime - swizzleTime, + mipmapTime - uploadTime); + } + #endif |