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 27from __future__ import print_function 28 29import argparse 30 31import license 32import gl_XML 33import glX_XML 34 35 36class PrintGlProcs(gl_XML.gl_print_base): 37 def __init__(self, es=False): 38 gl_XML.gl_print_base.__init__(self) 39 40 self.es = es 41 self.name = "gl_procs.py (from Mesa)" 42 self.license = license.bsd_license_template % ( \ 43"""Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 44(C) Copyright IBM Corporation 2004, 2006""", "BRIAN PAUL, IBM") 45 46 def printRealHeader(self): 47 print(""" 48/* This file is only included by glapi.c and is used for 49 * the GetProcAddress() function 50 */ 51 52typedef struct { 53 GLint Name_offset; 54#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) 55 _glapi_proc Address; 56#endif 57 GLuint Offset; 58} glprocs_table_t; 59 60#if !defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING) 61# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , o } 62#elif defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING) 63# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f1 , o } 64#elif defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING) 65# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f2 , o } 66#elif !defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING) 67# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f3 , o } 68#endif 69 70""") 71 return 72 73 def printRealFooter(self): 74 print('') 75 print('#undef NAME_FUNC_OFFSET') 76 return 77 78 def printFunctionString(self, name): 79 print(' "gl%s\\0"' % (name)) 80 81 def printBody(self, api): 82 print('') 83 print('static const char gl_string_table[] =') 84 85 base_offset = 0 86 table = [] 87 for func in api.functionIterateByOffset(): 88 name = func.dispatch_name() 89 self.printFunctionString(func.name) 90 table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.offset)) 91 92 # The length of the function's name, plus 2 for "gl", 93 # plus 1 for the NUL. 94 95 base_offset += len(func.name) + 3 96 97 98 for func in api.functionIterateByOffset(): 99 for n in func.entry_points: 100 if n != func.name: 101 name = func.dispatch_name() 102 self.printFunctionString( n ) 103 104 if func.has_different_protocol(n): 105 alt_name = "gl" + func.static_glx_name(n) 106 table.append((base_offset, "gl" + name, alt_name, alt_name, func.offset)) 107 else: 108 table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.offset)) 109 110 base_offset += len(n) + 3 111 112 113 print(' ;') 114 print('') 115 print('') 116 print('#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)') 117 for func in api.functionIterateByOffset(): 118 for n in func.entry_points: 119 if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)): 120 print('%s GLAPIENTRY gl_dispatch_stub_%u(%s);' % (func.return_type, func.offset, func.get_parameter_string())) 121 break 122 123 if self.es: 124 categories = {} 125 for func in api.functionIterateByOffset(): 126 for n in func.entry_points: 127 cat, num = api.get_category_for_name(n) 128 if (cat.startswith("es") or cat.startswith("GL_OES")): 129 if cat not in categories: 130 categories[cat] = [] 131 proto = 'GLAPI %s GLAPIENTRY %s(%s);' \ 132 % (func.return_type, "gl" + n, func.get_parameter_string(n)) 133 categories[cat].append(proto) 134 if categories: 135 print('') 136 print('/* OpenGL ES specific prototypes */') 137 print('') 138 keys = sorted(categories.keys()) 139 for key in keys: 140 print('/* category %s */' % key) 141 print("\n".join(categories[key])) 142 print('') 143 144 print('#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */') 145 146 print('') 147 print('static const glprocs_table_t static_functions[] = {') 148 149 for info in table: 150 print(' NAME_FUNC_OFFSET(%5u, %s, %s, %s, %d),' % info) 151 152 print(' NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)') 153 print('};') 154 return 155 156 157def _parser(): 158 """Parse arguments and return a namepsace.""" 159 160 parser = argparse.ArgumentParser() 161 parser.add_argument('-f', '--filename', 162 default='gl_API.xml', 163 metavar="input_file_name", 164 dest='file_name', 165 help="Path to an XML description of OpenGL API.") 166 parser.add_argument('-c', '--es-version', 167 dest='es', 168 action="store_true", 169 help="filter functions for es") 170 return parser.parse_args() 171 172 173def main(): 174 """Main function.""" 175 args = _parser() 176 api = gl_XML.parse_GL_API(args.file_name, glX_XML.glx_item_factory()) 177 PrintGlProcs(args.es).Print(api) 178 179 180if __name__ == '__main__': 181 main() 182