Merge branch 'arb_half_float_vertex'
[mesa.git] / src / mesa / glapi / gl_apitemp.py
index 4c4bcd40ff367405ee28baf401fbe12ba47d6747..41a40fbeb681d28c33a7de5b948ae0671fc263ca 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, es=False):
+               gl_XML.gl_print_base.__init__(self)
 
-       def __init__(self):
-               gl_XML.FilterGLAPISpecBase.__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.es = es
+
+               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 = ""
 
+               if f.is_static_entry_point(name):
+                       keyword = "KEYWORD1"
+               else:
+                       keyword = "KEYWORD1_ALT"
+
+               n = f.static_name(name)
+
                for p in f.parameterIterator():
-                       cast = ""
+                       if p.is_padding:
+                               continue
 
-                       if p.is_pointer:
-                               t = "%p"
+                       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())
+               need_proto = False
+               if not f.is_static_entry_point(name):
+                       need_proto = True
+               elif self.es:
+                       cat, num = api.get_category_for_name(name)
+                       if (cat.startswith("es") or cat.startswith("GL_OES")):
+                               need_proto = True
+               if need_proto:
+                       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 '}'
                print ''
                return
 
        def printRealHeader(self):
+               print ''
+               self.printVisibility( "HIDDEN", "hidden" )
                print """
 /*
  * This file is a template which generates the OpenGL API entry point
@@ -117,6 +141,10 @@ class PrintGlOffsets(gl_XML.FilterGLAPISpecBase):
 #define KEYWORD1
 #endif
 
+#ifndef KEYWORD1_ALT
+#define KEYWORD1_ALT HIDDEN
+#endif
+
 #ifndef KEYWORD2
 #define KEYWORD2
 #endif
@@ -134,7 +162,7 @@ class PrintGlOffsets(gl_XML.FilterGLAPISpecBase):
 
     
 
-       def printInitDispatch(self):
+       def printInitDispatch(self, api):
                print """
 #endif /* defined( NAME ) */
 
@@ -148,11 +176,13 @@ class PrintGlOffsets(gl_XML.FilterGLAPISpecBase):
 #error TABLE_ENTRY must be defined
 #endif
 
-static _glapi_proc DISPATCH_TABLE_NAME[] = {"""
-               for f in self.functionIterator():
-                       if f.fn_offset < 0: continue
+#ifdef _GLAPI_SKIP_NORMAL_ENTRY_POINTS
+#error _GLAPI_SKIP_NORMAL_ENTRY_POINTS must not be defined
+#endif
 
-                       print '   TABLE_ENTRY(%s),' % (f.name)
+_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'
@@ -166,64 +196,125 @@ static _glapi_proc 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 _glapi_proc UNUSED_TABLE_NAME[] = {"""
-
-               for f in self.functionIterator():
-                       if f.fn_offset < 0:
-                               print '   TABLE_ENTRY(%s),' % (f.name)
+_glapi_proc UNUSED_TABLE_NAME[] = {"""
+
+               normal_entries = []
+               proto_entries = []
+               for f in api.functionIterateByOffset():
+                       normal_ents, proto_ents = self.classifyEntryPoints(f)
+
+                       # exclude f.name
+                       if f.name in normal_ents:
+                               normal_ents.remove(f.name)
+                       elif f.name in proto_ents:
+                               proto_ents.remove(f.name)
+
+                       normal_ents = [f.static_name(ent) for ent in normal_ents]
+                       proto_ents = [f.static_name(ent) for ent in proto_ents]
+
+                       normal_entries.extend(normal_ents)
+                       proto_entries.extend(proto_ents)
+
+               print '#ifndef _GLAPI_SKIP_NORMAL_ENTRY_POINTS'
+               for ent in normal_entries:
+                       print '   TABLE_ENTRY(%s),' % (ent)
+               print '#endif /* _GLAPI_SKIP_NORMAL_ENTRY_POINTS */'
+               print '#ifndef _GLAPI_SKIP_PROTO_ENTRY_POINTS'
+               for ent in proto_entries:
+                       print '   TABLE_ENTRY(%s),' % (ent)
+               print '#endif /* _GLAPI_SKIP_PROTO_ENTRY_POINTS */'
 
                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 classifyEntryPoints(self, func):
+               normal_names = []
+               normal_stubs = []
+               proto_names = []
+               proto_stubs = []
+               # classify the entry points
+               for name in func.entry_points:
+                       if func.has_different_protocol(name):
+                               if func.is_static_entry_point(name):
+                                       proto_names.append(name)
+                               else:
+                                       proto_stubs.append(name)
+                       else:
+                               if func.is_static_entry_point(name):
+                                       normal_names.append(name)
+                               else:
+                                       normal_stubs.append(name)
+               # there can be at most one stub for a function
+               if normal_stubs:
+                       normal_names.append(normal_stubs[0])
+               elif proto_stubs:
+                       proto_names.append(proto_stubs[0])
+
+               return (normal_names, proto_names)
+
+       def printBody(self, api):
+               normal_entry_points = []
+               proto_entry_points = []
+               for func in api.functionIterateByOffset():
+                       normal_ents, proto_ents = self.classifyEntryPoints(func)
+                       normal_entry_points.append((func, normal_ents))
+                       proto_entry_points.append((func, proto_ents))
+
+               print '#ifndef _GLAPI_SKIP_NORMAL_ENTRY_POINTS'
+               print ''
+               for func, ents in normal_entry_points:
+                       for ent in ents:
+                               self.printFunction(func, ent)
+               print ''
+               print '#endif /* _GLAPI_SKIP_NORMAL_ENTRY_POINTS */'
+               print ''
+               print '/* these entry points might require different protocols */'
+               print '#ifndef _GLAPI_SKIP_PROTO_ENTRY_POINTS'
+               print ''
+               for func, ents in proto_entry_points:
+                       for ent in ents:
+                               self.printFunction(func, ent)
+               print ''
+               print '#endif /* _GLAPI_SKIP_PROTO_ENTRY_POINTS */'
+               print ''
+
+               self.printInitDispatch(api)
+               self.printAliasedTable(api)
                return
 
+
 def show_usage():
-       print "Usage: %s [-f input_file_name]" % sys.argv[0]
+       print "Usage: %s [-f input_file_name] [-c]" % sys.argv[0]
+       print "-c          Enable compatibility with OpenGL ES."
        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:c")
        except Exception,e:
                show_usage()
 
+       es = False
        for (arg,val) in args:
                if arg == "-f":
                        file_name = val
+               elif arg == "-c":
+                       es = True
 
-       dh = PrintGlOffsets()
-
-       parser = make_parser()
-       parser.setFeature(feature_namespaces, 1)
-       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(es)
+       printer.Print(api)