apiutil.py revision f22cba796fd7499bf85058671a1af7cbe491c622
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# This file defines a bunch of utility functions for OpenGL API code
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print """/* Copyright (c) 2001, Stanford University
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi See the file LICENSE.txt for information on redistributing this software. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print """; Copyright (c) 2001, Stanford University
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ; All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ; See the file LICENSE.txt for information on redistributing this software.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Class to represent a GL API function (name, return type,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi parameters, etc)."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Open the named API spec file and call userFunc(record) for each record
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi processed."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print "Error: couldn't open %s file!" % filename
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # split line into tokens
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # process the function now
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # reset the record
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.returnType = string.join(tokens[1:], ' ')
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi record.params.append((name, type, vecSize))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print 'Invalid token %s after function %s' % (tokens[0], record.name)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Dictionary [name] of APIFunction:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Dictionary [name] of name
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Reverse mapping of function name aliases
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert not __FunctionDict.has_key(record.name)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if not "omit" in record.chromium:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Look for vector aliased functions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # and look for regular aliases (for glloader)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return sorted list of all functions known to Chromium."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return sorted list of all functions handled by SPU dispatch table."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the C return type of named function.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Examples: "void" or "const GLubyte *". """
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 """Return list of names of actions for testing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For PackerTest only."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of tuples (name, list of values) of function parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For PackerTest only."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of tuples (name, vector of values) of function parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For PackerTest only."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of tuples (name, list of values) of function parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For PackerTest only."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of properties of the named GL function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of functions that have the named property."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the category of the named GL function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of Chromium-specific properties of the named GL function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return list of Parameter-specific properties of the named GL function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the function that the named function is an alias of.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Ex: Alias('DrawArraysEXT') = 'DrawArrays'.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Like Alias(), but the inverse."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the non-vector version of the given function, or ''.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For example: NonVectorFunction("Color3fv") = "Color3f"."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the vector version of the given non-vector-valued function,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi For example: VectorVersion("Color3f") = "Color3fv"."""
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 # i.e. OpenGL 1.3 or 1.4 or 1.5
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return "OPENGL_VERSION_" + string.replace(cat, ".", "_")
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function can be compiled into display lists, else 0."""
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 """Return 1 if the function can be packed, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return HasChromiumProperty(funcName, ['pack', 'extpack', 'expandpack'])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function has a true pack opcode"""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return HasChromiumProperty(funcName, ['pack', 'extpack'])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function sets server-side state, else 0."""
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 # 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 # 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 # All others don't set server-side state.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function sets client-side state, else 0."""
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 'CopyTexSubImage1D', 'CopyTexSubImage2D', 'CopyTexSubImage3D',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CompressedTexImage1DARB', 'CompressedTexSubImage1DARB',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CompressedTexImage2DARB', 'CompressedTexSubImage2DARB',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 'CompressedTexImage3DARB', 'CompressedTexSubImage3DARB',
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Anything else that affects client-side state is trackable.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Anything else that doesn't set state at all is certainly
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # not trackable.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Per-vertex state isn't tracked the way other state is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # tracked, so it is specifically excluded.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # Everything else is fine
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function uses client-side state, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if "pixelstore" in props or "useclient" in props:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function returns information to the user, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return 1 if the function gets GL state, else 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Determine if the datatype is a pointer. Return 1 or 0."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the type of a pointer.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Ex: PointerType('const GLubyte *') = 'GLubyte'
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return the C token for the opcode for the given function."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return "CR_" + string.upper(funcName) + "_OPCODE"
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 """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 """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 return 'void'
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 return 'void'
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi # see if we need a comma separator
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi """Return size of C datatype, in bytes."""
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print >>sys.stderr, "%s not in lengths!" % type
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
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 align_types and alignment and ( pos % alignment ):
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#======================================================================
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# __specials[filename] = {}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# print "%s not present" % filename
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi argList = MakeDeclarationString(record.params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print '%s %s%s(%s);' % (record.returnType, prefix, record.name, argList )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print ' /* %s */' % string.join(record.props, ' ')
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ProcessSpecFile("APIspec.txt", PrintRecord)