Add an option to emit extra debug code in the generated protocol functions.
authorIan Romanick <idr@us.ibm.com>
Fri, 28 Jan 2005 16:51:01 +0000 (16:51 +0000)
committerIan Romanick <idr@us.ibm.com>
Fri, 28 Jan 2005 16:51:01 +0000 (16:51 +0000)
The debug version of indirect.c has proven very helpful during the
development of new client-side and server-side GLX protocol code.  This is
put here instead of in the DISPATCH and DISPATCH_RETURN macros in dispatch.c
for two reasons.

1. I only want the debug information when indirect-rendering is used.

2. Functions that require a reply from the server, some of which do not have
a return value (e.g., glFlush, glFinish, glGetLightfv, etc.), do not need
the extra glFinish call.

src/mesa/glapi/glX_proto_send.py

index f1329d5..2090555 100644 (file)
@@ -113,6 +113,7 @@ class PrintGlxProtoStubs(glX_XML.GlxProto):
                self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004, 2005", "IBM")
                self.generic_sizes = [3, 4, 6, 8, 12, 16, 24, 32]
                self.pixel_stubs = {}
+               self.debug = 0
                return
 
        def printRealHeader(self):
@@ -217,7 +218,7 @@ const GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
                return
 
        def printFunction(self, f):
-               if f.fn_offset < 0 or f.handcode or f.ignore: return
+               if f.fn_offset < 0 or f.client_handcode or f.ignore: return
 
                if f.glx_rop != 0 or f.vectorequiv != None:
                        if f.image:
@@ -375,6 +376,9 @@ generic_%u_byte( GLint rop, const void * ptr )
        def printSingleFunction(self, f):
                self.common_func_print_header(f)
 
+               if self.debug:
+                       print '        printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
+
                if f.fn_parameters != []:
                        pc_decl = "GLubyte const * pc ="
                else:
@@ -406,6 +410,14 @@ generic_%u_byte( GLint rop, const void * ptr )
                                aa = "GL_FALSE"
 
                        print "       %s read_reply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa)
+               elif self.debug:
+                       # Only emit the extra glFinish call for functions
+                       # that don't already require a reply from the server.
+                       print '        __indirect_glFinish();'
+
+               if self.debug:
+                       print '        printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
+
 
                print '        UnlockDisplay(dpy); SyncHandle();'
                print '    }'
@@ -628,6 +640,9 @@ generic_%u_byte( GLint rop, const void * ptr )
                        indent = ""
                        trailer = None
 
+               if self.debug:
+                       print '%s    printf( "Enter %%s...\\n", "gl%s" );' % (indent, f.name)
+
                if f.can_be_large:
                        print '%s    if (cmdlen <= gc->maxSmallRenderCommandSize) {' % (indent)
                        print '%s        if ( (gc->pc + cmdlen) > gc->bufEnd ) {' % (indent)
@@ -647,11 +662,15 @@ generic_%u_byte( GLint rop, const void * ptr )
 
                        self.large_emit_begin(indent, f)
                        offset = self.common_emit_args(f, "pc", indent, 8, 1)
-                       
+
                        p = f.variable_length_parameter()
                        print '%s    __glXSendLargeCommand(gc, pc, %u, %s, %s);' % (indent, offset + 8, p.name, p.size_string())
                        print '%s}' % (indent)
 
+               if self.debug:
+                       print '%s    __indirect_glFinish();' % (indent)
+                       print '%s    printf( "Exit %%s.\\n", "gl%s" );' % (indent, f.name)
+
                if trailer: print trailer
                print '}'
                print ''
@@ -768,7 +787,9 @@ class PrintGlxProtoInit_h(glX_XML.GlxProto):
 
 
 def show_usage():
-       print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0]
+       print "Usage: %s [-f input_file_name] [-m output_mode] [-d]" % sys.argv[0]
+       print "    -m output_mode   Output mode can be one of 'proto', 'init_c' or 'init_h'."
+       print "    -d               Enable extra debug information in the generated code."
        sys.exit(1)
 
 
@@ -776,16 +797,19 @@ if __name__ == '__main__':
        file_name = "gl_API.xml"
 
        try:
-               (args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
+               (args, trail) = getopt.getopt(sys.argv[1:], "f:m:d")
        except Exception,e:
                show_usage()
 
+       debug = 0
        mode = "proto"
        for (arg,val) in args:
                if arg == "-f":
                        file_name = val
                elif arg == "-m":
                        mode = val
+               elif arg == "-d":
+                       debug = 1
 
        if mode == "proto":
                dh = PrintGlxProtoStubs()
@@ -802,6 +826,7 @@ if __name__ == '__main__':
 
        f = open(file_name)
 
+       dh.debug = debug
        dh.printHeader()
        parser.parse(f)
        dh.printFooter()