1*61046927SAndroid Build Coastguard Worker 2*61046927SAndroid Build Coastguard Worker# Mesa 3-D graphics library 3*61046927SAndroid Build Coastguard Worker# 4*61046927SAndroid Build Coastguard Worker# Copyright (C) 2010 LunarG Inc. 5*61046927SAndroid Build Coastguard Worker# 6*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a 7*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"), 8*61046927SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation 9*61046927SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense, 10*61046927SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the 11*61046927SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions: 12*61046927SAndroid Build Coastguard Worker# 13*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice shall be included 14*61046927SAndroid Build Coastguard Worker# in all copies or substantial portions of the Software. 15*61046927SAndroid Build Coastguard Worker# 16*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*61046927SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*61046927SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*61046927SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*61046927SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*61046927SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22*61046927SAndroid Build Coastguard Worker# DEALINGS IN THE SOFTWARE. 23*61046927SAndroid Build Coastguard Worker# 24*61046927SAndroid Build Coastguard Worker# Authors: 25*61046927SAndroid Build Coastguard Worker# Chia-I Wu <[email protected]> 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Workerimport sys 28*61046927SAndroid Build Coastguard Worker# make it possible to import glapi 29*61046927SAndroid Build Coastguard Workerimport os 30*61046927SAndroid Build Coastguard WorkerGLAPI = os.path.join(".", os.path.dirname(__file__), "glapi", "gen") 31*61046927SAndroid Build Coastguard Workersys.path.insert(0, GLAPI) 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Workerfrom operator import attrgetter 34*61046927SAndroid Build Coastguard Workerimport re 35*61046927SAndroid Build Coastguard Workerfrom optparse import OptionParser 36*61046927SAndroid Build Coastguard Workerimport gl_XML 37*61046927SAndroid Build Coastguard Workerimport glX_XML 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker# number of dynamic entries 41*61046927SAndroid Build Coastguard WorkerABI_NUM_DYNAMIC_ENTRIES = 256 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Workerclass ABIEntry(object): 44*61046927SAndroid Build Coastguard Worker """Represent an ABI entry.""" 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker _match_c_param = re.compile( 47*61046927SAndroid Build Coastguard Worker '^(?P<type>[\w\s*]+?)(?P<name>\w+)(\[(?P<array>\d+)\])?$') 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Worker def __init__(self, cols, attrs, xml_data = None): 50*61046927SAndroid Build Coastguard Worker self._parse(cols) 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker self.slot = attrs['slot'] 53*61046927SAndroid Build Coastguard Worker self.hidden = attrs['hidden'] 54*61046927SAndroid Build Coastguard Worker self.alias = attrs['alias'] 55*61046927SAndroid Build Coastguard Worker self.handcode = attrs['handcode'] 56*61046927SAndroid Build Coastguard Worker self.xml_data = xml_data 57*61046927SAndroid Build Coastguard Worker 58*61046927SAndroid Build Coastguard Worker def c_prototype(self): 59*61046927SAndroid Build Coastguard Worker return '%s %s(%s)' % (self.c_return(), self.name, self.c_params()) 60*61046927SAndroid Build Coastguard Worker 61*61046927SAndroid Build Coastguard Worker def c_return(self): 62*61046927SAndroid Build Coastguard Worker ret = self.ret 63*61046927SAndroid Build Coastguard Worker if not ret: 64*61046927SAndroid Build Coastguard Worker ret = 'void' 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker return ret 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker def c_params(self): 69*61046927SAndroid Build Coastguard Worker """Return the parameter list used in the entry prototype.""" 70*61046927SAndroid Build Coastguard Worker c_params = [] 71*61046927SAndroid Build Coastguard Worker for t, n, a in self.params: 72*61046927SAndroid Build Coastguard Worker sep = '' if t.endswith('*') else ' ' 73*61046927SAndroid Build Coastguard Worker arr = '[%d]' % a if a else '' 74*61046927SAndroid Build Coastguard Worker c_params.append(t + sep + n + arr) 75*61046927SAndroid Build Coastguard Worker if not c_params: 76*61046927SAndroid Build Coastguard Worker c_params.append('void') 77*61046927SAndroid Build Coastguard Worker 78*61046927SAndroid Build Coastguard Worker return ", ".join(c_params) 79*61046927SAndroid Build Coastguard Worker 80*61046927SAndroid Build Coastguard Worker def c_args(self): 81*61046927SAndroid Build Coastguard Worker """Return the argument list used in the entry invocation.""" 82*61046927SAndroid Build Coastguard Worker c_args = [] 83*61046927SAndroid Build Coastguard Worker for t, n, a in self.params: 84*61046927SAndroid Build Coastguard Worker c_args.append(n) 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker return ", ".join(c_args) 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard Worker def _parse(self, cols): 89*61046927SAndroid Build Coastguard Worker ret = cols.pop(0) 90*61046927SAndroid Build Coastguard Worker if ret == 'void': 91*61046927SAndroid Build Coastguard Worker ret = None 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard Worker name = cols.pop(0) 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker params = [] 96*61046927SAndroid Build Coastguard Worker if not cols: 97*61046927SAndroid Build Coastguard Worker raise Exception(cols) 98*61046927SAndroid Build Coastguard Worker elif len(cols) == 1 and cols[0] == 'void': 99*61046927SAndroid Build Coastguard Worker pass 100*61046927SAndroid Build Coastguard Worker else: 101*61046927SAndroid Build Coastguard Worker for val in cols: 102*61046927SAndroid Build Coastguard Worker params.append(self._parse_param(val)) 103*61046927SAndroid Build Coastguard Worker 104*61046927SAndroid Build Coastguard Worker self.ret = ret 105*61046927SAndroid Build Coastguard Worker self.name = name 106*61046927SAndroid Build Coastguard Worker self.params = params 107*61046927SAndroid Build Coastguard Worker 108*61046927SAndroid Build Coastguard Worker def _parse_param(self, c_param): 109*61046927SAndroid Build Coastguard Worker m = self._match_c_param.match(c_param) 110*61046927SAndroid Build Coastguard Worker if not m: 111*61046927SAndroid Build Coastguard Worker raise Exception('unrecognized param ' + c_param) 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard Worker c_type = m.group('type').strip() 114*61046927SAndroid Build Coastguard Worker c_name = m.group('name') 115*61046927SAndroid Build Coastguard Worker c_array = m.group('array') 116*61046927SAndroid Build Coastguard Worker c_array = int(c_array) if c_array else 0 117*61046927SAndroid Build Coastguard Worker 118*61046927SAndroid Build Coastguard Worker return (c_type, c_name, c_array) 119*61046927SAndroid Build Coastguard Worker 120*61046927SAndroid Build Coastguard Worker def __str__(self): 121*61046927SAndroid Build Coastguard Worker return self.c_prototype() 122*61046927SAndroid Build Coastguard Worker 123*61046927SAndroid Build Coastguard Worker def __lt__(self, other): 124*61046927SAndroid Build Coastguard Worker # compare slot, alias, and then name 125*61046927SAndroid Build Coastguard Worker if self.slot == other.slot: 126*61046927SAndroid Build Coastguard Worker if not self.alias: 127*61046927SAndroid Build Coastguard Worker return True 128*61046927SAndroid Build Coastguard Worker elif not other.alias: 129*61046927SAndroid Build Coastguard Worker return False 130*61046927SAndroid Build Coastguard Worker 131*61046927SAndroid Build Coastguard Worker return self.name < other.name 132*61046927SAndroid Build Coastguard Worker 133*61046927SAndroid Build Coastguard Worker return self.slot < other.slot 134*61046927SAndroid Build Coastguard Worker 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard Workerdef abi_parse_xml(xml): 137*61046927SAndroid Build Coastguard Worker """Parse a GLAPI XML file for ABI entries.""" 138*61046927SAndroid Build Coastguard Worker api = gl_XML.parse_GL_API(xml, glX_XML.glx_item_factory()) 139*61046927SAndroid Build Coastguard Worker 140*61046927SAndroid Build Coastguard Worker entry_dict = {} 141*61046927SAndroid Build Coastguard Worker for func in api.functionIterateByOffset(): 142*61046927SAndroid Build Coastguard Worker # make sure func.name appear first 143*61046927SAndroid Build Coastguard Worker entry_points = func.entry_points[:] 144*61046927SAndroid Build Coastguard Worker entry_points.remove(func.name) 145*61046927SAndroid Build Coastguard Worker entry_points.insert(0, func.name) 146*61046927SAndroid Build Coastguard Worker 147*61046927SAndroid Build Coastguard Worker for name in entry_points: 148*61046927SAndroid Build Coastguard Worker attrs = { 149*61046927SAndroid Build Coastguard Worker 'slot': func.offset, 150*61046927SAndroid Build Coastguard Worker 'hidden': not func.is_static_entry_point(name), 151*61046927SAndroid Build Coastguard Worker 'alias': None if name == func.name else func.name, 152*61046927SAndroid Build Coastguard Worker 'handcode': bool(func.has_different_protocol(name)), 153*61046927SAndroid Build Coastguard Worker } 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker # post-process attrs 156*61046927SAndroid Build Coastguard Worker if attrs['alias']: 157*61046927SAndroid Build Coastguard Worker try: 158*61046927SAndroid Build Coastguard Worker alias = entry_dict[attrs['alias']] 159*61046927SAndroid Build Coastguard Worker except KeyError: 160*61046927SAndroid Build Coastguard Worker raise Exception('failed to alias %s' % attrs['alias']) 161*61046927SAndroid Build Coastguard Worker if alias.alias: 162*61046927SAndroid Build Coastguard Worker raise Exception('recursive alias %s' % ent.name) 163*61046927SAndroid Build Coastguard Worker attrs['alias'] = alias 164*61046927SAndroid Build Coastguard Worker if attrs['handcode']: 165*61046927SAndroid Build Coastguard Worker attrs['handcode'] = func.static_glx_name(name) 166*61046927SAndroid Build Coastguard Worker else: 167*61046927SAndroid Build Coastguard Worker attrs['handcode'] = None 168*61046927SAndroid Build Coastguard Worker 169*61046927SAndroid Build Coastguard Worker if name in entry_dict: 170*61046927SAndroid Build Coastguard Worker raise Exception('%s is duplicated' % (name)) 171*61046927SAndroid Build Coastguard Worker 172*61046927SAndroid Build Coastguard Worker cols = [] 173*61046927SAndroid Build Coastguard Worker cols.append(func.return_type) 174*61046927SAndroid Build Coastguard Worker cols.append(name) 175*61046927SAndroid Build Coastguard Worker params = func.get_parameter_string(name) 176*61046927SAndroid Build Coastguard Worker cols.extend([p.strip() for p in params.split(',')]) 177*61046927SAndroid Build Coastguard Worker 178*61046927SAndroid Build Coastguard Worker ent = ABIEntry(cols, attrs, func) 179*61046927SAndroid Build Coastguard Worker entry_dict[ent.name] = ent 180*61046927SAndroid Build Coastguard Worker 181*61046927SAndroid Build Coastguard Worker entries = sorted(entry_dict.values()) 182*61046927SAndroid Build Coastguard Worker 183*61046927SAndroid Build Coastguard Worker return entries 184*61046927SAndroid Build Coastguard Worker 185*61046927SAndroid Build Coastguard Workerdef abi_sanity_check(entries): 186*61046927SAndroid Build Coastguard Worker if not entries: 187*61046927SAndroid Build Coastguard Worker return 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Worker all_names = [] 190*61046927SAndroid Build Coastguard Worker last_slot = entries[-1].slot 191*61046927SAndroid Build Coastguard Worker i = 0 192*61046927SAndroid Build Coastguard Worker for slot in range(last_slot + 1): 193*61046927SAndroid Build Coastguard Worker if entries[i].slot != slot: 194*61046927SAndroid Build Coastguard Worker raise Exception('entries are not ordered by slots') 195*61046927SAndroid Build Coastguard Worker if entries[i].alias: 196*61046927SAndroid Build Coastguard Worker raise Exception('first entry of slot %d aliases %s' 197*61046927SAndroid Build Coastguard Worker % (slot, entries[i].alias.name)) 198*61046927SAndroid Build Coastguard Worker handcode = None 199*61046927SAndroid Build Coastguard Worker while i < len(entries) and entries[i].slot == slot: 200*61046927SAndroid Build Coastguard Worker ent = entries[i] 201*61046927SAndroid Build Coastguard Worker if not handcode and ent.handcode: 202*61046927SAndroid Build Coastguard Worker handcode = ent.handcode 203*61046927SAndroid Build Coastguard Worker elif ent.handcode != handcode: 204*61046927SAndroid Build Coastguard Worker raise Exception('two aliases with handcode %s != %s', 205*61046927SAndroid Build Coastguard Worker ent.handcode, handcode) 206*61046927SAndroid Build Coastguard Worker 207*61046927SAndroid Build Coastguard Worker if ent.name in all_names: 208*61046927SAndroid Build Coastguard Worker raise Exception('%s is duplicated' % (ent.name)) 209*61046927SAndroid Build Coastguard Worker if ent.alias and ent.alias.name not in all_names: 210*61046927SAndroid Build Coastguard Worker raise Exception('failed to alias %s' % (ent.alias.name)) 211*61046927SAndroid Build Coastguard Worker all_names.append(ent.name) 212*61046927SAndroid Build Coastguard Worker i += 1 213*61046927SAndroid Build Coastguard Worker if i < len(entries): 214*61046927SAndroid Build Coastguard Worker raise Exception('there are %d invalid entries' % (len(entries) - 1)) 215*61046927SAndroid Build Coastguard Worker 216*61046927SAndroid Build Coastguard Workerclass ABIPrinter(object): 217*61046927SAndroid Build Coastguard Worker """MAPI Printer""" 218*61046927SAndroid Build Coastguard Worker 219*61046927SAndroid Build Coastguard Worker def __init__(self, entries): 220*61046927SAndroid Build Coastguard Worker self.entries = entries 221*61046927SAndroid Build Coastguard Worker 222*61046927SAndroid Build Coastguard Worker # sort entries by their names 223*61046927SAndroid Build Coastguard Worker self.entries_sorted_by_names = sorted(self.entries, key=attrgetter('name')) 224*61046927SAndroid Build Coastguard Worker 225*61046927SAndroid Build Coastguard Worker self.indent = ' ' * 3 226*61046927SAndroid Build Coastguard Worker self.noop_warn = 'noop_warn' 227*61046927SAndroid Build Coastguard Worker self.noop_generic = 'noop_generic' 228*61046927SAndroid Build Coastguard Worker self.current_get = 'entry_current_get' 229*61046927SAndroid Build Coastguard Worker 230*61046927SAndroid Build Coastguard Worker self.api_defines = [] 231*61046927SAndroid Build Coastguard Worker self.api_headers = ['"KHR/khrplatform.h"'] 232*61046927SAndroid Build Coastguard Worker self.api_call = 'KHRONOS_APICALL' 233*61046927SAndroid Build Coastguard Worker self.api_entry = 'KHRONOS_APIENTRY' 234*61046927SAndroid Build Coastguard Worker self.api_attrs = 'KHRONOS_APIATTRIBUTES' 235*61046927SAndroid Build Coastguard Worker 236*61046927SAndroid Build Coastguard Worker self.c_header = '' 237*61046927SAndroid Build Coastguard Worker 238*61046927SAndroid Build Coastguard Worker self.lib_need_table_size = True 239*61046927SAndroid Build Coastguard Worker self.lib_need_noop_array = True 240*61046927SAndroid Build Coastguard Worker self.lib_need_stubs = True 241*61046927SAndroid Build Coastguard Worker self.lib_need_all_entries = True 242*61046927SAndroid Build Coastguard Worker self.lib_need_non_hidden_entries = False 243*61046927SAndroid Build Coastguard Worker 244*61046927SAndroid Build Coastguard Worker def c_notice(self): 245*61046927SAndroid Build Coastguard Worker return '/* This file is automatically generated by mapi_abi.py. Do not modify. */' 246*61046927SAndroid Build Coastguard Worker 247*61046927SAndroid Build Coastguard Worker def c_public_includes(self): 248*61046927SAndroid Build Coastguard Worker """Return includes of the client API headers.""" 249*61046927SAndroid Build Coastguard Worker defines = ['#define ' + d for d in self.api_defines] 250*61046927SAndroid Build Coastguard Worker includes = ['#include ' + h for h in self.api_headers] 251*61046927SAndroid Build Coastguard Worker return "\n".join(defines + includes) 252*61046927SAndroid Build Coastguard Worker 253*61046927SAndroid Build Coastguard Worker def need_entry_point(self, ent): 254*61046927SAndroid Build Coastguard Worker """Return True if an entry point is needed for the entry.""" 255*61046927SAndroid Build Coastguard Worker # non-handcode hidden aliases may share the entry they alias 256*61046927SAndroid Build Coastguard Worker use_alias = (ent.hidden and ent.alias and not ent.handcode) 257*61046927SAndroid Build Coastguard Worker return not use_alias 258*61046927SAndroid Build Coastguard Worker 259*61046927SAndroid Build Coastguard Worker def c_public_declarations(self, prefix): 260*61046927SAndroid Build Coastguard Worker """Return the declarations of public entry points.""" 261*61046927SAndroid Build Coastguard Worker decls = [] 262*61046927SAndroid Build Coastguard Worker for ent in self.entries: 263*61046927SAndroid Build Coastguard Worker if not self.need_entry_point(ent): 264*61046927SAndroid Build Coastguard Worker continue 265*61046927SAndroid Build Coastguard Worker export = self.api_call if not ent.hidden else '' 266*61046927SAndroid Build Coastguard Worker if not ent.hidden or not self.lib_need_non_hidden_entries: 267*61046927SAndroid Build Coastguard Worker decls.append(self._c_decl(ent, prefix, True, export) + ';') 268*61046927SAndroid Build Coastguard Worker 269*61046927SAndroid Build Coastguard Worker return "\n".join(decls) 270*61046927SAndroid Build Coastguard Worker 271*61046927SAndroid Build Coastguard Worker def c_mapi_table(self): 272*61046927SAndroid Build Coastguard Worker """Return defines of the dispatch table size.""" 273*61046927SAndroid Build Coastguard Worker num_static_entries = self.entries[-1].slot + 1 274*61046927SAndroid Build Coastguard Worker return ('#define MAPI_TABLE_NUM_STATIC %d\n' + \ 275*61046927SAndroid Build Coastguard Worker '#define MAPI_TABLE_NUM_DYNAMIC %d') % ( 276*61046927SAndroid Build Coastguard Worker num_static_entries, ABI_NUM_DYNAMIC_ENTRIES) 277*61046927SAndroid Build Coastguard Worker 278*61046927SAndroid Build Coastguard Worker def _c_function(self, ent, prefix, mangle=False, stringify=False): 279*61046927SAndroid Build Coastguard Worker """Return the function name of an entry.""" 280*61046927SAndroid Build Coastguard Worker formats = { 281*61046927SAndroid Build Coastguard Worker True: { True: '%s_STR(%s)', False: '%s(%s)' }, 282*61046927SAndroid Build Coastguard Worker False: { True: '"%s%s"', False: '%s%s' }, 283*61046927SAndroid Build Coastguard Worker } 284*61046927SAndroid Build Coastguard Worker fmt = formats[prefix.isupper()][stringify] 285*61046927SAndroid Build Coastguard Worker name = ent.name 286*61046927SAndroid Build Coastguard Worker if mangle and ent.hidden: 287*61046927SAndroid Build Coastguard Worker name = '_dispatch_stub_' + str(ent.slot) 288*61046927SAndroid Build Coastguard Worker return fmt % (prefix, name) 289*61046927SAndroid Build Coastguard Worker 290*61046927SAndroid Build Coastguard Worker def _c_function_call(self, ent, prefix): 291*61046927SAndroid Build Coastguard Worker """Return the function name used for calling.""" 292*61046927SAndroid Build Coastguard Worker if ent.handcode: 293*61046927SAndroid Build Coastguard Worker # _c_function does not handle this case 294*61046927SAndroid Build Coastguard Worker formats = { True: '%s(%s)', False: '%s%s' } 295*61046927SAndroid Build Coastguard Worker fmt = formats[prefix.isupper()] 296*61046927SAndroid Build Coastguard Worker name = fmt % (prefix, ent.handcode) 297*61046927SAndroid Build Coastguard Worker elif self.need_entry_point(ent): 298*61046927SAndroid Build Coastguard Worker name = self._c_function(ent, prefix, True) 299*61046927SAndroid Build Coastguard Worker else: 300*61046927SAndroid Build Coastguard Worker name = self._c_function(ent.alias, prefix, True) 301*61046927SAndroid Build Coastguard Worker return name 302*61046927SAndroid Build Coastguard Worker 303*61046927SAndroid Build Coastguard Worker def _c_decl(self, ent, prefix, mangle=False, export=''): 304*61046927SAndroid Build Coastguard Worker """Return the C declaration for the entry.""" 305*61046927SAndroid Build Coastguard Worker decl = '%s %s %s(%s)' % (ent.c_return(), self.api_entry, 306*61046927SAndroid Build Coastguard Worker self._c_function(ent, prefix, mangle), ent.c_params()) 307*61046927SAndroid Build Coastguard Worker if export: 308*61046927SAndroid Build Coastguard Worker decl = export + ' ' + decl 309*61046927SAndroid Build Coastguard Worker if self.api_attrs: 310*61046927SAndroid Build Coastguard Worker decl += ' ' + self.api_attrs 311*61046927SAndroid Build Coastguard Worker 312*61046927SAndroid Build Coastguard Worker return decl 313*61046927SAndroid Build Coastguard Worker 314*61046927SAndroid Build Coastguard Worker def _c_cast(self, ent): 315*61046927SAndroid Build Coastguard Worker """Return the C cast for the entry.""" 316*61046927SAndroid Build Coastguard Worker cast = '%s (%s *)(%s)' % ( 317*61046927SAndroid Build Coastguard Worker ent.c_return(), self.api_entry, ent.c_params()) 318*61046927SAndroid Build Coastguard Worker 319*61046927SAndroid Build Coastguard Worker return cast 320*61046927SAndroid Build Coastguard Worker 321*61046927SAndroid Build Coastguard Worker def c_public_dispatches(self, prefix, no_hidden): 322*61046927SAndroid Build Coastguard Worker """Return the public dispatch functions.""" 323*61046927SAndroid Build Coastguard Worker dispatches = [] 324*61046927SAndroid Build Coastguard Worker for ent in self.entries: 325*61046927SAndroid Build Coastguard Worker if ent.hidden and no_hidden: 326*61046927SAndroid Build Coastguard Worker continue 327*61046927SAndroid Build Coastguard Worker 328*61046927SAndroid Build Coastguard Worker if not self.need_entry_point(ent): 329*61046927SAndroid Build Coastguard Worker continue 330*61046927SAndroid Build Coastguard Worker 331*61046927SAndroid Build Coastguard Worker export = self.api_call if not ent.hidden else '' 332*61046927SAndroid Build Coastguard Worker 333*61046927SAndroid Build Coastguard Worker proto = self._c_decl(ent, prefix, True, export) 334*61046927SAndroid Build Coastguard Worker cast = self._c_cast(ent) 335*61046927SAndroid Build Coastguard Worker 336*61046927SAndroid Build Coastguard Worker ret = '' 337*61046927SAndroid Build Coastguard Worker if ent.ret: 338*61046927SAndroid Build Coastguard Worker ret = 'return ' 339*61046927SAndroid Build Coastguard Worker stmt1 = self.indent 340*61046927SAndroid Build Coastguard Worker stmt1 += 'const struct _glapi_table *_tbl = %s();' % ( 341*61046927SAndroid Build Coastguard Worker self.current_get) 342*61046927SAndroid Build Coastguard Worker stmt2 = self.indent 343*61046927SAndroid Build Coastguard Worker stmt2 += 'mapi_func _func = ((const mapi_func *) _tbl)[%d];' % ( 344*61046927SAndroid Build Coastguard Worker ent.slot) 345*61046927SAndroid Build Coastguard Worker stmt3 = self.indent 346*61046927SAndroid Build Coastguard Worker stmt3 += '%s((%s) _func)(%s);' % (ret, cast, ent.c_args()) 347*61046927SAndroid Build Coastguard Worker 348*61046927SAndroid Build Coastguard Worker disp = '%s\n{\n%s\n%s\n%s\n}' % (proto, stmt1, stmt2, stmt3) 349*61046927SAndroid Build Coastguard Worker 350*61046927SAndroid Build Coastguard Worker if ent.handcode: 351*61046927SAndroid Build Coastguard Worker disp = '#if 0\n' + disp + '\n#endif' 352*61046927SAndroid Build Coastguard Worker 353*61046927SAndroid Build Coastguard Worker dispatches.append(disp) 354*61046927SAndroid Build Coastguard Worker 355*61046927SAndroid Build Coastguard Worker return '\n\n'.join(dispatches) 356*61046927SAndroid Build Coastguard Worker 357*61046927SAndroid Build Coastguard Worker def c_public_initializer(self, prefix): 358*61046927SAndroid Build Coastguard Worker """Return the initializer for public dispatch functions.""" 359*61046927SAndroid Build Coastguard Worker names = [] 360*61046927SAndroid Build Coastguard Worker for ent in self.entries: 361*61046927SAndroid Build Coastguard Worker if ent.alias: 362*61046927SAndroid Build Coastguard Worker continue 363*61046927SAndroid Build Coastguard Worker 364*61046927SAndroid Build Coastguard Worker name = '%s(mapi_func) %s' % (self.indent, 365*61046927SAndroid Build Coastguard Worker self._c_function_call(ent, prefix)) 366*61046927SAndroid Build Coastguard Worker names.append(name) 367*61046927SAndroid Build Coastguard Worker 368*61046927SAndroid Build Coastguard Worker return ',\n'.join(names) 369*61046927SAndroid Build Coastguard Worker 370*61046927SAndroid Build Coastguard Worker def c_stub_string_pool(self): 371*61046927SAndroid Build Coastguard Worker """Return the string pool for use by stubs.""" 372*61046927SAndroid Build Coastguard Worker # sort entries by their names 373*61046927SAndroid Build Coastguard Worker sorted_entries = sorted(self.entries, key=attrgetter('name')) 374*61046927SAndroid Build Coastguard Worker 375*61046927SAndroid Build Coastguard Worker pool = [] 376*61046927SAndroid Build Coastguard Worker offsets = {} 377*61046927SAndroid Build Coastguard Worker count = 0 378*61046927SAndroid Build Coastguard Worker for ent in sorted_entries: 379*61046927SAndroid Build Coastguard Worker offsets[ent] = count 380*61046927SAndroid Build Coastguard Worker pool.append('%s' % (ent.name)) 381*61046927SAndroid Build Coastguard Worker count += len(ent.name) + 1 382*61046927SAndroid Build Coastguard Worker 383*61046927SAndroid Build Coastguard Worker pool_str = self.indent + '"' + \ 384*61046927SAndroid Build Coastguard Worker ('\\0"\n' + self.indent + '"').join(pool) + '";' 385*61046927SAndroid Build Coastguard Worker return (pool_str, offsets) 386*61046927SAndroid Build Coastguard Worker 387*61046927SAndroid Build Coastguard Worker def c_stub_initializer(self, prefix, pool_offsets): 388*61046927SAndroid Build Coastguard Worker """Return the initializer for struct mapi_stub array.""" 389*61046927SAndroid Build Coastguard Worker stubs = [] 390*61046927SAndroid Build Coastguard Worker for ent in self.entries_sorted_by_names: 391*61046927SAndroid Build Coastguard Worker stubs.append('%s{ %d, %d }' % ( 392*61046927SAndroid Build Coastguard Worker self.indent, pool_offsets[ent], ent.slot)) 393*61046927SAndroid Build Coastguard Worker 394*61046927SAndroid Build Coastguard Worker return ',\n'.join(stubs) 395*61046927SAndroid Build Coastguard Worker 396*61046927SAndroid Build Coastguard Worker def c_noop_functions(self, prefix, warn_prefix): 397*61046927SAndroid Build Coastguard Worker """Return the noop functions.""" 398*61046927SAndroid Build Coastguard Worker noops = [] 399*61046927SAndroid Build Coastguard Worker for ent in self.entries: 400*61046927SAndroid Build Coastguard Worker if ent.alias: 401*61046927SAndroid Build Coastguard Worker continue 402*61046927SAndroid Build Coastguard Worker 403*61046927SAndroid Build Coastguard Worker proto = self._c_decl(ent, prefix, False, 'static') 404*61046927SAndroid Build Coastguard Worker 405*61046927SAndroid Build Coastguard Worker stmt1 = self.indent; 406*61046927SAndroid Build Coastguard Worker space = '' 407*61046927SAndroid Build Coastguard Worker for t, n, a in ent.params: 408*61046927SAndroid Build Coastguard Worker stmt1 += "%s(void) %s;" % (space, n) 409*61046927SAndroid Build Coastguard Worker space = ' ' 410*61046927SAndroid Build Coastguard Worker 411*61046927SAndroid Build Coastguard Worker if ent.params: 412*61046927SAndroid Build Coastguard Worker stmt1 += '\n'; 413*61046927SAndroid Build Coastguard Worker 414*61046927SAndroid Build Coastguard Worker stmt1 += self.indent + '%s(%s);' % (self.noop_warn, 415*61046927SAndroid Build Coastguard Worker self._c_function(ent, warn_prefix, False, True)) 416*61046927SAndroid Build Coastguard Worker 417*61046927SAndroid Build Coastguard Worker if ent.ret: 418*61046927SAndroid Build Coastguard Worker stmt2 = self.indent + 'return (%s) 0;' % (ent.ret) 419*61046927SAndroid Build Coastguard Worker noop = '%s\n{\n%s\n%s\n}' % (proto, stmt1, stmt2) 420*61046927SAndroid Build Coastguard Worker else: 421*61046927SAndroid Build Coastguard Worker noop = '%s\n{\n%s\n}' % (proto, stmt1) 422*61046927SAndroid Build Coastguard Worker 423*61046927SAndroid Build Coastguard Worker noops.append(noop) 424*61046927SAndroid Build Coastguard Worker 425*61046927SAndroid Build Coastguard Worker return '\n\n'.join(noops) 426*61046927SAndroid Build Coastguard Worker 427*61046927SAndroid Build Coastguard Worker def c_noop_initializer(self, prefix, use_generic): 428*61046927SAndroid Build Coastguard Worker """Return an initializer for the noop dispatch table.""" 429*61046927SAndroid Build Coastguard Worker entries = [self._c_function(ent, prefix) 430*61046927SAndroid Build Coastguard Worker for ent in self.entries if not ent.alias] 431*61046927SAndroid Build Coastguard Worker if use_generic: 432*61046927SAndroid Build Coastguard Worker entries = [self.noop_generic] * len(entries) 433*61046927SAndroid Build Coastguard Worker 434*61046927SAndroid Build Coastguard Worker entries.extend([self.noop_generic] * ABI_NUM_DYNAMIC_ENTRIES) 435*61046927SAndroid Build Coastguard Worker 436*61046927SAndroid Build Coastguard Worker pre = self.indent + '(mapi_func) ' 437*61046927SAndroid Build Coastguard Worker return pre + (',\n' + pre).join(entries) 438*61046927SAndroid Build Coastguard Worker 439*61046927SAndroid Build Coastguard Worker def c_asm_gcc(self, prefix, no_hidden): 440*61046927SAndroid Build Coastguard Worker asm = [] 441*61046927SAndroid Build Coastguard Worker 442*61046927SAndroid Build Coastguard Worker for ent in self.entries: 443*61046927SAndroid Build Coastguard Worker if ent.hidden and no_hidden: 444*61046927SAndroid Build Coastguard Worker continue 445*61046927SAndroid Build Coastguard Worker 446*61046927SAndroid Build Coastguard Worker if not self.need_entry_point(ent): 447*61046927SAndroid Build Coastguard Worker continue 448*61046927SAndroid Build Coastguard Worker 449*61046927SAndroid Build Coastguard Worker name = self._c_function(ent, prefix, True, True) 450*61046927SAndroid Build Coastguard Worker 451*61046927SAndroid Build Coastguard Worker if ent.handcode: 452*61046927SAndroid Build Coastguard Worker asm.append('#if 0') 453*61046927SAndroid Build Coastguard Worker 454*61046927SAndroid Build Coastguard Worker if ent.hidden: 455*61046927SAndroid Build Coastguard Worker asm.append('".hidden "%s"\\n"' % (name)) 456*61046927SAndroid Build Coastguard Worker 457*61046927SAndroid Build Coastguard Worker if ent.alias and not (ent.alias.hidden and no_hidden): 458*61046927SAndroid Build Coastguard Worker asm.append('".globl "%s"\\n"' % (name)) 459*61046927SAndroid Build Coastguard Worker asm.append('".set "%s", "%s"\\n"' % (name, 460*61046927SAndroid Build Coastguard Worker self._c_function(ent.alias, prefix, True, True))) 461*61046927SAndroid Build Coastguard Worker else: 462*61046927SAndroid Build Coastguard Worker asm.append('STUB_ASM_ENTRY(%s)"\\n"' % (name)) 463*61046927SAndroid Build Coastguard Worker asm.append('"\\t"STUB_ASM_CODE("%d")"\\n"' % (ent.slot)) 464*61046927SAndroid Build Coastguard Worker 465*61046927SAndroid Build Coastguard Worker if ent.handcode: 466*61046927SAndroid Build Coastguard Worker asm.append('#endif') 467*61046927SAndroid Build Coastguard Worker asm.append('') 468*61046927SAndroid Build Coastguard Worker 469*61046927SAndroid Build Coastguard Worker return "\n".join(asm) 470*61046927SAndroid Build Coastguard Worker 471*61046927SAndroid Build Coastguard Worker def output_for_lib(self): 472*61046927SAndroid Build Coastguard Worker print(self.c_notice()) 473*61046927SAndroid Build Coastguard Worker 474*61046927SAndroid Build Coastguard Worker if self.c_header: 475*61046927SAndroid Build Coastguard Worker print() 476*61046927SAndroid Build Coastguard Worker print(self.c_header) 477*61046927SAndroid Build Coastguard Worker 478*61046927SAndroid Build Coastguard Worker print() 479*61046927SAndroid Build Coastguard Worker print('#ifdef MAPI_TMP_DEFINES') 480*61046927SAndroid Build Coastguard Worker print(self.c_public_includes()) 481*61046927SAndroid Build Coastguard Worker print() 482*61046927SAndroid Build Coastguard Worker print('#if defined(_WIN32) && defined(_WINDOWS_)') 483*61046927SAndroid Build Coastguard Worker print('#error "Should not include <windows.h> here"') 484*61046927SAndroid Build Coastguard Worker print('#endif') 485*61046927SAndroid Build Coastguard Worker print() 486*61046927SAndroid Build Coastguard Worker print(self.c_public_declarations(self.prefix_lib)) 487*61046927SAndroid Build Coastguard Worker print('#undef MAPI_TMP_DEFINES') 488*61046927SAndroid Build Coastguard Worker print('#endif /* MAPI_TMP_DEFINES */') 489*61046927SAndroid Build Coastguard Worker 490*61046927SAndroid Build Coastguard Worker if self.lib_need_table_size: 491*61046927SAndroid Build Coastguard Worker print() 492*61046927SAndroid Build Coastguard Worker print('#ifdef MAPI_TMP_TABLE') 493*61046927SAndroid Build Coastguard Worker print(self.c_mapi_table()) 494*61046927SAndroid Build Coastguard Worker print('#undef MAPI_TMP_TABLE') 495*61046927SAndroid Build Coastguard Worker print('#endif /* MAPI_TMP_TABLE */') 496*61046927SAndroid Build Coastguard Worker 497*61046927SAndroid Build Coastguard Worker if self.lib_need_noop_array: 498*61046927SAndroid Build Coastguard Worker print() 499*61046927SAndroid Build Coastguard Worker print('#ifdef MAPI_TMP_NOOP_ARRAY') 500*61046927SAndroid Build Coastguard Worker print('#if MESA_DEBUG') 501*61046927SAndroid Build Coastguard Worker print() 502*61046927SAndroid Build Coastguard Worker print(self.c_noop_functions(self.prefix_noop, self.prefix_warn)) 503*61046927SAndroid Build Coastguard Worker print() 504*61046927SAndroid Build Coastguard Worker print('const mapi_func table_%s_array[] = {' % (self.prefix_noop)) 505*61046927SAndroid Build Coastguard Worker print(self.c_noop_initializer(self.prefix_noop, False)) 506*61046927SAndroid Build Coastguard Worker print('};') 507*61046927SAndroid Build Coastguard Worker print() 508*61046927SAndroid Build Coastguard Worker print('#else /* !MESA_DEBUG */') 509*61046927SAndroid Build Coastguard Worker print() 510*61046927SAndroid Build Coastguard Worker print('const mapi_func table_%s_array[] = {' % (self.prefix_noop)) 511*61046927SAndroid Build Coastguard Worker print(self.c_noop_initializer(self.prefix_noop, True)) 512*61046927SAndroid Build Coastguard Worker print('};') 513*61046927SAndroid Build Coastguard Worker print() 514*61046927SAndroid Build Coastguard Worker print('#endif /* MESA_DEBUG */') 515*61046927SAndroid Build Coastguard Worker print('#undef MAPI_TMP_NOOP_ARRAY') 516*61046927SAndroid Build Coastguard Worker print('#endif /* MAPI_TMP_NOOP_ARRAY */') 517*61046927SAndroid Build Coastguard Worker 518*61046927SAndroid Build Coastguard Worker if self.lib_need_stubs: 519*61046927SAndroid Build Coastguard Worker pool, pool_offsets = self.c_stub_string_pool() 520*61046927SAndroid Build Coastguard Worker print() 521*61046927SAndroid Build Coastguard Worker print('#ifdef MAPI_TMP_PUBLIC_STUBS') 522*61046927SAndroid Build Coastguard Worker print('static const char public_string_pool[] =') 523*61046927SAndroid Build Coastguard Worker print(pool) 524*61046927SAndroid Build Coastguard Worker print() 525*61046927SAndroid Build Coastguard Worker print('static const struct mapi_stub public_stubs[] = {') 526*61046927SAndroid Build Coastguard Worker print(self.c_stub_initializer(self.prefix_lib, pool_offsets)) 527*61046927SAndroid Build Coastguard Worker print('};') 528*61046927SAndroid Build Coastguard Worker print('#undef MAPI_TMP_PUBLIC_STUBS') 529*61046927SAndroid Build Coastguard Worker print('#endif /* MAPI_TMP_PUBLIC_STUBS */') 530*61046927SAndroid Build Coastguard Worker 531*61046927SAndroid Build Coastguard Worker if self.lib_need_all_entries: 532*61046927SAndroid Build Coastguard Worker print() 533*61046927SAndroid Build Coastguard Worker print('#ifdef MAPI_TMP_PUBLIC_ENTRIES') 534*61046927SAndroid Build Coastguard Worker print(self.c_public_dispatches(self.prefix_lib, False)) 535*61046927SAndroid Build Coastguard Worker print() 536*61046927SAndroid Build Coastguard Worker print('static const mapi_func public_entries[] = {') 537*61046927SAndroid Build Coastguard Worker print(self.c_public_initializer(self.prefix_lib)) 538*61046927SAndroid Build Coastguard Worker print('};') 539*61046927SAndroid Build Coastguard Worker print('#undef MAPI_TMP_PUBLIC_ENTRIES') 540*61046927SAndroid Build Coastguard Worker print('#endif /* MAPI_TMP_PUBLIC_ENTRIES */') 541*61046927SAndroid Build Coastguard Worker 542*61046927SAndroid Build Coastguard Worker print() 543*61046927SAndroid Build Coastguard Worker print('#ifdef MAPI_TMP_STUB_ASM_GCC') 544*61046927SAndroid Build Coastguard Worker print('__asm__(') 545*61046927SAndroid Build Coastguard Worker print(self.c_asm_gcc(self.prefix_lib, False)) 546*61046927SAndroid Build Coastguard Worker print(');') 547*61046927SAndroid Build Coastguard Worker print('#undef MAPI_TMP_STUB_ASM_GCC') 548*61046927SAndroid Build Coastguard Worker print('#endif /* MAPI_TMP_STUB_ASM_GCC */') 549*61046927SAndroid Build Coastguard Worker 550*61046927SAndroid Build Coastguard Worker if self.lib_need_non_hidden_entries: 551*61046927SAndroid Build Coastguard Worker all_hidden = True 552*61046927SAndroid Build Coastguard Worker for ent in self.entries: 553*61046927SAndroid Build Coastguard Worker if not ent.hidden: 554*61046927SAndroid Build Coastguard Worker all_hidden = False 555*61046927SAndroid Build Coastguard Worker break 556*61046927SAndroid Build Coastguard Worker if not all_hidden: 557*61046927SAndroid Build Coastguard Worker print() 558*61046927SAndroid Build Coastguard Worker print('#ifdef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN') 559*61046927SAndroid Build Coastguard Worker print(self.c_public_dispatches(self.prefix_lib, True)) 560*61046927SAndroid Build Coastguard Worker print() 561*61046927SAndroid Build Coastguard Worker print('/* does not need public_entries */') 562*61046927SAndroid Build Coastguard Worker print('#undef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN') 563*61046927SAndroid Build Coastguard Worker print('#endif /* MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN */') 564*61046927SAndroid Build Coastguard Worker 565*61046927SAndroid Build Coastguard Worker print() 566*61046927SAndroid Build Coastguard Worker print('#ifdef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN') 567*61046927SAndroid Build Coastguard Worker print('__asm__(') 568*61046927SAndroid Build Coastguard Worker print(self.c_asm_gcc(self.prefix_lib, True)) 569*61046927SAndroid Build Coastguard Worker print(');') 570*61046927SAndroid Build Coastguard Worker print('#undef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN') 571*61046927SAndroid Build Coastguard Worker print('#endif /* MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN */') 572*61046927SAndroid Build Coastguard Worker 573*61046927SAndroid Build Coastguard Workerclass GLAPIPrinter(ABIPrinter): 574*61046927SAndroid Build Coastguard Worker """OpenGL API Printer""" 575*61046927SAndroid Build Coastguard Worker 576*61046927SAndroid Build Coastguard Worker def __init__(self, entries): 577*61046927SAndroid Build Coastguard Worker for ent in entries: 578*61046927SAndroid Build Coastguard Worker self._override_for_api(ent) 579*61046927SAndroid Build Coastguard Worker super(GLAPIPrinter, self).__init__(entries) 580*61046927SAndroid Build Coastguard Worker 581*61046927SAndroid Build Coastguard Worker self.api_defines = [] 582*61046927SAndroid Build Coastguard Worker self.api_headers = [] 583*61046927SAndroid Build Coastguard Worker self.api_call = 'GLAPI' 584*61046927SAndroid Build Coastguard Worker self.api_entry = 'GLAPIENTRY' 585*61046927SAndroid Build Coastguard Worker self.api_attrs = '' 586*61046927SAndroid Build Coastguard Worker 587*61046927SAndroid Build Coastguard Worker self.lib_need_table_size = False 588*61046927SAndroid Build Coastguard Worker self.lib_need_noop_array = False 589*61046927SAndroid Build Coastguard Worker self.lib_need_stubs = False 590*61046927SAndroid Build Coastguard Worker self.lib_need_all_entries = False 591*61046927SAndroid Build Coastguard Worker self.lib_need_non_hidden_entries = True 592*61046927SAndroid Build Coastguard Worker 593*61046927SAndroid Build Coastguard Worker self.prefix_lib = 'GLAPI_PREFIX' 594*61046927SAndroid Build Coastguard Worker self.prefix_noop = 'noop' 595*61046927SAndroid Build Coastguard Worker self.prefix_warn = self.prefix_lib 596*61046927SAndroid Build Coastguard Worker 597*61046927SAndroid Build Coastguard Worker self.c_header = self._get_c_header() 598*61046927SAndroid Build Coastguard Worker 599*61046927SAndroid Build Coastguard Worker def _override_for_api(self, ent): 600*61046927SAndroid Build Coastguard Worker """Override attributes of an entry if necessary for this 601*61046927SAndroid Build Coastguard Worker printer.""" 602*61046927SAndroid Build Coastguard Worker # By default, no override is necessary. 603*61046927SAndroid Build Coastguard Worker pass 604*61046927SAndroid Build Coastguard Worker 605*61046927SAndroid Build Coastguard Worker def _get_c_header(self): 606*61046927SAndroid Build Coastguard Worker header = """#ifndef _GLAPI_TMP_H_ 607*61046927SAndroid Build Coastguard Worker#define _GLAPI_TMP_H_ 608*61046927SAndroid Build Coastguard Worker#define GLAPI_PREFIX(func) gl##func 609*61046927SAndroid Build Coastguard Worker#define GLAPI_PREFIX_STR(func) "gl"#func 610*61046927SAndroid Build Coastguard Worker 611*61046927SAndroid Build Coastguard Worker#include "util/glheader.h" 612*61046927SAndroid Build Coastguard Worker#endif /* _GLAPI_TMP_H_ */""" 613*61046927SAndroid Build Coastguard Worker 614*61046927SAndroid Build Coastguard Worker return header 615*61046927SAndroid Build Coastguard Worker 616*61046927SAndroid Build Coastguard Workerclass SharedGLAPIPrinter(GLAPIPrinter): 617*61046927SAndroid Build Coastguard Worker """Shared GLAPI API Printer""" 618*61046927SAndroid Build Coastguard Worker 619*61046927SAndroid Build Coastguard Worker def __init__(self, entries): 620*61046927SAndroid Build Coastguard Worker super(SharedGLAPIPrinter, self).__init__(entries) 621*61046927SAndroid Build Coastguard Worker 622*61046927SAndroid Build Coastguard Worker self.lib_need_table_size = True 623*61046927SAndroid Build Coastguard Worker self.lib_need_noop_array = True 624*61046927SAndroid Build Coastguard Worker self.lib_need_stubs = True 625*61046927SAndroid Build Coastguard Worker self.lib_need_all_entries = True 626*61046927SAndroid Build Coastguard Worker self.lib_need_non_hidden_entries = False 627*61046927SAndroid Build Coastguard Worker 628*61046927SAndroid Build Coastguard Worker self.prefix_lib = 'shared' 629*61046927SAndroid Build Coastguard Worker self.prefix_warn = 'gl' 630*61046927SAndroid Build Coastguard Worker 631*61046927SAndroid Build Coastguard Worker def _override_for_api(self, ent): 632*61046927SAndroid Build Coastguard Worker ent.hidden = True 633*61046927SAndroid Build Coastguard Worker ent.handcode = False 634*61046927SAndroid Build Coastguard Worker 635*61046927SAndroid Build Coastguard Worker def _get_c_header(self): 636*61046927SAndroid Build Coastguard Worker header = """#ifndef _GLAPI_TMP_H_ 637*61046927SAndroid Build Coastguard Worker#define _GLAPI_TMP_H_ 638*61046927SAndroid Build Coastguard Worker#include "util/glheader.h" 639*61046927SAndroid Build Coastguard Worker#endif /* _GLAPI_TMP_H_ */""" 640*61046927SAndroid Build Coastguard Worker 641*61046927SAndroid Build Coastguard Worker return header 642*61046927SAndroid Build Coastguard Worker 643*61046927SAndroid Build Coastguard Workerdef parse_args(): 644*61046927SAndroid Build Coastguard Worker printers = ['glapi', 'es1api', 'es2api', 'shared-glapi'] 645*61046927SAndroid Build Coastguard Worker 646*61046927SAndroid Build Coastguard Worker parser = OptionParser(usage='usage: %prog [options] <xml_file>') 647*61046927SAndroid Build Coastguard Worker parser.add_option('-p', '--printer', dest='printer', 648*61046927SAndroid Build Coastguard Worker help='printer to use: %s' % (", ".join(printers))) 649*61046927SAndroid Build Coastguard Worker 650*61046927SAndroid Build Coastguard Worker options, args = parser.parse_args() 651*61046927SAndroid Build Coastguard Worker if not args or options.printer not in printers: 652*61046927SAndroid Build Coastguard Worker parser.print_help() 653*61046927SAndroid Build Coastguard Worker sys.exit(1) 654*61046927SAndroid Build Coastguard Worker 655*61046927SAndroid Build Coastguard Worker if not args[0].endswith('.xml'): 656*61046927SAndroid Build Coastguard Worker parser.print_help() 657*61046927SAndroid Build Coastguard Worker sys.exit(1) 658*61046927SAndroid Build Coastguard Worker 659*61046927SAndroid Build Coastguard Worker return (args[0], options) 660*61046927SAndroid Build Coastguard Worker 661*61046927SAndroid Build Coastguard Workerdef main(): 662*61046927SAndroid Build Coastguard Worker printers = { 663*61046927SAndroid Build Coastguard Worker 'glapi': GLAPIPrinter, 664*61046927SAndroid Build Coastguard Worker 'shared-glapi': SharedGLAPIPrinter, 665*61046927SAndroid Build Coastguard Worker } 666*61046927SAndroid Build Coastguard Worker 667*61046927SAndroid Build Coastguard Worker filename, options = parse_args() 668*61046927SAndroid Build Coastguard Worker 669*61046927SAndroid Build Coastguard Worker entries = abi_parse_xml(filename) 670*61046927SAndroid Build Coastguard Worker abi_sanity_check(entries) 671*61046927SAndroid Build Coastguard Worker 672*61046927SAndroid Build Coastguard Worker printer = printers[options.printer](entries) 673*61046927SAndroid Build Coastguard Worker printer.output_for_lib() 674*61046927SAndroid Build Coastguard Worker 675*61046927SAndroid Build Coastguard Workerif __name__ == '__main__': 676*61046927SAndroid Build Coastguard Worker main() 677