072f0b86f23a38efb7454da3144cbce76805be76vboxsync# $Id$
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncimport sys, cPickle, re
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncsys.path.append( "../glapi_parser" )
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncimport apiutil
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# A routine that can create call strings from instance names
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef InstanceCallString( params ):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync output = ''
072f0b86f23a38efb7454da3144cbce76805be76vboxsync for index in range(0,len(params)):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if index > 0:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync output += ", "
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if params[index][0] != '':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync output += 'instance->' + params[index][0]
072f0b86f23a38efb7454da3144cbce76805be76vboxsync return output
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef GetPointerType(basetype):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync words = basetype.split()
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if words[0] == 'const':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync words = words[1:]
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if words[-1].endswith('*'):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync words[-1] = words[-1][:-1].strip()
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if words[-1] == '':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync words = words[:-1]
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if words[0] == 'void' or words[0] == 'GLvoid':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync words[0] = 'int'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync return ' '.join(words)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef GetPointerInfo(functionName):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # We'll keep track of all the parameters that require pointers.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # They'll require special handling later.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync params = apiutil.Parameters(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointers = []
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointername=''
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointerarg=''
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointertype=''
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointersize=0
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointercomment=''
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync index = 0
072f0b86f23a38efb7454da3144cbce76805be76vboxsync for (name, type, vecSize) in params:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Watch out for the word "const" (which should be ignored)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # and for types that end in "*" (which are pointers and need
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # special treatment)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync words = type.split()
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if words[-1].endswith('*'):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointers.append(index)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync index += 1
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # If any argument was a pointer, we need a special pointer data
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # array. The pointer data will be stored into this array, and
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # references to the array will be generated as parameters.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if len(pointers) == 1:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync index = pointers[0]
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointername = params[index][0]
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointerarg = pointername + 'Data'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointertype = GetPointerType(params[index][1])
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointersize = params[index][2]
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if pointersize == 0:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointersize = "special"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif len(pointers) > 1:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointerarg = 'data';
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointertype = GetPointerType(params[pointers[0]][1])
072f0b86f23a38efb7454da3144cbce76805be76vboxsync for index in range(1,len(pointers)):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if GetPointerType(params[pointers[index]][1]) != pointertype:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pointertype = 'GLvoid *'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync return (pointers,pointername,pointerarg,pointertype,pointersize,pointercomment)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef wrap_struct(functionName):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync params = apiutil.Parameters(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync argstring = apiutil.MakeDeclarationString(params)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync extendedArgstring = argstring
072f0b86f23a38efb7454da3144cbce76805be76vboxsync props = apiutil.Properties(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if "useclient" in props or "pixelstore" in props:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync extendedArgstring += ", CRClientState *c"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # We'll keep track of all the parameters that require pointers.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # They'll require special handling later.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync (pointers, pointername, pointerarg, pointertype, pointersize, pointercomment) = GetPointerInfo(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Start writing the header
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print 'struct instance%s {' % (functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' DLMInstanceList *next;'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' DLMInstanceList *stateNext;'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' void (DLM_APIENTRY *execute)(DLMInstanceList *instance, SPUDispatchTable *dispatchTable);'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync for (name, type, vecSize) in params:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Watch out for the word "const" (which should be ignored)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # and for types that end in "*" (which are pointers and need
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # special treatment)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync words = type.split()
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if words[0] == 'const':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync words = words[1:]
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if words[0] != "void":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' %s %s;' % (' '.join(words), name)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # If any argument was a pointer, we need a special pointer data
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # array. The pointer data will be stored into this array, and
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # references to the array will be generated as parameters.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if len(pointers) == 1:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if pointersize == None:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print " /* Oh no - pointer parameter %s found, but no pointer class specified and can't guess */" % pointername
072f0b86f23a38efb7454da3144cbce76805be76vboxsync else:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if pointersize == 'special':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' %s %s[1];%s' % (pointertype, pointerarg, pointercomment)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync else:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' %s %s[%s];%s' % (pointertype, pointerarg, pointersize,pointercomment)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif len(pointers) > 1:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' %s %s[1];%s' % (pointertype, pointerarg,pointercomment)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '};'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Pointers only happen with instances
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if len(pointers) > 1 or (len(pointers) == 1 and pointersize == 'special'):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print 'int crdlm_pointers_%s(struct instance%s *instance, %s);' % (functionName, functionName, extendedArgstring)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # See if the GL function must sometimes allow passthrough even
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # if the display list is open
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if "checklist" in apiutil.ChromiumProps(functionName):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print 'int crdlm_checklist_%s(%s);' % (functionName, argstring)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync return
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef wrap_execute(functionName):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync params = apiutil.Parameters(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print 'static void execute%s(DLMInstanceList *x, SPUDispatchTable *dispatchTable)' % functionName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '{'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if len(params) > 0:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tstruct instance%s *instance = (struct instance%s *)x;' % (functionName, functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tif (dispatchTable->%s != NULL) {' % (functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tdispatchTable->%s(%s);' % (functionName, InstanceCallString(params))
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\telse {'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tcrWarning("DLM warning: execute%s called with NULL dispatch entry");' % (functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef generate_bbox_code(functionName):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync assert functionName[0:6] == "Vertex"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync pattern = "(VertexAttribs|VertexAttrib|Vertex)(1|2|3|4)(N?)(f|d|i|s|b|ub|us|ui)(v?)"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync m = re.match(pattern, functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if m:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync name = m.group(1)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync size = int(m.group(2))
072f0b86f23a38efb7454da3144cbce76805be76vboxsync normalize = m.group(3)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync type = m.group(4)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync vector = m.group(5)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # only update bbox for vertex attribs if index == 0
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if name == "VertexAttrib":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync test = "if (index == 0) {"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif name == "VertexAttribs":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync test = "if (index == 0) {"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync else:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync assert name == "Vertex"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync test = "{"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # find names of the X, Y, Z, W values
072f0b86f23a38efb7454da3144cbce76805be76vboxsync xName = ""
072f0b86f23a38efb7454da3144cbce76805be76vboxsync yName = ""
072f0b86f23a38efb7454da3144cbce76805be76vboxsync zName = "0.0"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync wName = ""
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if vector == "v":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync xName = "v[0]"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if size > 1:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync yName = "v[1]"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if size > 2:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync zName = "v[2]"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if size > 3:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync wName = "v[3]"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync else:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync xName = "x"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if size > 1:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync yName = "y"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if size > 2:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync zName = "z"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if size > 3:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync wName = "w"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # start emitting code
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t%s' % test
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if normalize == "N":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if type == "b":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync denom = "128.0f"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif type == "s":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync denom = "32768.0f"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif type == "i":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync denom = "2147483647.0f"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif type == "ub":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync denom = "255.0f"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif type == "us":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync denom = "65535.0f"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif type == "ui":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync denom = "4294967295.0f"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tGLfloat nx = (GLfloat) %s / %s;' % (xName, denom)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync xName = "nx"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if yName:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tGLfloat ny = (GLfloat) %s / %s;' % (yName, denom)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync yName = "ny"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if zName:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tGLfloat nz = (GLfloat) %s / %s;' % (zName, denom)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync zName = "nz"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if 0 and wName:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tGLfloat nw = (GLfloat) %s / %s;' % (wName, denom)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync wName = "nw"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if xName:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tif (%s < state->currentListInfo->bbox.xmin)' % xName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\t\tstate->currentListInfo->bbox.xmin = %s;' % xName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tif (%s > state->currentListInfo->bbox.xmax)' % xName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\t\tstate->currentListInfo->bbox.xmax = %s;' % xName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if yName:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tif (%s < state->currentListInfo->bbox.ymin)' % yName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\t\tstate->currentListInfo->bbox.ymin = %s;' % yName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tif (%s > state->currentListInfo->bbox.ymax)' % yName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\t\tstate->currentListInfo->bbox.ymax = %s;' % yName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if zName:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tif (%s < state->currentListInfo->bbox.zmin)' % zName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\t\tstate->currentListInfo->bbox.zmin = %s;' % zName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tif (%s > state->currentListInfo->bbox.zmax)' % zName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\t\tstate->currentListInfo->bbox.zmax = %s;' % zName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # XXX what about divide by W if we have 4 components?
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync else:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' /* bbox error for %s !!!!! */' % functionName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# These code snippets isolate the code required to add a given instance
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# to the display list correctly. They are used during generation, to
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# generate correct code, and also to create useful utilities.
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef AddInstanceToList(pad):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s/* Add this instance to the current display list. */' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%sinstance->next = NULL;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%sinstance->stateNext = NULL;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%sif (!state->currentListInfo->first) {' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s\tstate->currentListInfo->first = (DLMInstanceList *)instance;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s}' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%selse {' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s\tstate->currentListInfo->last->next = (DLMInstanceList *)instance;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s}' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%sstate->currentListInfo->last = (DLMInstanceList *)instance;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%sstate->currentListInfo->numInstances++;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef AddInstanceToStateList(pad):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s/* Instances that change state have to be added to the state list as well. */' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%sif (!state->currentListInfo->stateFirst) {' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s\tstate->currentListInfo->stateFirst = (DLMInstanceList *)instance;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s}' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%selse {' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s\tstate->currentListInfo->stateLast->stateNext = (DLMInstanceList *)instance;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%s}' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '%sstate->currentListInfo->stateLast = (DLMInstanceList *)instance;' % pad
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# The compile wrapper collects the parameters into a DLMInstanceList
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# element, and adds that element to the end of the display list currently
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# being compiled.
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncdef wrap_compile(functionName):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync params = apiutil.Parameters(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync return_type = apiutil.ReturnType(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Make sure the return type is void. It's nonsensical to compile
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # an element with any other return type.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if return_type != 'void':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '/* Nonsense: DL function %s has a %s return type?!? */' % (functionName, return_type)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # return
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Define a structure to hold all the parameters. Note that the
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # top parameters must exactly match the DLMInstanceList structure
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # in include/cr_dlm.h, or everything will break horribly.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Start off by getting all the pointer info we could ever use
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # from the parameters
072f0b86f23a38efb7454da3144cbce76805be76vboxsync (pointers, pointername, pointerarg, pointertype, pointersize, pointercomment) = GetPointerInfo(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Finally, the compile wrapper. This one will diverge strongly
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # depending on whether or not there are pointer parameters.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync callstring = apiutil.MakeCallString(params)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync argstring = apiutil.MakeDeclarationString(params)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync props = apiutil.Properties(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if "useclient" in props or "pixelstore" in props:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync callstring += ", c"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync argstring += ", CRClientState *c"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print 'void DLM_APIENTRY crDLMCompile%s( %s )' % (functionName, argstring)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '{'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' CRDLMContextState *state = CURRENT_STATE();'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ' struct instance%s *instance;' % (functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # The calling SPU is supposed to verify that the element is supposed to be
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # compiled before it is actually compiled; typically, this is done based
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # on whether a glNewList has been executed more recently than a glEndList.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # But some functions are dual-natured, sometimes being compiled, and sometimes
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # being executed immediately. We can check for this here.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if "checklist" in apiutil.ChromiumProps(functionName):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tif (crDLMCheckList%s(%s)) {' % (functionName, apiutil.MakeCallString(params))
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tcrdlm_error(__LINE__, __FILE__, GL_INVALID_OPERATION,'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\t "this instance of function %s should not be compiled");' % functionName;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\treturn;'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if len(pointers) > 1 or pointersize == 'special':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Pass NULL, to just allocate space
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tinstance = crCalloc(sizeof(struct instance%s) + crdlm_pointers_%s(NULL, %s));' % (functionName, functionName, callstring)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync else:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tinstance = crCalloc(sizeof(struct instance%s));' % (functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tif (!instance) {'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tcrdlm_error(__LINE__, __FILE__, GL_OUT_OF_MEMORY,'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\t\t"out of memory adding %s to display list");' % (functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\treturn;'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Put in the fields that must always exist
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tinstance->execute = execute%s;' % functionName
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Apply all the simple (i.e. non-pointer) parameters
072f0b86f23a38efb7454da3144cbce76805be76vboxsync for index in range(len(params)):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if index not in pointers:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync name = params[index][0]
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tinstance->%s = %s;' % (name, name)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # If there's a pointer parameter, apply it.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if len(pointers) == 1:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tif (%s == NULL) {' % (params[pointers[0]][0])
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tinstance->%s = NULL;' % (params[pointers[0]][0])
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\telse {'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t\tinstance->%s = instance->%s;' % (params[pointers[0]][0], pointerarg)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if pointersize == 'special':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t(void) crdlm_pointers_%s(instance, %s);' % (functionName, callstring)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync else:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\tcrMemcpy((void *)instance->%s, (void *) %s, %s*sizeof(%s));' % (params[pointers[0]][0], params[pointers[0]][0], pointersize, pointertype)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif len(pointers) == 2:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # this seems to work
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '\t(void) crdlm_pointers_%s(instance, %s);' % (functionName, callstring)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif len(pointers) > 2:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print "#error don't know how to handle pointer parameters for %s" % (functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Add the element to the current display list
072f0b86f23a38efb7454da3144cbce76805be76vboxsync AddInstanceToList('\t')
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # If the element is a state-changing element, add it to the current state list
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if apiutil.SetsTrackedState(functionName):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync AddInstanceToStateList('\t')
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # XXX might need a better test here
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if functionName[0:6] == "Vertex":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync generate_bbox_code(functionName)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncwhichfile=sys.argv[1]
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncif whichfile == 'headers':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print """#ifndef _DLM_GENERATED_H
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#define _DLM_GENERATED_H
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync/* DO NOT EDIT. This file is auto-generated by dlm_generated.py. */
072f0b86f23a38efb7454da3144cbce76805be76vboxsync"""
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncelse:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print """#include <stdio.h>
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "cr_spu.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "cr_dlm.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "cr_mem.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "cr_error.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "state/cr_statefuncs.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "dlm.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "dlm_pointers.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "dlm_generated.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync/* DO NOT EDIT. This file is auto-generated by dlm_generated.py. */
072f0b86f23a38efb7454da3144cbce76805be76vboxsync"""
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# Add in the "add_to_dl" utility function, which will be used by
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# external (i.e. non-generated) functions. The utility ensures that
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# any external functions that are written for compiling elements
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# don't have to be rewritten if the conventions for adding to display
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# lists are changed.
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncprint """
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncvoid crdlm_add_to_list(
072f0b86f23a38efb7454da3144cbce76805be76vboxsync DLMInstanceList *instance,
072f0b86f23a38efb7454da3144cbce76805be76vboxsync void (*executeFunc)(DLMInstanceList *x, SPUDispatchTable *dispatchTable)"""
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncif (whichfile == 'headers'):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ");"
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncelse:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print """) {
072f0b86f23a38efb7454da3144cbce76805be76vboxsync CRDLMContextState *state = CURRENT_STATE();
072f0b86f23a38efb7454da3144cbce76805be76vboxsync instance->execute = executeFunc;"""
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Add in the common code for adding the instance to the display list
072f0b86f23a38efb7454da3144cbce76805be76vboxsync AddInstanceToList(" ")
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print '}'
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print ''
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# Now generate the functions that won't use the crdlm_add_to_list utility.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# These all directly add their own instances to the current display list
072f0b86f23a38efb7454da3144cbce76805be76vboxsync# themselves, without using the crdlm_add_to_list() function.
072f0b86f23a38efb7454da3144cbce76805be76vboxsynckeys = apiutil.GetDispatchedFunctions(sys.argv[3]+"/APIspec.txt")
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncfor func_name in keys:
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if apiutil.CanCompile(func_name):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print "\n/*** %s ***/" % func_name
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # Auto-generate an appropriate DL function. First, functions
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # that go into the display list but that rely on state will
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # have to have their argument strings expanded, to take pointers
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # to that appropriate state.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if whichfile == "headers":
072f0b86f23a38efb7454da3144cbce76805be76vboxsync wrap_struct(func_name)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync elif not apiutil.FindSpecial("dlm", func_name):
072f0b86f23a38efb7454da3144cbce76805be76vboxsync wrap_execute(func_name)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync wrap_compile(func_name)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync # All others just pass through
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncif whichfile == 'headers':
072f0b86f23a38efb7454da3144cbce76805be76vboxsync print "#endif /* _DLM_GENERATED_H */"