nv10 has alpha color mask
[mesa.git] / src / mesa / glapi / gl_procs.py
index 6ea53d100b3493e49f232c64b234ade8aca29bc5..96e59a58ca19f122407f0310caedd8c07673a15a 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
 # Authors:
 #    Ian Romanick <idr@us.ibm.com>
 
-from xml.sax import saxutils
-from xml.sax import make_parser
-from xml.sax.handler import feature_namespaces
-
 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)
 
-       def __init__(self):
-               gl_XML.FilterGLAPISpecBase.__init__(self)
+               self.long_strings = long_strings
+               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 ''
-               print '/* This file is only included by glapi.c and is used for'
-               print ' * the GetProcAddress() function'
-               print ' */'
-               print ''
-               print 'static const struct name_address_offset static_functions[] = {'
+               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):
-               print '   { NULL, NULL, 0 }  /* end of list marker */'
-               print '};'
+               print ''
+               print '#undef NAME_FUNC_OFFSET'
                return
 
-       def printFunction(self, f):
-               print '   { "gl%s", (GLvoid *) gl%s, _gloffset_%s },' \
-                       % (f.name, f.name, f.real_name)
+       def printFunctionString(self, name):
+               if self.long_strings:
+                       print '    "gl%s\\0"' % (name)
+               else:
+                       print "    'g','l',",
+                       for c in name:
+                               print "'%s'," % (c),
+                       
+                       print "'\\0',"
+
+
+       def printBody(self, api):
+               print ''
+               if self.long_strings:
+                       print 'static const char gl_string_table[] ='
+               else:
+                       print 'static const char gl_string_table[] = {'
+
+               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 '    ;'
+               else:
+                       print '};'
+
+               print ''
+               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 '/* FIXME: Having these (incorrect) prototypes here is ugly. */'
+               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 'extern void gl_dispatch_stub_%u(void);' % (func.offset)
+                                       break
+
+               print '#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */'
+
+               print ''
+               print 'static const glprocs_table_t static_functions[] = {'
+
+               for info in table:
+                       print '    NAME_FUNC_OFFSET(%5u, %s, %s, %s, _gloffset_%s),' % info
+
+               print '    NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)'
+               print '};'
+               return
 
 
 def show_usage():
-       print "Usage: %s [-f input_file_name]" % sys.argv[0]
+       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 string constants. (default)"
+       print "    short - Create code for compilers that can only handle"
+       print "            ANSI C89 string constants."
        sys.exit(1)
 
 if __name__ == '__main__':
        file_name = "gl_API.xml"
-    
+
        try:
-               (args, trail) = getopt.getopt(sys.argv[1:], "f:")
+               (args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
        except Exception,e:
                show_usage()
 
+       long_string = 1
        for (arg,val) in args:
                if arg == "-f":
                        file_name = val
-
-       dh = PrintGlProcs()
-
-       parser = make_parser()
-       parser.setFeature(feature_namespaces, 0)
-       parser.setContentHandler(dh)
-
-       f = open(file_name)
-
-       dh.printHeader()
-       parser.parse(f)
-       dh.printFooter()
+               elif arg == "-m":
+                       if val == "short":
+                               long_string = 0
+                       elif val == "long":
+                               long_string = 1
+                       else:
+                               show_usage()
+
+       api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
+       printer = PrintGlProcs(long_string)
+       printer.Print(api)