]> git.cworth.org Git - apitrace/commitdiff
Allow to specify the snapshot frequency.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 2 Jun 2011 09:04:52 +0000 (10:04 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 2 Jun 2011 09:04:52 +0000 (10:04 +0100)
Based on a patch by Michel Dänzer <daenzer@vmware.com>

glretrace.hpp
glretrace.py
glretrace_main.cpp

index 74eb6742ede89d50b750d8c2584837f9e8e1260d..255dd6f52d10c8c4a37677efeaa30315928239ed 100644 (file)
@@ -45,9 +45,17 @@ extern unsigned frame;
 extern long long startTime;
 extern bool wait;
 
+enum frequency {
+    FREQUENCY_NEVER = 0,
+    FREQUENCY_FRAME,
+    FREQUENCY_FRAMEBUFFER,
+    FREQUENCY_DRAW,
+};
+
 extern bool benchmark;
 extern const char *compare_prefix;
 extern const char *snapshot_prefix;
+extern enum frequency snapshot_frequency;
 
 extern unsigned dump_state;
 
index 9a1a83567c0ad323beafa4e99f73beb332a2fefa..d8f9d0b206e4d65bc192cd58083c4e2cdab412c2 100644 (file)
@@ -99,10 +99,22 @@ class GlRetracer(Retracer):
         #"glMultiModeDrawElementsIBM",
     ])
 
+    misc_draw_function_names = set([
+        "glClear",
+        "glEnd",
+    ])
+
+    bind_framebuffer_function_names = set([
+        "glBindFramebuffer",
+        "glBindFramebufferARB",
+        "glBindFramebufferEXT",
+    ])
+
     def retrace_function_body(self, function):
         is_array_pointer = function.name in self.array_pointer_function_names
         is_draw_array = function.name in self.draw_array_function_names
         is_draw_elements = function.name in self.draw_elements_function_names
+        is_misc_draw = function.name in self.misc_draw_function_names
 
         if is_array_pointer or is_draw_array or is_draw_elements:
             print '    if (glretrace::parser.version < 1) {'
@@ -123,16 +135,30 @@ class GlRetracer(Retracer):
             
             print '    }'
 
+        # Pre-snapshots
+        if function.name in self.bind_framebuffer_function_names:
+            print '    if (glretrace::snapshot_frequency == glretrace::FREQUENCY_FRAMEBUFFER) {'
+            print '        glretrace::snapshot(call.no - 1);'
+            print '    }'
+
         Retracer.retrace_function_body(self, function)
 
+        # Post-snapshots
         if function.name in ('glFlush', 'glFinish'):
             print '    if (!glretrace::double_buffer) {'
             print '        glretrace::frame_complete(call.no);'
             print '    }'
-
         if function.name == 'glReadPixels':
             print '    glFinish();'
-            print '    glretrace::snapshot(call.no);'
+            print '    if (glretrace::snapshot_frequency == glretrace::FREQUENCY_FRAME ||'
+            print '        glretrace::snapshot_frequency == glretrace::FREQUENCY_FRAMEBUFFER) {'
+            print '        glretrace::snapshot(call.no);'
+            print '    }'
+        if is_draw_array or is_draw_elements or is_misc_draw:
+            print '    if (glretrace::snapshot_frequency == glretrace::FREQUENCY_DRAW) {'
+            print '        glretrace::snapshot(call.no);'
+            print '    }'
+
 
     def call_function(self, function):
         if function.name == "glViewport":
index f559332a3850468e5483c4a7a09389bd7c0947d6..e555923431b2c2c6adfbc88bdaa587d2b5bc8815 100644 (file)
@@ -50,6 +50,7 @@ bool wait = false;
 bool benchmark = false;
 const char *compare_prefix = NULL;
 const char *snapshot_prefix = NULL;
+enum frequency snapshot_frequency = FREQUENCY_NEVER;
 
 unsigned dump_state = ~0;
 
@@ -148,7 +149,10 @@ void snapshot(unsigned call_no) {
 void frame_complete(unsigned call_no) {
     ++frame;
 
-    snapshot(call_no);
+    if (snapshot_frequency == FREQUENCY_FRAME ||
+        snapshot_frequency == FREQUENCY_FRAMEBUFFER) {
+        snapshot(call_no);
+    }
 }
 
 
@@ -216,6 +220,7 @@ static void usage(void) {
         "  -db          use a double buffer visual (default)\n"
         "  -sb          use a single buffer visual\n"
         "  -s PREFIX    take snapshots\n"
+        "  -S FREQUENCY snapshot frequency: frame (default), framebuffer, or draw\n"
         "  -v           verbose output\n"
         "  -D CALLNO    dump state at specific call no\n"
         "  -w           wait on final frame\n";
@@ -252,6 +257,25 @@ int main(int argc, char **argv)
             return 0;
         } else if (!strcmp(arg, "-s")) {
             snapshot_prefix = argv[++i];
+            if (snapshot_frequency == FREQUENCY_NEVER) {
+                snapshot_frequency = FREQUENCY_FRAME;
+            }
+        } else if (!strcmp(arg, "-S")) {
+            arg = argv[++i];
+            if (!strcmp(arg, "frame")) {
+                snapshot_frequency = FREQUENCY_FRAME;
+            } else if (!strcmp(arg, "framebuffer")) {
+                snapshot_frequency = FREQUENCY_FRAMEBUFFER;
+            } else if (!strcmp(arg, "draw")) {
+                snapshot_frequency = FREQUENCY_DRAW;
+            } else {
+                std::cerr << "error: unknown frequency " << arg << "\n";
+                usage();
+                return 1;
+            }
+            if (snapshot_prefix == NULL) {
+                snapshot_prefix = "";
+            }
         } else if (!strcmp(arg, "-v")) {
             ++retrace::verbosity;
         } else if (!strcmp(arg, "-w")) {