apiutil.py revision f22cba796fd7499bf85058671a1af7cbe491c622
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#!/usr/common/bin/python
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# apiutil.py
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# This file defines a bunch of utility functions for OpenGL API code
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# generation.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiimport sys, string, re
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef CopyrightC( ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print """/* Copyright (c) 2001, Stanford University
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi See the file LICENSE.txt for information on redistributing this software. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef CopyrightDef( ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print """; Copyright (c) 2001, Stanford University
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ; All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ; See the file LICENSE.txt for information on redistributing this software.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiclass APIFunction:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Class to represent a GL API function (name, return type,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi parameters, etc)."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi def __init__(self):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.name = ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.returnType = ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.category = ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.offset = -1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.alias = ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.vectoralias = ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.params = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.paramlist = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.paramvec = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.paramaction = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.paramprop = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.paramset = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.props = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi self.chromium = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ProcessSpecFile(filename, userFunc):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Open the named API spec file and call userFunc(record) for each record
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi processed."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi specFile = open(filename, "r")
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if not specFile:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print "Error: couldn't open %s file!" % filename
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sys.exit()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record = APIFunction()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for line in specFile.readlines():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # split line into tokens
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tokens = string.split(line)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if len(tokens) > 0 and line[0] != '#':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if tokens[0] == 'name':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if record.name != '':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # process the function now
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi userFunc(record)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # reset the record
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record = APIFunction()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.name = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'return':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.returnType = string.join(tokens[1:], ' ')
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'param':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi name = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi type = string.join(tokens[2:], ' ')
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vecSize = 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.params.append((name, type, vecSize))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'paramprop':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi name = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi str = tokens[2:]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi enums = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for i in range(len(str)):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi enums.append(str[i])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.paramprop.append((name, enums))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'paramlist':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi name = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi str = tokens[2:]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi list = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for i in range(len(str)):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi list.append(str[i])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.paramlist.append((name,list))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'paramvec':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi name = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi str = tokens[2:]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vec = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for i in range(len(str)):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vec.append(str[i])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.paramvec.append((name,vec))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'paramset':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi line = tokens[1:]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for i in range(len(line)):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tset = line[i]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if tset == '[':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nlist = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tset == ']':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result.append(nlist)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nlist = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi nlist.append(tset)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if result != []:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.paramset.append(result)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'paramaction':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi name = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi str = tokens[2:]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi list = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for i in range(len(str)):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi list.append(str[i])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.paramaction.append((name,list))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'category':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.category = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'offset':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if tokens[1] == '?':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.offset = -2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.offset = int(tokens[1])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'alias':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.alias = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'vectoralias':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.vectoralias = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'props':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.props = tokens[1:]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'chromium':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.chromium = tokens[1:]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif tokens[0] == 'vector':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vecName = tokens[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vecSize = int(tokens[2])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for i in range(len(record.params)):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (name, type, oldSize) = record.params[i]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if name == vecName:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.params[i] = (name, type, vecSize)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print 'Invalid token %s after function %s' % (tokens[0], record.name)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endfor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi specFile.close()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#enddef
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Dictionary [name] of APIFunction:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__FunctionDict = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Dictionary [name] of name
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__VectorVersion = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Reverse mapping of function name aliases
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__ReverseAliases = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef AddFunction(record):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert not __FunctionDict.has_key(record.name)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if not "omit" in record.chromium:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi __FunctionDict[record.name] = record
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef GetFunctionDict(specFile = ""):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if not specFile:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi specFile = sys.argv[1]+"/APIspec.txt"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if len(__FunctionDict) == 0:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ProcessSpecFile(specFile, AddFunction)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Look for vector aliased functions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for func in __FunctionDict.keys():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi va = __FunctionDict[func].vectoralias
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if va != '':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi __VectorVersion[va] = func
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # and look for regular aliases (for glloader)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi a = __FunctionDict[func].alias
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if a:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi __ReverseAliases[a] = func
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endfor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return __FunctionDict
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef GetAllFunctions(specFile = ""):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return sorted list of all functions known to Chromium."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict(specFile)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi funcs = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for func in d.keys():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rec = d[func]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if not "omit" in rec.chromium:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi funcs.append(func)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi funcs.sort()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return funcs
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef GetDispatchedFunctions(specFile = ""):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return sorted list of all functions handled by SPU dispatch table."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict(specFile)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi funcs = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for func in d.keys():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rec = d[func]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (not "omit" in rec.chromium and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi not "stub" in rec.chromium and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rec.alias == ''):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi funcs.append(func)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi funcs.sort()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return funcs
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ReturnType(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the C return type of named function.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Examples: "void" or "const GLubyte *". """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].returnType
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef Parameters(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of tuples (name, type, vecSize) of function parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Example: if funcName=="ClipPlane" return
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi [ ("plane", "GLenum", 0), ("equation", "const GLdouble *", 4) ] """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].params
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ParamAction(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of names of actions for testing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For PackerTest only."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].paramaction
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ParamList(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of tuples (name, list of values) of function parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For PackerTest only."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].paramlist
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ParamVec(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of tuples (name, vector of values) of function parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For PackerTest only."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].paramvec
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ParamSet(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of tuples (name, list of values) of function parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For PackerTest only."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].paramset
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef Properties(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of properties of the named GL function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].props
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef AllWithProperty(property):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of functions that have the named property."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi funcs = []
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for funcName in GetDispatchedFunctions():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if property in Properties(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi funcs.append(funcName)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return funcs
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef Category(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the category of the named GL function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].category
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ChromiumProps(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of Chromium-specific properties of the named GL function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].chromium
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ParamProps(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of Parameter-specific properties of the named GL function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].paramprop
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef Alias(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the function that the named function is an alias of.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Ex: Alias('DrawArraysEXT') = 'DrawArrays'.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].alias
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ReverseAlias(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Like Alias(), but the inverse."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if funcName in __ReverseAliases.keys():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return __ReverseAliases[funcName]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef NonVectorFunction(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the non-vector version of the given function, or ''.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For example: NonVectorFunction("Color3fv") = "Color3f"."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return d[funcName].vectoralias
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef VectorFunction(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the vector version of the given non-vector-valued function,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi or ''.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For example: VectorVersion("Color3f") = "Color3fv"."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if funcName in __VectorVersion.keys():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return __VectorVersion[funcName]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef GetCategoryWrapper(func_name):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return a C preprocessor token to test in order to wrap code.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi This handles extensions.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Example: GetTestWrapper("glActiveTextureARB") = "CR_multitexture"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Example: GetTestWrapper("glBegin") = ""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cat = Category(func_name)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cat == "1.0" or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cat == "1.1" or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cat == "1.2" or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cat == "Chromium" or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cat == "GL_chromium"):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif (cat == '1.3' or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cat == '1.4' or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cat == '1.5' or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cat == '2.0'):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # i.e. OpenGL 1.3 or 1.4 or 1.5
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return "OPENGL_VERSION_" + string.replace(cat, ".", "_")
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert cat != ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return string.replace(cat, "GL_", "")
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef CanCompile(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function can be compiled into display lists, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi props = Properties(funcName)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ("nolist" in props or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "get" in props or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "setclient" in props):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef HasChromiumProperty(funcName, propertyList):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function or any alias has any property in the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi propertyList"""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for funcAlias in [funcName, NonVectorFunction(funcName), VectorFunction(funcName)]:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if funcAlias:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi props = ChromiumProps(funcAlias)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for p in propertyList:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if p in props:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef CanPack(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function can be packed, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return HasChromiumProperty(funcName, ['pack', 'extpack', 'expandpack'])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef HasPackOpcode(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function has a true pack opcode"""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return HasChromiumProperty(funcName, ['pack', 'extpack'])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef SetsState(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function sets server-side state, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi props = Properties(funcName)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Exceptions. The first set of these functions *do* have
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # server-side state-changing effects, but will be missed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # by the general query, because they either render (e.g.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Bitmap) or do not compile into display lists (e.g. all the others).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # The second set do *not* have server-side state-changing
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # effects, despite the fact that they do not render
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # and can be compiled. They are control functions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # that are not trackable via state.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if funcName in ['Bitmap', 'DeleteTextures', 'FeedbackBuffer',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'RenderMode', 'BindBufferARB', 'DeleteFencesNV']:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elif funcName in ['ExecuteProgramNV']:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # All compilable functions that do not render and that do
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # not set or use client-side state (e.g. DrawArrays, et al.), set
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # server-side state.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CanCompile(funcName) and "render" not in props and "useclient" not in props and "setclient" not in props:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # All others don't set server-side state.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef SetsClientState(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function sets client-side state, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi props = Properties(funcName)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if "setclient" in props:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef SetsTrackedState(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function sets state that is tracked by
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi the state tracker, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # These functions set state, but aren't tracked by the state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # tracker for various reasons:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # - because the state tracker doesn't manage display lists
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # (e.g. CallList and CallLists)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # - because the client doesn't have information about what
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # the server supports, so the function has to go to the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # server (e.g. CompressedTexImage calls)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # - because they require a round-trip to the server (e.g.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # the CopyTexImage calls, SetFenceNV, TrackMatrixNV)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if funcName in [
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CopyTexImage1D', 'CopyTexImage2D',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CopyTexSubImage1D', 'CopyTexSubImage2D', 'CopyTexSubImage3D',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CallList', 'CallLists',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CompressedTexImage1DARB', 'CompressedTexSubImage1DARB',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CompressedTexImage2DARB', 'CompressedTexSubImage2DARB',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CompressedTexImage3DARB', 'CompressedTexSubImage3DARB',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'SetFenceNV'
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ]:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Anything else that affects client-side state is trackable.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if SetsClientState(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Anything else that doesn't set state at all is certainly
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # not trackable.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if not SetsState(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Per-vertex state isn't tracked the way other state is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # tracked, so it is specifically excluded.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if "pervertex" in Properties(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Everything else is fine
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef UsesClientState(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function uses client-side state, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi props = Properties(funcName)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if "pixelstore" in props or "useclient" in props:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef IsQuery(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function returns information to the user, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi props = Properties(funcName)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if "get" in props:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef FuncGetsState(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function gets GL state, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d = GetFunctionDict()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi props = Properties(funcName)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if "get" in props:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef IsPointer(dataType):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Determine if the datatype is a pointer. Return 1 or 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if string.find(dataType, "*") == -1:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef PointerType(pointerType):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the type of a pointer.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Ex: PointerType('const GLubyte *') = 'GLubyte'
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi t = string.split(pointerType, ' ')
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if t[0] == "const":
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi t[0] = t[1]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return t[0]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef OpcodeName(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the C token for the opcode for the given function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return "CR_" + string.upper(funcName) + "_OPCODE"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef ExtendedOpcodeName(funcName):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the C token for the extended opcode for the given function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return "CR_" + string.upper(funcName) + "_EXTEND_OPCODE"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef MakeCallString(params):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Given a list of (name, type, vectorSize) parameters, make a C-style
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi formal parameter string.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Ex return: 'index, x, y, z'.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i = 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi n = len(params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (name, type, vecSize) in params:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result += name
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if i < n:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = result + ', '
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i += 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endfor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return result
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#enddef
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef MakeDeclarationString(params):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Given a list of (name, type, vectorSize) parameters, make a C-style
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi parameter declaration string.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Ex return: 'GLuint index, GLfloat x, GLfloat y, GLfloat z'.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi n = len(params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if n == 0:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 'void'
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i = 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (name, type, vecSize) in params:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = result + type + ' ' + name
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if i < n:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = result + ', '
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i += 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endfor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return result
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#enddef
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef MakePrototypeString(params):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Given a list of (name, type, vectorSize) parameters, make a C-style
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi parameter prototype string (types only).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Ex return: 'GLuint, GLfloat, GLfloat, GLfloat'.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi n = len(params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if n == 0:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 'void'
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = ''
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i = 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (name, type, vecSize) in params:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = result + type
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # see if we need a comma separator
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if i < n:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = result + ', '
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i += 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endfor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return result
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#enddef
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__lengths = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLbyte': 1,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLubyte': 1,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLshort': 2,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLushort': 2,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLint': 4,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLuint': 4,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLfloat': 4,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLclampf': 4,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLdouble': 8,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLclampd': 8,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLenum': 4,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLboolean': 1,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLsizei': 4,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLbitfield': 4,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'void': 0, # XXX why?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'int': 4,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLintptrARB': 4, # XXX or 8 bytes?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'GLsizeiptrARB': 4 # XXX or 8 bytes?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef sizeof(type):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return size of C datatype, in bytes."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if not type in __lengths.keys():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print >>sys.stderr, "%s not in lengths!" % type
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return __lengths[type]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchialign_types = 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef FixAlignment( pos, alignment ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # if we want double-alignment take word-alignment instead,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # yes, this is super-lame, but we know what we are doing
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if alignment > 4:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alignment = 4
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if align_types and alignment and ( pos % alignment ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pos += alignment - ( pos % alignment )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return pos
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef WordAlign( pos ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return FixAlignment( pos, 4 )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef PointerSize():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 8 # Leave room for a 64 bit pointer
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef PacketLength( params ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi len = 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (name, type, vecSize) in params:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if IsPointer(type):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi size = PointerSize()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert string.find(type, "const") == -1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi size = sizeof(type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi len = FixAlignment( len, size ) + size
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi len = WordAlign( len )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return len
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__specials = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef LoadSpecials( filename ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi try:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi f = open( filename, "r" )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi except:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# try:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi f = open( sys.argv[2]+"/"+filename, "r")
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# except:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# __specials[filename] = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# print "%s not present" % filename
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# return {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for line in f.readlines():
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi line = string.strip(line)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if line == "" or line[0] == '#':
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi continue
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table[line] = 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi __specials[filename] = table
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return table
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef FindSpecial( table_file, glName ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi filename = table_file + "_special"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi try:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = __specials[filename]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi except KeyError:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = LoadSpecials( filename )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi try:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (table[glName] == 1):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0 #should never happen
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi except KeyError:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef AllSpecials( table_file ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi filename = table_file + "_special"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi try:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = __specials[filename]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi except KeyError:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = LoadSpecials( filename )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi keys = table.keys()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi keys.sort()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return keys
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef AllSpecials( table_file ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi filename = table_file + "_special"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi try:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = __specials[filename]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi except KeyError:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = LoadSpecials(filename)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret = table.keys()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret.sort()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ret
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef NumSpecials( table_file ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi filename = table_file + "_special"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi try:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = __specials[filename]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi except KeyError:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi table = LoadSpecials(filename)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return len(table.keys())
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidef PrintRecord(record):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi argList = MakeDeclarationString(record.params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if record.category == "Chromium":
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi prefix = "cr"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi prefix = "gl"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print '%s %s%s(%s);' % (record.returnType, prefix, record.name, argList )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if len(record.props) > 0:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print ' /* %s */' % string.join(record.props, ' ')
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ProcessSpecFile("APIspec.txt", PrintRecord)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi