Take a snapshots on glReadPixels.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Mon, 9 May 2011 19:54:31 +0000 (20:54 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Mon, 9 May 2011 19:54:31 +0000 (20:54 +0100)
glretrace.py
retrace.py

index b0ef032..1674a79 100644 (file)
@@ -125,6 +125,15 @@ class GlRetracer(Retracer):
 
         Retracer.retrace_function_body(self, function)
 
+        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::frame_complete(call.no);'
+
     def call_function(self, function):
         if function.name == "glViewport":
             print '    bool reshape_window = false;'
@@ -209,11 +218,6 @@ class GlRetracer(Retracer):
             print r'         delete [] infoLog;'
             print r'    }'
 
-        if function.name == 'glFlush':
-            print '    if (!glretrace::double_buffer) {'
-            print '        glretrace::frame_complete(call.no);'
-            print '    }'
-
     def extract_arg(self, function, arg, arg_type, lvalue, rvalue):
         if function.name in self.array_pointer_function_names and arg.name == 'pointer':
             print '    %s = static_cast<%s>(%s.blob());' % (lvalue, arg_type, rvalue)
index c0ee82a..f931c88 100644 (file)
@@ -188,6 +188,9 @@ class Retracer:
         print
 
     def retrace_function_body(self, function):
+        if not function.sideeffects:
+            return
+
         success = True
         for arg in function.args:
             arg_type = ConstRemover().visit(arg.type)
@@ -243,8 +246,7 @@ class Retracer:
         functions = filter(self.filter_function, functions)
 
         for function in functions:
-            if function.sideeffects:
-                self.retrace_function(function)
+            self.retrace_function(function)
 
         print 'void retrace::retrace_call(Trace::Call &call) {'
         print '    const char *name = call.name().c_str();'
@@ -254,8 +256,7 @@ class Retracer:
 
         def handle_case(function_name):
             function = func_dict[function_name]
-            if function.sideeffects:
-                print '        retrace_%s(call);' % function.name
+            print '        retrace_%s(call);' % function.name
             print '        return;'
     
         string_switch('name', func_dict.keys(), handle_case)