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