Merge branch 'gallium-0.1' into gallium-tex-surfaces
[mesa.git] / src / mesa / glapi / gl_apitemp.py
index b210c704a74af388f8083d2957d68e6d4c0bdb83..6e35571e143ae635cacce61e627c0e374e7bd290 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 gl_XML
+import gl_XML, glX_XML
 import license
 import sys, getopt
 
-class PrintGlOffsets(gl_XML.FilterGLAPISpecBase):
-       name = "gl_apitemp.py (from Mesa)"
-
+class PrintGlOffsets(gl_XML.gl_print_base):
        def __init__(self):
-               gl_XML.FilterGLAPISpecBase.__init__(self)
+               gl_XML.gl_print_base.__init__(self)
+
+               self.name = "gl_apitemp.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")
 
-       def printFunction(self, f):
+               self.undef_list.append( "KEYWORD1" )
+               self.undef_list.append( "KEYWORD1_ALT" )
+               self.undef_list.append( "KEYWORD2" )
+               self.undef_list.append( "NAME" )
+               self.undef_list.append( "DISPATCH" )
+               self.undef_list.append( "RETURN_DISPATCH" )
+               self.undef_list.append( "DISPATCH_TABLE_NAME" )
+               self.undef_list.append( "UNUSED_TABLE_NAME" )
+               self.undef_list.append( "TABLE_ENTRY" )
+
+
+       def printFunction(self, f, name):
                p_string = ""
                o_string = ""
                t_string = ""
                comma = ""
 
-               for p in f:
-                       cast = ""
+               if f.is_static_entry_point(name):
+                       keyword = "KEYWORD1"
+               else:
+                       keyword = "KEYWORD1_ALT"
+
+               n = f.static_name(name)
 
-                       if p.is_pointer:
-                               t = "%p"
+               for p in f.parameterIterator():
+                       if p.is_pointer():
                                cast = "(const void *) "
-                       elif p.p_type_string == 'GLenum':
-                               t = "0x%x"
-                       elif p.p_type_string in ['GLfloat', 'GLdouble', 'GLclampf', 'GLclampd']:
-                               t = "%f"
                        else:
-                               t = "%d"
+                               cast = ""
 
-                       t_string = t_string + comma + t
+                       t_string = t_string + comma + p.format_string()
                        p_string = p_string + comma + p.name
                        o_string = o_string + comma + cast + p.name
                        comma = ", "
 
 
-               if f.fn_return_type != 'void':
+               if f.return_type != 'void':
                        dispatch = "RETURN_DISPATCH"
                else:
                        dispatch = "DISPATCH"
 
-               print 'KEYWORD1 %s KEYWORD2 NAME(%s)(%s)' \
-                       % (f.fn_return_type, f.name, f.get_parameter_string())
+               if f.has_different_protocol(name):
+                       print '#ifndef GLX_INDIRECT_RENDERING'
+
+               if not f.is_static_entry_point(name):
+                       print '%s %s KEYWORD2 NAME(%s)(%s);' % (keyword, f.return_type, n, f.get_parameter_string(name))
+                       print ''
+
+               print '%s %s KEYWORD2 NAME(%s)(%s)' % (keyword, f.return_type, n, f.get_parameter_string(name))
                print '{'
                if p_string == "":
                        print '   %s(%s, (), (F, "gl%s();\\n"));' \
-                               % (dispatch, f.real_name, f.name)
+                               % (dispatch, f.name, name)
                else:
                        print '   %s(%s, (%s), (F, "gl%s(%s);\\n", %s));' \
-                               % (dispatch, f.real_name, p_string, f.name, t_string, o_string)
+                               % (dispatch, f.name, p_string, name, t_string, o_string)
                print '}'
+               if f.has_different_protocol(name):
+                       print '#endif /* GLX_INDIRECT_RENDERING */'
                print ''
                return
 
        def printRealHeader(self):
