Merge branch 'arb_half_float_vertex'
[mesa.git] / src / mesa / glapi / gl_apitemp.py
index 7cc434fa89ba09d0d32b2559ba1f5b3368d7bb25..41a40fbeb681d28c33a7de5b948ae0671fc263ca 100644 (file)
 # Authors:
 #    Ian Romanick <idr@us.ibm.com>
 
-import gl_XML
+import gl_XML, glX_XML
 import license
 import sys, getopt
 
 class PrintGlOffsets(gl_XML.gl_print_base):
-       def __init__(self):
+       def __init__(self, es=False):
                gl_XML.gl_print_base.__init__(self)
 
                self.name = "gl_apitemp.py (from Mesa)"
@@ -38,7 +38,10 @@ class PrintGlOffsets(gl_XML.gl_print_base):
 """Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
 (C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
 
+               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" )
@@ -54,7 +57,17 @@ class PrintGlOffsets(gl_XML.gl_print_base):
                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():
+                       if p.is_padding:
+                               continue
+
                        if p.is_pointer():
                                cast = "(const void *) "
                        else:
@@ -71,8 +84,18 @@ class PrintGlOffsets(gl_XML.gl_print_base):
                else:
                        dispatch = "DISPATCH"
 
-               print 'KEYWORD1 %s KEYWORD2 NAME(%s)(%s)' \
-                       % (f.return_type, name, f.get_parameter_string(name))
+               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"));' \
@@ -85,6 +108,8 @@ class PrintGlOffsets(gl_XML.gl_print_base):
                return
 
        def printRealHeader(self):
+               print ''
+               self.printVisibility( "HIDDEN", "hidden" )
                print """
 /*
  * This file is a template which generates the OpenGL API entry point
@@ -116,6 +141,10 @@ class PrintGlOffsets(gl_XML.gl_print_base):
 #define KEYWORD1
 #endif
 
+#ifndef KEYWORD1_ALT
+#define KEYWORD1_ALT HIDDEN
+#endif
+
 #ifndef KEYWORD2
 #define KEYWORD2
 #endif
@@ -147,9 +176,13 @@ class PrintGlOffsets(gl_XML.gl_print_base):
 #error TABLE_ENTRY must be defined
 #endif
 
-static _glapi_proc DISPATCH_TABLE_NAME[] = {"""
+#ifdef _GLAPI_SKIP_NORMAL_ENTRY_POINTS
+#error _GLAPI_SKIP_NORMAL_ENTRY_POINTS must not be defined
+#endif
+
+_glapi_proc DISPATCH_TABLE_NAME[] = {"""
                for f in api.functionIterateByOffset():
-                       print '   TABLE_ENTRY(%s),' % (f.name)
+                       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,12 +204,33 @@ static _glapi_proc DISPATCH_TABLE_NAME[] = {"""
  * We list the functions which are not otherwise used.
  */
 #ifdef UNUSED_TABLE_NAME
-static _glapi_proc UNUSED_TABLE_NAME[] = {"""
+_glapi_proc UNUSED_TABLE_NAME[] = {"""
 
+               normal_entries = []
+               proto_entries = []
                for f in api.functionIterateByOffset():
-                       for n in f.entry_points:
-                               if n != f.name:
-                                       print '   TABLE_ENTRY(%s),' % (n)
+                       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*/'
@@ -184,10 +238,56 @@ static _glapi_proc UNUSED_TABLE_NAME[] = {"""
                return
 
 
+       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():
-                       for n in func.entry_points:
-                               self.printFunction( func, n )
+                       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)
@@ -195,22 +295,26 @@ static _glapi_proc UNUSED_TABLE_NAME[] = {"""
 
 
 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
 
-       api = gl_XML.parse_GL_API( file_name )
+       api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
 
-       printer = PrintGlOffsets()
+       printer = PrintGlOffsets(es)
        printer.Print(api)