xref: /aosp_15_r20/external/mesa3d/src/mapi/mapi_abi.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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