Enable profiling of materials and atlas textures
authorGunnar Sletta <gunnar.sletta@digia.com>
Mon, 30 Sep 2013 11:19:30 +0000 (13:19 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 3 Oct 2013 14:18:44 +0000 (16:18 +0200)
Task-number: QTBUG-33459

Change-Id: Ie9ea176fbb7ee46a128b4bf66a8f4475a5d4c90b
Reviewed-by: Aurindam Jana <aurindam.jana@digia.com>
src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
src/quick/scenegraph/util/qsgatlastexture.cpp

index ed76102..18f09fe 100644 (file)
@@ -46,6 +46,8 @@
 #include <QtGui/QGuiApplication>
 #include <QtGui/QOpenGLFramebufferObject>
 
+#include <private/qqmlprofilerservice_p.h>
+
 #include <algorithm>
 
 #ifndef GL_DOUBLE
@@ -69,6 +71,10 @@ const bool debug_noalpha    = qgetenv("QSG_RENDERER_DEBUG").contains("noalpha");
 const bool debug_noopaque   = qgetenv("QSG_RENDERER_DEBUG").contains("noopaque");
 const bool debug_noclip     = qgetenv("QSG_RENDERER_DEBUG").contains("noclip");
 
+#ifndef QSG_NO_RENDER_TIMING
+static bool qsg_render_timing = !qgetenv("QSG_RENDER_TIMING").isEmpty();
+static QElapsedTimer qsg_renderer_timer;
+#endif
 
 #define QSGNODE_TRAVERSE(NODE) for (QSGNode *child = NODE->firstChild(); child; child = child->nextSibling())
 #define SHADOWNODE_TRAVERSE(NODE) for (QList<Node *>::const_iterator child = NODE->children.constBegin(); child != NODE->children.constEnd(); ++child)
@@ -118,6 +124,11 @@ ShaderManager::Shader *ShaderManager::prepareMaterial(QSGMaterial *material)
     if (shader)
         return shader;
 
+#ifndef QSG_NO_RENDER_TIMING
+    if (qsg_render_timing  || QQmlProfilerService::enabled)
+        qsg_renderer_timer.start();
+#endif
+
     QSGMaterialShader *s = material->createShader();
 
     QOpenGLShaderProgram *p = s->program();
@@ -151,6 +162,17 @@ ShaderManager::Shader *ShaderManager::prepareMaterial(QSGMaterial *material)
     Q_ASSERT(shader->pos_order >= 0);
     Q_ASSERT(shader->id_zRange >= 0);
 
+#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
+
     rewrittenShaders[type] = shader;
     return shader;
 }
@@ -162,6 +184,11 @@ ShaderManager::Shader *ShaderManager::prepareMaterialNoRewrite(QSGMaterial *mate
     if (shader)
         return shader;
 
+#ifndef QSG_NO_RENDER_TIMING
+    if (qsg_render_timing  || QQmlProfilerService::enabled)
+        qsg_renderer_timer.start();
+#endif
+
     QSGMaterialShader *s = static_cast<QSGMaterialShader *>(material->createShader());
     s->compile();
     s->initialize();
@@ -174,6 +201,17 @@ ShaderManager::Shader *ShaderManager::prepareMaterialNoRewrite(QSGMaterial *mate
 
     stockShaders[type] = shader;
 
+#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;
 }
 
index ad90911..3710f05 100644 (file)
 
 #include <private/qsgtexture_p.h>
 
+#include <private/qqmlprofilerservice_p.h>
+
 #ifndef GL_BGRA
 #define GL_BGRA 0x80E1
 #endif
 
 
-#ifndef QSG_NO_RENDERER_TIMING
-static bool qsg_render_timing = !qgetenv("QSG_RENDERER_TIMING").isEmpty();
+#ifndef QSG_NO_RENDER_TIMING
+static bool qsg_render_timing = !qgetenv("QSG_RENDER_TIMING").isEmpty();
+static QElapsedTimer qsg_renderer_timer;
 #endif
 
 namespace QSGAtlasTexture
@@ -331,10 +334,10 @@ bool Atlas::bind(QSGTexture::Filtering filtering)
     // Upload all pending images..
     for (int i=0; i<m_pending_uploads.size(); ++i) {
 
-#ifndef QSG_NO_RENDERER_TIMING
-        QElapsedTimer timer;
-        if (qsg_render_timing)
-            timer.start();
+#ifndef QSG_NO_RENDER_TIMING
+        bool profileFrames = qsg_render_timing || QQmlProfilerService::enabled;
+        if (profileFrames)
+            qsg_renderer_timer.start();
 #endif
 
         if (m_externalFormat == GL_BGRA &&
@@ -343,12 +346,23 @@ bool Atlas::bind(QSGTexture::Filtering filtering)
         } else {
             upload(m_pending_uploads.at(i));
         }
-#ifndef QSG_NO_RENDERER_TIMING
+
+#ifndef QSG_NO_RENDER_TIMING
         if (qsg_render_timing) {
             printf("   - AtlasTexture(%dx%d), uploaded in %d ms\n",
                    m_pending_uploads.at(i)->image().width(),
                    m_pending_uploads.at(i)->image().height(),
-                   (int) timer.elapsed());
+                   (int) (qsg_renderer_timer.elapsed()));
+        }
+
+        if (QQmlProfilerService::enabled) {
+            QQmlProfilerService::sceneGraphFrame(
+                        QQmlProfilerService::SceneGraphTexturePrepare,
+                        0,  // bind (not relevant)
+                        0,  // convert (not relevant)
+                        0,  // swizzle (not relevant)
+                        qsg_renderer_timer.nsecsElapsed(), // (upload all of the above)
+                        0); // mipmap (not used ever...)
         }
 #endif
     }