glapi: Add OpenGL ES compatibility mode to scripts.
authorChia-I Wu <olvaffe@gmail.com>
Thu, 3 Sep 2009 03:05:06 +0000 (11:05 +0800)
committerBrian Paul <brianp@vmware.com>
Fri, 6 Nov 2009 21:19:23 +0000 (14:19 -0700)
When the mode is on, the scripts would generate headers that are
suitable for OpenGL ES.  There are two differences.  One is that they
will generate function prototypes for OpenGL ES specific functions.  The
other is that, when a function has multiple names, SET/GET/CALL macros
would be generated for each of names.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
src/mesa/glapi/gl_apitemp.py
src/mesa/glapi/gl_offsets.py
src/mesa/glapi/gl_procs.py
src/mesa/glapi/gl_table.py

index d4f8b1d8f85b49663c85d47d834e9f1adcc5de3c..09b0d364ce3032fe87465ffe6217c8cdd9e3144c 100644 (file)
@@ -30,7 +30,7 @@ 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,6 +38,8 @@ 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" )
@@ -82,7 +84,14 @@ class PrintGlOffsets(gl_XML.gl_print_base):
                else:
                        dispatch = "DISPATCH"
 
+               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 ''
 
@@ -286,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, glX_XML.glx_item_factory())
 
-       printer = PrintGlOffsets()
+       printer = PrintGlOffsets(es)
        printer.Print(api)
