1760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#!/usr/bin/python
2760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#
3760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# Copyright (C) 2009 Chia-I Wu <olv@0xlab.org>
4760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#
5760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# Permission is hereby granted, free of charge, to any person obtaining a
6760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# copy of this software and associated documentation files (the "Software"),
7760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# to deal in the Software without restriction, including without limitation
8760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# on the rights to use, copy, modify, merge, publish, distribute, sub
9760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# license, and/or sell copies of the Software, and to permit persons to whom
10760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# the Software is furnished to do so, subject to the following conditions:
11760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#
12760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# The above copyright notice and this permission notice (including the next
13760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# paragraph) shall be included in all copies or substantial portions of the
14760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# Software.
15760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#
16760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
19760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org# IN THE SOFTWARE.
23760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org"""
24760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgMinimal apiutil.py interface for use by es_generator.py.
25760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org"""
26760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
27760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgimport sys
28760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgimport libxml2
29760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
30760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgimport APIspec
31760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
32760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org__spec = {}
33760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org__functions = {}
34760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org__aliases = {}
35760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
36760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef _ParseXML(filename, apiname):
37760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    conversions = {
38760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        # from           to
39760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        'GLfloat':  [ 'GLdouble' ],
40760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        'GLclampf': [ 'GLclampd' ],
41760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        'GLubyte':  [ 'GLfloat', 'GLdouble' ],
42760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        'GLint':    [ 'GLfloat', 'GLdouble' ],
43760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        'GLfixed':  [ 'GLfloat', 'GLdouble' ],
44760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        'GLclampx': [ 'GLclampf', 'GLclampd' ],
45760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    }
46760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
47760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    doc = libxml2.readFile(filename, None,
48760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            libxml2.XML_PARSE_DTDLOAD +
49760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            libxml2.XML_PARSE_DTDVALID +
50760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            libxml2.XML_PARSE_NOBLANKS)
51760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    spec = APIspec.Spec(doc)
52760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    impl = spec.get_impl()
53760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    api = spec.get_api(apiname)
54760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    doc.freeDoc()
55760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
56760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    __spec["impl"] = impl
57760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    __spec["api"] = api
58760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
59760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for func in api.functions:
60760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        alias, need_conv = impl.match(func, conversions)
61760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if not alias:
62760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            # external functions are manually dispatched
63760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            if not func.is_external:
64760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                print >>sys.stderr, "Error: unable to dispatch %s" % func.name
65760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            alias = func
66760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            need_conv = False
67760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
68760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        __functions[func.name] = func
69760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        __aliases[func.name] = (alias, need_conv)
70760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
71760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
72760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef AllSpecials(notused=None):
73760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return a list of all external functions in the API."""
74760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    api = __spec["api"]
75760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
76760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    specials = []
77760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for func in api.functions:
78760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if func.is_external:
79760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            specials.append(func.name)
80760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
81760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return specials
82760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
83760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
84760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef GetAllFunctions(filename, api):
85760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return sorted list of all functions in the API."""
86760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if not __spec:
87760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        _ParseXML(filename, api)
88760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
89760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    api = __spec["api"]
90760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    names = []
91760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for func in api.functions:
92760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        names.append(func.name)
93760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    names.sort()
94760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return names
95760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
96760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
97760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef ReturnType(funcname):
98760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return the C return type of named function."""
99760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    func = __functions[funcname]
100760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return func.return_type
101760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
102760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
103760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef Properties(funcname):
104760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return list of properties of the named GL function."""
105760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    func = __functions[funcname]
106760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return [func.direction]
107760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
108760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
109760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef _ValidValues(func, param):
110760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return the valid values of a parameter."""
111760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    valid_values = []
112760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    switch = func.checker.switches.get(param.name, [])
113760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for desc in switch:
114760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        # no dependent vector
115760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if not desc.checker.switches:
116760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            for val in desc.values:
117760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                valid_values.append((val, None, None, [], desc.error, None))
118760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            continue
119760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
120760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        items = desc.checker.switches.items()
121760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if len(items) > 1:
122760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            print >>sys.stderr, "%s: more than one parameter depend on %s" % \
123760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                    (func.name, desc.name)
124760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        dep_name, dep_switch = items[0]
125760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
126760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        for dep_desc in dep_switch:
127760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            if dep_desc.index >= 0 and dep_desc.index != 0:
128760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                print >>sys.stderr, "%s: not first element of a vector" % func.name
129760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            if dep_desc.checker.switches:
130760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                print >>sys.stderr, "%s: deep nested dependence" % func.name
131760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
132760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            convert = None if dep_desc.convert else "noconvert"
133760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            for val in desc.values:
134760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                valid_values.append((val, dep_desc.size_str, dep_desc.name,
135760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                     dep_desc.values, dep_desc.error, convert))
136760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return valid_values
137760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
138760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
139760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef _Conversion(func, src_param):
140760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return the destination type of the conversion, or None."""
141760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    alias, need_conv = __aliases[func.name]
142760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if need_conv:
143760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        dst_param = alias.get_param(src_param.name)
144760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if src_param.type == dst_param.type:
145760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            need_conv = False
146760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if not need_conv:
147760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        return (None, "none")
148760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
149760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    converts = { True: 0, False: 0 }
150760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
151760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    # In Fogx, for example,  pname may be GL_FOG_DENSITY/GL_FOG_START/GL_FOG_END
152760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    # or GL_FOG_MODE.  In the former three cases, param is not checked and the
153760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    # default is to convert.
154760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if not func.checker.always_check(src_param.name):
155760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        converts[True] += 1
156760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
157760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for desc in func.checker.flatten(src_param.name):
158760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        converts[desc.convert] += 1
159760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if converts[True] and converts[False]:
160760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            break
161760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
162760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    # it should be "never", "sometimes", and "always"...
163760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if converts[False]:
164760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if converts[True]:
165760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            conversion = "some"
166760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        else:
167760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            conversion = "none"
168760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    else:
169760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        conversion = "all"
170760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
171760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return (dst_param.base_type(), conversion)
172760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
173760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
174760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef _MaxVecSize(func, param):
175760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return the largest possible size of a vector."""
176760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if not param.is_vector:
177760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        return 0
178760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if param.size:
179760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        return param.size
180760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
181760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    # need to look at all descriptions
182760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    size = 0
183760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for desc in func.checker.flatten(param.name):
184760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if desc.size_str and desc.size_str.isdigit():
185760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            s = int(desc.size_str)
186760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            if s > size:
187760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                size = s
188760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if not size:
189760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        need_conv = __aliases[func.name][1]
190760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if need_conv:
191760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            print >>sys.stderr, \
192760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                    "Error: unable to dicide the max size of %s in %s" % \
193760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                    (param.name, func.name)
194760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return size
195760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
196760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
197760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef _ParameterTuple(func, param):
198760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return a parameter tuple.
199760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
200760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    [0] -- parameter name
201760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    [1] -- parameter type
202760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    [2] -- max vector size or 0
203760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    [3] -- dest type the parameter converts to, or None
204760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    [4] -- valid values
205760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    [5] -- how often does the conversion happen
206760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
207760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """
208760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    vec_size = _MaxVecSize(func, param)
209760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    dst_type, conversion = _Conversion(func, param)
210760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    valid_values = _ValidValues(func, param)
211760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
212760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return (param.name, param.type, vec_size, dst_type, valid_values, conversion)
213760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
214760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
215760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef Parameters(funcname):
216760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return list of tuples of function parameters."""
217760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    func = __functions[funcname]
218760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    params = []
219760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for param in func.params:
220760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        params.append(_ParameterTuple(func, param))
221760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
222760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return params
223760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
224760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
225760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef FunctionPrefix(funcname):
226760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return function specific prefix."""
227760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    func = __functions[funcname]
228760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
229760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return func.prefix
230760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
231760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
232760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef FindParamIndex(params, paramname):
233760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Find the index of a named parameter."""
234760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for i in xrange(len(params)):
235760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        if params[i][0] == paramname:
236760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org            return i
237760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return None
238760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
239760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
240760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef MakeDeclarationString(params):
241760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return a C-style parameter declaration string."""
242760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    string = []
243760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    for p in params:
244760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        sep = "" if p[1].endswith("*") else " "
245760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        string.append("%s%s%s" % (p[1], sep, p[0]))
246760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    if not string:
247760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org        return "void"
248760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return ", ".join(string)
249760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
250760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
251760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef AliasPrefix(funcname):
252760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return the prefix of the function the named function is an alias of."""
253760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    alias = __aliases[funcname][0]
254760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return alias.prefix
255760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
256760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
257760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef Alias(funcname):
258760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return the name of the function the named function is an alias of."""
259760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    alias, need_conv = __aliases[funcname]
260760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return alias.name if not need_conv else None
261760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
262760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
263760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef ConversionFunction(funcname):
264760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return the name of the function the named function converts to."""
265760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    alias, need_conv = __aliases[funcname]
266760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return alias.name if need_conv else None
267760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
268760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
269760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgdef Categories(funcname):
270760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    """Return all the categories of the named GL function."""
271760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    api = __spec["api"]
272760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org    return [api.name]
273