1 2# (C) Copyright IBM Corporation 2004, 2005 3# All Rights Reserved. 4# 5# Permission is hereby granted, free of charge, to any person obtaining a 6# copy of this software and associated documentation files (the "Software"), 7# to deal in the Software without restriction, including without limitation 8# on the rights to use, copy, modify, merge, publish, distribute, sub 9# license, and/or sell copies of the Software, and to permit persons to whom 10# the Software is furnished to do so, subject to the following conditions: 11# 12# The above copyright notice and this permission notice (including the next 13# paragraph) shall be included in all copies or substantial portions of the 14# Software. 15# 16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22# IN THE SOFTWARE. 23# 24# Authors: 25# Ian Romanick <idr@us.ibm.com> 26 27import argparse 28 29import license 30import gl_XML 31import glX_XML 32 33 34class PrintGlProcs(gl_XML.gl_print_base): 35 def __init__(self, es=False): 36 gl_XML.gl_print_base.__init__(self) 37 38 self.es = es 39 self.name = "gl_procs.py (from Mesa)" 40 self.license = license.bsd_license_template % ( \ 41"""Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 42(C) Copyright IBM Corporation 2004, 2006""", "BRIAN PAUL, IBM") 43 44 def printRealHeader(self): 45 print """ 46/* This file is only included by glapi.c and is used for 47 * the GetProcAddress() function 48 */ 49 50typedef struct { 51 GLint Name_offset; 52#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) 53 _glapi_proc Address; 54#endif 55 GLuint Offset; 56} glprocs_table_t; 57 58#if !defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING) 59# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , o } 60#elif defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING) 61# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f1 , o } 62#elif defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING) 63# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f2 , o } 64#elif !defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING) 65# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f3 , o } 66#endif 67 68""" 69 return 70 71 def printRealFooter(self): 72 print '' 73 print '#undef NAME_FUNC_OFFSET' 74 return 75 76 def printFunctionString(self, name): 77 print ' "gl%s\\0"' % (name) 78 79 def printBody(self, api): 80 print '' 81 print 'static const char gl_string_table[] =' 82 83 base_offset = 0 84 table = [] 85 for func in api.functionIterateByOffset(): 86 name = func.dispatch_name() 87 self.printFunctionString(func.name) 88 table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.offset)) 89 90 # The length of the function's name, plus 2 for "gl", 91 # plus 1 for the NUL. 92 93 base_offset += len(func.name) + 3 94 95 96 for func in api.functionIterateByOffset(): 97 for n in func.entry_points: 98 if n != func.name: 99 name = func.dispatch_name() 100 self.printFunctionString( n ) 101 102 if func.has_different_protocol(n): 103 alt_name = "gl" + func.static_glx_name(n) 104 table.append((base_offset, "gl" + name, alt_name, alt_name, func.offset)) 105 else: 106 table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.offset)) 107 108 base_offset += len(n) + 3 109 110 111 print ' ;' 112 print '' 113 print '' 114 print "#ifdef USE_MGL_NAMESPACE" 115 for func in api.functionIterateByOffset(): 116 for n in func.entry_points: 117 if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)): 118 print '#define gl_dispatch_stub_%u mgl_dispatch_stub_%u' % (func.offset, func.offset) 119 break 120 print "#endif /* USE_MGL_NAMESPACE */" 121 print '' 122 print '' 123 print '#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)' 124 for func in api.functionIterateByOffset(): 125 for n in func.entry_points: 126 if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)): 127 print '%s GLAPIENTRY gl_dispatch_stub_%u(%s);' % (func.return_type, func.offset, func.get_parameter_string()) 128 break 129 130 if self.es: 131 categories = {} 132 for func in api.functionIterateByOffset(): 133 for n in func.entry_points: 134 cat, num = api.get_category_for_name(n) 135 if (cat.startswith("es") or cat.startswith("GL_OES")): 136 if not categories.has_key(cat): 137 categories[cat] = [] 138 proto = 'GLAPI %s GLAPIENTRY %s(%s);' \ 139 % (func.return_type, "gl" + n, func.get_parameter_string(n)) 140 categories[cat].append(proto) 141 if categories: 142 print '' 143 print '/* OpenGL ES specific prototypes */' 144 print '' 145 keys = categories.keys() 146 keys.sort() 147 for key in keys: 148 print '/* category %s */' % key 149 print "\n".join(categories[key]) 150 print '' 151 152 print '#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */' 153 154 print '' 155 print 'static const glprocs_table_t static_functions[] = {' 156 157 for info in table: 158 print ' NAME_FUNC_OFFSET(%5u, %s, %s, %s, %d),' % info 159 160 print ' NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)' 161 print '};' 162 return 163 164 165def _parser(): 166 """Parse arguments and return a namepsace.""" 167 168 parser = argparse.ArgumentParser() 169 parser.add_argument('-f', '--filename', 170 default='gl_API.xml', 171 metavar="input_file_name", 172 dest='file_name', 173 help="Path to an XML description of OpenGL API.") 174 parser.add_argument('-c', '--es-version', 175 dest='es', 176 action="store_true", 177 help="filter functions for es") 178 return parser.parse_args() 179 180 181def main(): 182 """Main function.""" 183 args = _parser() 184 api = gl_XML.parse_GL_API(args.file_name, glX_XML.glx_item_factory()) 185 PrintGlProcs(args.es).Print(api) 186 187 188if __name__ == '__main__': 189 main() 190