[PATCH] retrace: use KHR_debug to emit call no's

Rob Clark robdclark at gmail.com
Wed Jan 20 13:52:11 PST 2016


If the extension is present, use it to log call numbers for draw
commands, using GL_DEBUG_TYPE_MARKER.  If supported by the driver,
this embeds the draw call no's in the commandstream.

Signed-off-by: Rob Clark <robdclark at gmail.com>
---
 retrace/glretrace.hpp      |  2 ++
 retrace/glretrace_main.cpp | 18 ++++++++++++++++++
 retrace/retrace.hpp        |  2 ++
 retrace/retrace_main.cpp   |  4 ++++
 4 files changed, 26 insertions(+)

diff --git a/retrace/glretrace.hpp b/retrace/glretrace.hpp
index fc36c52..82ed920 100644
--- a/retrace/glretrace.hpp
+++ b/retrace/glretrace.hpp
@@ -57,6 +57,8 @@ struct Context {
 
     bool used;
 
+    bool KHR_debug;
+
     inline glprofile::Profile
     profile(void) const {
         return wsContext->profile;
diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp
index c3783cc..0135662 100755
--- a/retrace/glretrace_main.cpp
+++ b/retrace/glretrace_main.cpp
@@ -399,6 +399,7 @@ initContext() {
     supportsElapsed     = currentContext->hasExtension("GL_EXT_timer_query") || supportsTimestamp;
     supportsOcclusion   = currentProfile.versionGreaterOrEqual(glprofile::API_GL, 1, 5);
     supportsARBShaderObjects = currentContext->hasExtension("GL_ARB_shader_objects");
+    currentContext->KHR_debug = currentContext->hasExtension("GL_KHR_debug");
 
 #ifdef __APPLE__
     // GL_TIMESTAMP doesn't work on Apple.  GL_TIME_ELAPSED still does however.
@@ -766,6 +767,23 @@ public:
     dumpState(StateWriter &writer) {
         glstate::dumpCurrentContext(writer);
     }
+
+    void
+    log(trace::Call &call) {
+        glretrace::Context *currentContext = glretrace::getCurrentContext();
+        if (currentContext && currentContext->KHR_debug) {
+            char *str;
+            int len = asprintf(&str, "%d:%s", call.no, call.name());
+            if (len > 0) {
+                glDebugMessageInsert(GL_DEBUG_SOURCE_THIRD_PARTY,
+                                     GL_DEBUG_TYPE_MARKER, 0,
+                                     GL_DEBUG_SEVERITY_NOTIFICATION,
+                                     len, str);
+                free(str);
+            }
+        }
+    }
+
 };
 
 static GLDumper glDumper;
diff --git a/retrace/retrace.hpp b/retrace/retrace.hpp
index 082879f..66024c5 100644
--- a/retrace/retrace.hpp
+++ b/retrace/retrace.hpp
@@ -226,6 +226,8 @@ public:
 
     virtual void
     dumpState(StateWriter &) = 0;
+
+    virtual void log(trace::Call &call) {}
 };
 
 
diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp
index bc00ffe..6344880 100644
--- a/retrace/retrace_main.cpp
+++ b/retrace/retrace_main.cpp
@@ -238,6 +238,10 @@ retraceCall(trace::Call *call) {
         }
     }
 
+    if (call->flags & trace::CALL_FLAG_RENDER) {
+       dumper->log(*call);
+    }
+
     retracer.retrace(*call);
 
     if (doSnapshot) {
-- 
2.5.0



More information about the apitrace mailing list