]> git.cworth.org Git - apitrace/blobdiff - gltrace.py
Retrace glXCreateNewContext & glXMakeContextCurrent.
[apitrace] / gltrace.py
index 4d81d2e673f28a68fd32b1700c4bd8e7754845e5..2dee18d965ccc82ce7a756e8d6a3a72a6d0893d9 100644 (file)
@@ -29,6 +29,7 @@
 
 import stdapi
 import glapi
+import glparams
 from glxapi import glxapi
 from trace import Tracer, dump_instance
 
@@ -80,14 +81,6 @@ class TypeGetter(stdapi.Visitor):
 
 class GlTracer(Tracer):
 
-    def header(self, api):
-        Tracer.header(self, api)
-        self.state_tracker_decl(api)
-
-    def footer(self, api):
-        Tracer.footer(self, api)
-        self.state_tracker_impl(api)
-
     arrays = [
         ("Vertex", "VERTEX"),
         ("Normal", "NORMAL"),
@@ -100,7 +93,9 @@ class GlTracer(Tracer):
     ]
     arrays.reverse()
 
-    def state_tracker_decl(self, api):
+    def header(self, api):
+        Tracer.header(self, api)
+
         print '// Whether user arrays were used'
         print 'static bool __user_arrays = false;'
         print
@@ -176,7 +171,51 @@ class GlTracer(Tracer):
 
         # Generate memcpy's signature
         self.trace_function_decl(glapi.memcpy)
-    
+
+        # Generate a helper function to determine whether a parameter name
+        # refers to a symbolic value or not
+        print 'static bool'
+        print 'is_symbolic_pname(GLenum pname) {'
+        print '    switch(pname) {'
+        for function, type, count, name in glparams.parameters:
+            if type is glapi.GLenum:
+                print '    case %s:' % name
+        print '        return true;'
+        print '    default:'
+        print '        return false;'
+        print '    }'
+        print '}'
+        print
+        
+        # Generate a helper function to determine whether a parameter value is
+        # potentially symbolic or not; i.e., if the value can be represented in
+        # an enum or not
+        print 'template<class T>'
+        print 'static inline bool'
+        print 'is_symbolic_param(T param) {'
+        print '    return static_cast<T>(static_cast<GLenum>(param)) == param;'
+        print '}'
+        print
+
+        # Generate a helper function to know how many elements a parameter has
+        print 'static size_t'
+        print 'pname_size(GLenum pname) {'
+        print '    switch(pname) {'
+        for function, type, count, name in glparams.parameters:
+            if type is not None:
+                print '    case %s: return %u;' % (name, count)
+        print '    case GL_COMPRESSED_TEXTURE_FORMATS: {'
+        print '            GLint num_compressed_texture_formats = 0;'
+        print '            __glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &num_compressed_texture_formats);'
+        print '            return num_compressed_texture_formats;'
+        print '        }'
+        print '    default:'
+        print r'        OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);'
+        print '        return 1;'
+        print '    }'
+        print '}'
+        print
+
     array_pointer_function_names = set((
         "glVertexPointer",
         "glNormalPointer",
@@ -187,18 +226,22 @@ class GlTracer(Tracer):
         "glFogCoordPointer",
         "glSecondaryColorPointer",
         
-        #"glVertexPointerEXT",
-        #"glNormalPointerEXT",
-        #"glColorPointerEXT",
-        #"glIndexPointerEXT",
-        #"glTexCoordPointerEXT",
-        #"glEdgeFlagPointerEXT",
-        #"glFogCoordPointerEXT",
-        #"glSecondaryColorPointerEXT",
+        "glInterleavedArrays",
+
+        "glVertexPointerEXT",
+        "glNormalPointerEXT",
+        "glColorPointerEXT",
+        "glIndexPointerEXT",
+        "glTexCoordPointerEXT",
+        "glEdgeFlagPointerEXT",
+        "glFogCoordPointerEXT",
+        "glSecondaryColorPointerEXT",
 
         "glVertexAttribPointer",
         "glVertexAttribPointerARB",
         "glVertexAttribPointerNV",
+        "glVertexAttribIPointer",
+        "glVertexAttribIPointerEXT",
         "glVertexAttribLPointer",
         "glVertexAttribLPointerEXT",
         
@@ -207,8 +250,10 @@ class GlTracer(Tracer):
 
     draw_function_names = set((
         'glDrawArrays',
+        'glDrawArraysEXT',
         'glDrawElements',
         'glDrawRangeElements',
+        'glDrawRangeElementsEXT',
     ))
 
     interleaved_formats = [
@@ -236,6 +281,48 @@ class GlTracer(Tracer):
             print '    if (!__array_buffer) {'
             print '        __user_arrays = true;'
             self.dispatch_function(function)
+
+            # And also break down glInterleavedArrays into the individual calls
+            if function.name == 'glInterleavedArrays':
+                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
+
+                # Switch 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 '    }'
 
@@ -247,55 +334,6 @@ 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) {'
-            print '        __user_arrays = true;'
-            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 '    }'
-
         # Emit a fake memcpy on
         if function.name in ('glUnmapBuffer', 'glUnmapBufferARB'):
             print '    struct buffer_mapping *mapping = get_buffer_mapping(target);'
@@ -363,11 +401,25 @@ class GlTracer(Tracer):
             print '    }'
             return
 
+        # Several GL state functions take GLenum symbolic names as
+        # integer/floats; so dump the symbolic name whenever possible
+        if arg.type in (glapi.GLint, glapi.GLfloat) and arg.name == 'param':
+            assert arg.index > 0
+            assert function.args[arg.index - 1].name == 'pname'
+            assert function.args[arg.index - 1].type == glapi.GLenum
+            print '    if (is_symbolic_pname(pname) && is_symbolic_param(%s)) {' % arg.name
+            dump_instance(glapi.GLenum, arg.name)
+            print '    } else {'
+            Tracer.dump_arg_instance(self, function, arg)
+            print '    }'
+            return
+
         Tracer.dump_arg_instance(self, function, arg)
 
-    def state_tracker_impl(self, api):
-        # A simple state tracker to track the pointer values
+    def footer(self, api):
+        Tracer.footer(self, api)
 
+        # A simple state tracker to track the pointer values
         # update the state
         print 'static void __trace_user_arrays(GLuint maxindex)'
         print '{'