+               print ''
+               self.printVisibility( "HIDDEN", "hidden" )
                print """
 /*
  * This file is a template which generates the OpenGL API entry point
@@ -112,16 +129,17 @@ class PrintGlOffsets(gl_XML.FilterGLAPISpecBase):
  */
 
 
+#if defined( NAME )
 #ifndef KEYWORD1
 #define KEYWORD1
 #endif
 
-#ifndef KEYWORD2
-#define KEYWORD2
+#ifndef KEYWORD1_ALT
+#define KEYWORD1_ALT HIDDEN
 #endif
 
-#ifndef NAME
-#error NAME must be defined
+#ifndef KEYWORD2
+#define KEYWORD2
 #endif
 
 #ifndef DISPATCH
@@ -132,14 +150,14 @@ class PrintGlOffsets(gl_XML.FilterGLAPISpecBase):
 #error RETURN_DISPATCH must be defined
 #endif
 
-GLAPI void GLAPIENTRY gl__unused413(void);  /* silence warning */
 """
                return
 
     
 
-       def printInitDispatch(self):
+       def printInitDispatch(self, api):
                print """
+#endif /* defined( NAME ) */
 
 /*
  * This is how a dispatch table can be initialized with all the functions
@@ -151,13 +169,9 @@ GLAPI void GLAPIENTRY gl__unused413(void);  /* silence warning */
 #error TABLE_ENTRY must be defined
 #endif
 
-static void * DISPATCH_TABLE_NAME[] = {"""
-               keys = self.functions.keys()
-               keys.sort()
-               for k in keys:
-                       if k < 0: continue
-
-                       print '   TABLE_ENTRY(%s),' % (self.functions[k].name)
+static _glapi_proc DISPATCH_TABLE_NAME[] = {"""
+               for f in api.functionIterateByOffset():
+                       print '   TABLE_ENTRY(%s),' % (f.dispatch_name())
 
                print '   /* A whole bunch of no-op functions.  These might be called'
                print '    * when someone tries to call a dynamically-registered'
@@ -171,43 +185,49 @@ static void * DISPATCH_TABLE_NAME[] = {"""
                print ''
                return
 
-       def printAliasedTable(self):
+
+       def printAliasedTable(self, api):
                print """
 /*
  * This is just used to silence compiler warnings.
  * We list the functions which are not otherwise used.
  */
 #ifdef UNUSED_TABLE_NAME
-static const void * const UNUSED_TABLE_NAME[] = {"""
-
-               keys = self.functions.keys()
-               keys.sort()
-               keys.reverse();
-               for k in keys:
-                       f = self.functions[k]
-                       if f.fn_offset < 0:
-                               print '   TABLE_ENTRY(%s),' % (f.name)
-
+static _glapi_proc UNUSED_TABLE_NAME[] = {"""
+
+               for f in api.functionIterateByOffset():
+                       for n in f.entry_points:
+                               if n != f.name:
+                                       if f.is_static_entry_point(n):
+                                               text = '   TABLE_ENTRY(%s),' % (n)
+
+                                               if f.has_different_protocol(n):
+                                                       print '#ifndef GLX_INDIRECT_RENDERING'
+                                                       print text
+                                                       print '#endif'
+                                               else:
+                                                       print text
                print '};'
                print '#endif /*UNUSED_TABLE_NAME*/'
                print ''
                return
 
-       def printRealFooter(self):
-               self.printInitDispatch()
-               self.printAliasedTable()
-               print"""
-#undef KEYWORD1
-#undef KEYWORD2
-#undef NAME
-#undef DISPATCH
-#undef RETURN_DISPATCH
-#undef DISPATCH_TABLE_NAME
-#undef UNUSED_TABLE_NAME
-#undef TABLE_ENTRY
-"""
+
+       def printBody(self, api):
+               for func in api.functionIterateByOffset():
+                       got_stub = 0
+                       for n in func.entry_points:
+                               if func.is_static_entry_point(n):
+                                       self.printFunction(func, n)
+                               elif not got_stub:
+                                       self.printFunction(func, n)
+                                       got_stub = 1
+
+               self.printInitDispatch(api)
+               self.printAliasedTable(api)
                return
 
+
 def show_usage():
        print "Usage: %s [-f input_file_name]" % sys.argv[0]
        sys.exit(1)
@@ -224,15 +244,7 @@ if __name__ == '__main__':
                if arg == "-f":
                        file_name = val
 
-       dh = PrintGlOffsets()
-
-       parser = make_parser()
-       parser.setFeature(feature_namespaces, 0)
-       parser.setContentHandler(dh)
-
-       f = open(file_name)
-
-       dh.printHeader()
-       parser.parse(f)
-       dh.printFooter()
+       api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
 
+       printer = PrintGlOffsets()
+       printer.Print(api)