Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / mesa / glapi / gl_procs.py
index 75bb844a335823c138ed7288d0000a934d3614cd..cd1a68cee170c3f34f6cbe887976eb6083886917 100644 (file)
@@ -1,6 +1,6 @@
-#!/usr/bin/python2
+#!/usr/bin/env python
 
-# (C) Copyright IBM Corporation 2004
+# (C) Copyright IBM Corporation 2004, 2005
 # All Rights Reserved.
 #
 # Permission is hereby granted, free of charge, to any person obtaining a
 #    Ian Romanick <idr@us.ibm.com>
 
 import license
-import gl_XML
+import gl_XML, glX_XML
 import sys, getopt
 
-class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
-       name = "gl_procs.py (from Mesa)"
-
+class PrintGlProcs(gl_XML.gl_print_base):
        def __init__(self, long_strings):
+               gl_XML.gl_print_base.__init__(self)
+
                self.long_strings = long_strings
-               gl_XML.FilterGLAPISpecBase.__init__(self)
+               self.name = "gl_procs.py (from Mesa)"
                self.license = license.bsd_license_template % ( \
 """Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
-(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
+(C) Copyright IBM Corporation 2004, 2006""", "BRIAN PAUL, IBM")
 
 
        def printRealHeader(self):
-               print '/* This file is only included by glapi.c and is used for'
-               print ' * the GetProcAddress() function'
-               print ' */'
-               print ''
-               print 'typedef struct {'
-               print '    GLint Name_offset;'
-               print '#ifdef NEED_FUNCTION_POINTER'
-               print '    _glapi_proc Address;'
-               print '#endif'
-               print '    GLuint Offset;'
-               print '} glprocs_table_t;'
-               print ''
-               print '#ifdef NEED_FUNCTION_POINTER'
-               print '#  define NAME_FUNC_OFFSET(n,f,o) { n , (_glapi_proc) f , o }'
-               print '#else'
-               print '#  define NAME_FUNC_OFFSET(n,f,o) { n , o }'
-               print '#endif'
-               print ''
+               print """
+/* This file is only included by glapi.c and is used for
+ * the GetProcAddress() function
+ */
+
+typedef struct {
+    GLint Name_offset;
+#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)
+    _glapi_proc Address;
+#endif
+    GLuint Offset;
+} glprocs_table_t;
+
+#if   !defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
+#  define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , o }
+#elif  defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
+#  define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f1 , o }
+#elif  defined(NEED_FUNCTION_POINTER) &&  defined(GLX_INDIRECT_RENDERING)
+#  define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f2 , o }
+#elif !defined(NEED_FUNCTION_POINTER) &&  defined(GLX_INDIRECT_RENDERING)
+#  define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f3 , o }
+#endif
+
+"""
                return
 
        def printRealFooter(self):
@@ -66,29 +72,51 @@ class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
                print '#undef NAME_FUNC_OFFSET'
                return
 
-       def printFunctionString(self, f):
+       def printFunctionString(self, name):
                if self.long_strings:
-                       print '    "gl%s\\0"' % (f.name)
+                       print '    "gl%s\\0"' % (name)
                else:
                        print "    'g','l',",
-                       for c in f.name:
+                       for c in name:
                                print "'%s'," % (c),
                        
                        print "'\\0',"
 
-       def printFunctionOffset(self, f, offset_of_name):
-               print '    NAME_FUNC_OFFSET( % 5u, gl%s, _gloffset_%s ),' % (offset_of_name, f.name, f.real_name)
-
 
-       def printFunctions(self):
+       def printBody(self, api):
                print ''
                if self.long_strings:
                        print 'static const char gl_string_table[] ='
                else:
                        print 'static const char gl_string_table[] = {'
 
-               for f in self.functionIterator():
-                       self.printFunctionString(f)
+               base_offset = 0
+               table = []
+               for func in api.functionIterateByOffset():
+                       name = func.dispatch_name()
+                       self.printFunctionString(func.name)
+                       table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.name))
+
+                       # The length of the function's name, plus 2 for "gl",
+                       # plus 1 for the NUL.
+
+                       base_offset += len(func.name) + 3
+
+
+               for func in api.functionIterateByOffset():
+                       for n in func.entry_points:
+                               if n != func.name:
+                                       name = func.dispatch_name()
+                                       self.printFunctionString( n )
+                                       
+                                       if func.has_different_protocol(n):
+                                               alt_name = "gl" + func.static_glx_name(n)
+                                               table.append((base_offset, "gl" + name, alt_name, alt_name, func.name))
+                                       else:
+                                               table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.name))
+
+                                       base_offset += len(n) + 3
+
 
                if self.long_strings:
                        print '    ;'
@@ -96,19 +124,32 @@ class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
                        print '};'
 
                print ''
-               print 'static const glprocs_table_t static_functions[] = {'
-
-               base_offset = 0
+               print ''
+               print "#ifdef USE_MGL_NAMESPACE"
+               for func in api.functionIterateByOffset():
+                       for n in func.entry_points:
+                               if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)):
+                                       print '#define gl_dispatch_stub_%u mgl_dispatch_stub_%u' % (func.offset, func.offset)
+                                       break
+               print "#endif /* USE_MGL_NAMESPACE */"
+               print ''
+               print ''
+               print '#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)'
+               for func in api.functionIterateByOffset():
+                       for n in func.entry_points:
+                               if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)):
+                                       print '%s GLAPIENTRY gl_dispatch_stub_%u(%s);' % (func.return_type, func.offset, func.get_parameter_string())
+                                       break
 
-               for f in self.functionIterator():
-                       self.printFunctionOffset(f, base_offset)
+               print '#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */'
 
-                       # The length of the function's name, plus 2 for "gl",
-                       # plus 1 for the NUL.
+               print ''
+               print 'static const glprocs_table_t static_functions[] = {'
 
-                       base_offset += len(f.name) + 3
+               for info in table:
+                       print '    NAME_FUNC_OFFSET(%5u, %s, %s, %s, _gloffset_%s),' % info
 
-               print '    NAME_FUNC_OFFSET( -1, NULL, 0 )'
+               print '    NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)'
                print '};'
                return
 
@@ -116,9 +157,9 @@ class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
 def show_usage():
        print "Usage: %s [-f input_file_name] [-m mode]" % sys.argv[0]
        print "mode can be one of:"
-       print "    long  - Create code for compilers that can handle very "
+       print "    long  - Create code for compilers that can handle very"
        print "            long string constants. (default)"
-       print "    short - Create code for compilers that can only handle "
+       print "    short - Create code for compilers that can only handle"
        print "            ANSI C89 string constants."
        sys.exit(1)
 
@@ -142,5 +183,6 @@ if __name__ == '__main__':
                        else:
                                show_usage()
 
-       dh = PrintGlProcs( long_string )
-       gl_XML.parse_GL_API( dh, file_name )
+       api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
+       printer = PrintGlProcs(long_string)
+       printer.Print(api)