index b8b509d09fa8cc8a98d10e4394027990a66c36fb..54867b346348d62d18fd0e9bf148bdb89d3645be 100644 (file)
@@ -30,9 +30,10 @@ 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.es = es
                self.name = "gl_offsets.py (from Mesa)"
                self.header_tag = '_GLAPI_OFFSETS_H_'
                self.license = license.bsd_license_template % ( \
@@ -46,6 +47,7 @@ class PrintGlOffsets(gl_XML.gl_print_base):
 
                functions = []
                abi_functions = []
+               alias_functions = []
                count = 0
                for f in api.functionIterateByOffset():
                        if not f.is_abi():
@@ -54,6 +56,10 @@ class PrintGlOffsets(gl_XML.gl_print_base):
                        else:
                                abi_functions.append( f )
 
+                       if self.es:
+                               # remember functions with aliases
+                               if len(f.entry_points) > 1:
+                                       alias_functions.append(f)
 
                for f in abi_functions:
                        print '#define _gloffset_%s %d' % (f.name, f.offset)
@@ -78,26 +84,37 @@ class PrintGlOffsets(gl_XML.gl_print_base):
                print ''
                print '#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */'
 
+               if alias_functions:
+                       print ''
+                       print '/* define aliases for compatibility */'
+                       for f in alias_functions:
+                               for name in f.entry_points:
+                                       if name != f.name:
+                                               print '#define _gloffset_%s _gloffset_%s' % (name, f.name)
                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
 
        api = gl_XML.parse_GL_API( file_name )
 
-       printer = PrintGlOffsets()
+       printer = PrintGlOffsets(es)
        printer.Print( api )
index cd1a68cee170c3f34f6cbe887976eb6083886917..5de61fbdfe92d48642b5dc3805130c0cae5ea207 100644 (file)
@@ -30,9 +30,10 @@ import gl_XML, glX_XML
 import sys, getopt
 
 class PrintGlProcs(gl_XML.gl_print_base):
-       def __init__(self, long_strings):
+       def __init__(self, long_strings, es=False):
                gl_XML.gl_print_base.__init__(self)
 
+               self.es = es
                self.long_strings = long_strings
                self.name = "gl_procs.py (from Mesa)"
                self.license = license.bsd_license_template % ( \
@@ -141,6 +142,28 @@ typedef struct {
                                        print '%s GLAPIENTRY gl_dispatch_stub_%u(%s);' % (func.return_type, func.offset, func.get_parameter_string())
                                        break
 
+               if self.es:
+                       categories = {}
+                       for func in api.functionIterateByOffset():
+                               for n in func.entry_points:
+                                       cat, num = api.get_category_for_name(n)
+                                       if (cat.startswith("es") or cat.startswith("GL_OES")):
+                                               if not categories.has_key(cat):
+                                                       categories[cat] = []
+                                               proto = 'GLAPI %s GLAPIENTRY %s(%s);' \
+                                                               % (func.return_type, "gl" + n, func.get_parameter_string(n))
+                                               categories[cat].append(proto)
+                       if categories:
+                               print ''
+                               print '/* OpenGL ES specific prototypes */'
+                               print ''
+                               keys = categories.keys()
+                               keys.sort()
+                               for key in keys:
+                                       print '/* category %s */' % key
+                                       print "\n".join(categories[key])
+                               print ''
+
                print '#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */'
 
                print ''
@@ -155,8 +178,9 @@ typedef struct {
 
 
 def show_usage():
-       print "Usage: %s [-f input_file_name] [-m mode]" % sys.argv[0]
-       print "mode can be one of:"
+       print "Usage: %s [-f input_file_name] [-m mode] [-c]" % sys.argv[0]
+       print "-c          Enable compatibility with OpenGL ES."
+       print "-m mode     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"
@@ -167,11 +191,12 @@ if __name__ == '__main__':
        file_name = "gl_API.xml"
 
        try:
-               (args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
+               (args, trail) = getopt.getopt(sys.argv[1:], "f:m:c")
        except Exception,e:
                show_usage()
 
        long_string = 1
+       es = False
        for (arg,val) in args:
                if arg == "-f":
                        file_name = val
@@ -182,7 +207,9 @@ if __name__ == '__main__':
                                long_string = 1
                        else:
                                show_usage()
+               elif arg == "-c":
+                   es = True
 
        api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
-       printer = PrintGlProcs(long_string)
+       printer = PrintGlProcs(long_string, es)
        printer.Print(api)
index 698795fb0ab45d08c65173a0cd90872856077707..3bd7569e92ab16826dadb1461d641683ac2d72af 100644 (file)
@@ -30,9 +30,10 @@ import license
 import sys, getopt
 
 class PrintGlTable(gl_XML.gl_print_base):
-       def __init__(self):
+       def __init__(self, es=False):
                gl_XML.gl_print_base.__init__(self)
 
+               self.es = es
                self.header_tag = '_GLAPI_TABLE_H_'
                self.name = "gl_table.py (from Mesa)"
                self.license = license.bsd_license_template % ( \
@@ -68,9 +69,10 @@ class PrintGlTable(gl_XML.gl_print_base):
 
 
 class PrintRemapTable(gl_XML.gl_print_base):
-       def __init__(self):
+       def __init__(self, es=False):
                gl_XML.gl_print_base.__init__(self)
 
+               self.es = es
                self.header_tag = '_GLAPI_DISPATCH_H_'
                self.name = "gl_table.py (from Mesa)"
                self.license = license.bsd_license_template % ("(C) Copyright IBM Corporation 2005", "IBM")
@@ -115,6 +117,7 @@ class PrintRemapTable(gl_XML.gl_print_base):
 
                functions = []
                abi_functions = []
+               alias_functions = []
                count = 0
                for f in api.functionIterateByOffset():
                        if not f.is_abi():
@@ -123,6 +126,11 @@ class PrintRemapTable(gl_XML.gl_print_base):
                        else:
                                abi_functions.append( f )
 
+                       if self.es:
+                               # remember functions with aliases
+                               if len(f.entry_points) > 1:
+                                       alias_functions.append(f)
+
 
                for f in abi_functions:
                        print '#define CALL_%s(disp, parameters) (*((disp)->%s)) parameters' % (f.name, f.name)
@@ -162,33 +170,57 @@ class PrintRemapTable(gl_XML.gl_print_base):
 
                print ''
                print '#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */'
+
+               if alias_functions:
+                       print ''
+                       print '/* define aliases for compatibility */'
+                       for f in alias_functions:
+                               for name in f.entry_points:
+                                       if name != f.name:
+                                               print '#define CALL_%s(disp, parameters) CALL_%s(disp, parameters)' % (name, f.name)
+                                               print '#define GET_%s(disp) GET_%s(disp)' % (name, f.name)
+                                               print '#define SET_%s(disp, fn) SET_%s(disp, fn)' % (name, f.name)
+                       print ''
+
+                       print '#if defined(_GLAPI_USE_REMAP_TABLE)'
+                       for f in alias_functions:
+                               for name in f.entry_points:
+                                       if name != f.name:
+                                               print '#define %s_remap_index %s_remap_index' % (name, f.name)
+                       print '#endif /* defined(_GLAPI_USE_REMAP_TABLE) */'
+                       print ''
+
                return
 
 
 def show_usage():
-       print "Usage: %s [-f input_file_name] [-m mode]" % sys.argv[0]
+       print "Usage: %s [-f input_file_name] [-m mode] [-c]" % sys.argv[0]
        print "    -m mode   Mode can be 'table' or 'remap_table'."
+       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:m:")
+               (args, trail) = getopt.getopt(sys.argv[1:], "f:m:c")
        except Exception,e:
                show_usage()
 
        mode = "table"
+       es = False
        for (arg,val) in args:
                if arg == "-f":
                        file_name = val
                elif arg == "-m":
                        mode = val
+               elif arg == "-c":
+                       es = True
 
        if mode == "table":
-               printer = PrintGlTable()
+               printer = PrintGlTable(es)
        elif mode == "remap_table":
-               printer = PrintRemapTable()
+               printer = PrintRemapTable(es)
        else:
                show_usage()