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('#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)') 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('%s GLAPIENTRY gl_dispatch_stub_%u(%s);' % (func.return_type, func.offset, func.get_parameter_string())) 119 break 120 121 if self.es: 122 categories = {} 123 for func in api.functionIterateByOffset(): 124 for n in func.entry_points: 125 cat, num = api.get_category_for_name(n) 126 if (cat.startswith("es") or cat.startswith("GL_OES")): 127 if cat not in categories: 128 categories[cat] = [] 129 proto = 'GLAPI %s GLAPIENTRY %s(%s);' \ 130 % (func.return_type, "gl" + n, func.get_parameter_string(n)) 131 categories[cat].append(proto) 132 if categories: 133 print('') 134 print('/* OpenGL ES specific prototypes */') 135 print('') 136 keys = sorted(categories.keys()) 137 for key in keys: 138 print('/* category %s */' % key) 139 print("\n".join(categories[key])) 140 print('') 141 142 print('#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */') 143 144 print('') 145 print('static const glprocs_table_t static_functions[] = {') 146 147 for info in table: 148 print(' NAME_FUNC_OFFSET(%5u, %s, %s, %s, %d),' % info) 149 150 print(' NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)') 151 print('};') 152 return 153 154 155def _parser(): 156 """Parse arguments and return a namepsace.""" 157 158 parser = argparse.ArgumentParser() 159 parser.add_argument('-f', '--filename', 160 default='gl_API.xml', 161 metavar="input_file_name", 162 dest='file_name', 163 help="Path to an XML description of OpenGL API.") 164 parser.add_argument('-c', '--es-version', 165 dest='es', 166 action="store_true", 167 help="filter functions for es") 168 return parser.parse_args() 169 170 171def main(): 172 """Main function.""" 173 args = _parser() 174 api = gl_XML.parse_GL_API(args.file_name, glX_XML.glx_item_factory()) 175 PrintGlProcs(args.es).Print(api) 176 177 178if __name__ == '__main__': 179 main() 180