]> git.cworth.org Git - apitrace/commitdiff
Handle glInterleavedArrays correctly
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 25 Mar 2011 20:07:42 +0000 (20:07 +0000)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 25 Mar 2011 20:07:42 +0000 (20:07 +0000)
TODO
gltrace.py

diff --git a/TODO b/TODO
index bf5c9b72aa505df77a0bb9c45f5c760042a758fc..f749225dde4fc542c75a128129bec8fc9971a3b5 100644 (file)
--- a/TODO
+++ b/TODO
@@ -2,8 +2,6 @@
                             (in no particular order)
 
 
-* Handle glInterleavedArrays correctly.
-
 * Allow clamping to a GL version or a number of extensions.
 
 * Match the traced visuals (which will imply abandoning GLUT)
@@ -26,3 +24,6 @@
 * Trace window sizes somehow
 
 * Plug memory leaks.
+
+* Allow to distinguish between the calls really done by the program, vs the
+  fakes one necessary to retrace correctly.
index 1186c09a6ccaef3936f01edd4dbe51e8c4d0d632..56292bd19a77650bf760cad8351a91617377a231 100644 (file)
@@ -82,6 +82,7 @@ class GlTracer(Tracer):
         ("FogCoord", "FOG_COORD"),
         ("SecondaryColor", "SECONDARY_COLOR"),
     ]
+    arrays.reverse()
 
     def state_tracker_decl(self, api):
         # Whether we need user arrays
@@ -121,8 +122,6 @@ class GlTracer(Tracer):
         "glFogCoordPointer",
         "glSecondaryColorPointer",
 
-        "glInterleavedArrays",
-
         #"glVertexPointerEXT",
         #"glNormalPointerEXT",
         #"glColorPointerEXT",
@@ -146,6 +145,23 @@ class GlTracer(Tracer):
         'glDrawRangeElements',
     ))
 
+    interleaved_formats = [
+         'GL_V2F',
+         'GL_V3F',
+         'GL_C4UB_V2F',
+         'GL_C4UB_V3F',
+         'GL_C3F_V3F',
+         'GL_N3F_V3F',
+         'GL_C4F_N3F_V3F',
+         'GL_T2F_V3F',
+         'GL_T4F_V4F',
+         'GL_T2F_C4UB_V3F',
+         'GL_T2F_C3F_V3F',
+         'GL_T2F_N3F_V3F',
+         'GL_T2F_C4F_N3F_V3F',
+         'GL_T4F_C4F_N3F_V4F',
+    ]
+
     def trace_function_impl_body(self, function):
         # Defer tracing of user array pointers...
         if function.name in self.array_pointer_function_names:
@@ -164,8 +180,64 @@ class GlTracer(Tracer):
             print '        __trace_user_arrays(maxindex);'
             print '    }'
         
+        # And also break down glInterleavedArrays into the individual calls
+        if function.name == 'glInterleavedArrays':
+            print '    GLint __array_buffer = 0;'
+            print '    __glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &__array_buffer);'
+            print '    if (!__array_buffer) {'
+            self.dispatch_function(function)
+            print
+
+            # Initialize the enable flags
+            for camelcase_name, uppercase_name in self.arrays:
+                flag_name = '__' + uppercase_name.lower()
+                print '        GLboolean %s = GL_FALSE;' % flag_name
+            print
+
+            # Swicth for the interleaved formats
+            print '        switch (format) {'
+            for format in self.interleaved_formats:
+                print '            case %s:' % format
+                for camelcase_name, uppercase_name in self.arrays:
+                    flag_name = '__' + uppercase_name.lower()
+                    if format.find('_' + uppercase_name[0]) >= 0:
+                        print '                %s = GL_TRUE;' % flag_name
+                print '                break;'
+            print '            default:'
+            print '               return;'
+            print '        }'
+            print
+
+            # Emit fake glEnableClientState/glDisableClientState flags
+            for camelcase_name, uppercase_name in self.arrays:
+                flag_name = '__' + uppercase_name.lower()
+                enable_name = 'GL_%s_ARRAY' % uppercase_name
+
+                # Emit a fake function
+                print '        {'
+                print '            static const Trace::FunctionSig &__sig = %s ? __glEnableClientState_sig : __glDisableClientState_sig;' % flag_name
+                print '            unsigned __call = Trace::BeginEnter(__sig);'
+                print '            Trace::BeginArg(0);'
+                dump_instance(glapi.GLenum, enable_name)
+                print '            Trace::EndArg();'
+                print '            Trace::EndEnter();'
+                print '            Trace::BeginLeave(__call);'
+                print '            Trace::EndLeave();'
+                print '        }'
+
+            print '        return;'
+            print '    }'
+
         Tracer.trace_function_impl_body(self, function)
 
+    boolean_names = [
+        'GL_FALSE',
+        'GL_TRUE',
+    ]
+
+    def gl_boolean(self, value):
+        return self.boolean_names[int(bool(value))]
+
     def dump_arg_instance(self, function, arg):
         if function.name in self.draw_function_names and arg.name == 'indices':
             print '    GLint __element_array_buffer = 0;'