diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/packer/packer_bbox.py')
-rwxr-xr-x | src/VBox/GuestHost/OpenGL/packer/packer_bbox.py | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/packer/packer_bbox.py b/src/VBox/GuestHost/OpenGL/packer/packer_bbox.py new file mode 100755 index 00000000..5abb6e2e --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/packer/packer_bbox.py @@ -0,0 +1,316 @@ +# Copyright (c) 2001, Stanford University +# All rights reserved. +# +# See the file LICENSE.txt for information on redistributing this software. + +# This script generates the packer_bbox.c file from gl_header.parsed + +from __future__ import print_function +import sys +import string + +import apiutil + + +apiutil.CopyrightC() + +print(""" +/* DO NOT EDIT - THIS FILE GENERATED BY THE packer_bbox.py SCRIPT */ + +/* These functions pack glVertex functions and also update the bounding box + * if the cr_packer_globals.updateBBOX variable is non-zero. + */ + +#include "packer.h" +#include "cr_opcodes.h" +#include "pack_bbox.h" + +#include <float.h> + +/** + * Reset packer bounding box to empty state. + */ +void crPackResetBoundingBox(CRPackContext *pc) +{ + pc->bounds_min.x = FLT_MAX; + pc->bounds_min.y = FLT_MAX; + pc->bounds_min.z = FLT_MAX; + pc->bounds_max.x = -FLT_MAX; + pc->bounds_max.y = -FLT_MAX; + pc->bounds_max.z = -FLT_MAX; + pc->updateBBOX = 1; +} + +/** + * Query current bounding box. + * \return GL_TRUE if non-empty box, GL_FALSE if empty box. + */ +GLboolean crPackGetBoundingBox(CRPackContext *pc, + GLfloat *xmin, GLfloat *ymin, GLfloat *zmin, + GLfloat *xmax, GLfloat *ymax, GLfloat *zmax) +{ + if (pc->bounds_min.x != FLT_MAX) { + *xmin = pc->bounds_min.x; + *ymin = pc->bounds_min.y; + *zmin = pc->bounds_min.z; + *xmax = pc->bounds_max.x; + *ymax = pc->bounds_max.y; + *zmax = pc->bounds_max.z; + return GL_TRUE; + } + else { + return GL_FALSE; + } +} + +""") + +def WriteData( offset, arg_type, arg_name, is_swapped ): + if arg_type.find('*') != -1: + retval = "\tWRITE_NETWORK_POINTER(%d, (void *) %s);" % (offset, arg_name ) + else: + if is_swapped: + if arg_type == "GLfloat" or arg_type == "GLclampf": + retval = "\tWRITE_DATA(%d, GLuint, SWAPFLOAT(%s));" % (offset, arg_name) + elif arg_type == "GLdouble" or arg_type == "GLclampd": + retval = "\tWRITE_SWAPPED_DOUBLE(%d, %s);" % (offset, arg_name) + elif apiutil.sizeof(arg_type) == 1: + retval = "\tWRITE_DATA(%d, %s, %s);" % (offset, arg_type, arg_name) + elif apiutil.sizeof(arg_type) == 2: + retval = "\tWRITE_DATA(%d, %s, SWAP16(%s));" % (offset, arg_type, arg_name) + elif apiutil.sizeof(arg_type) == 4: + retval = "\tWRITE_DATA(%d, %s, SWAP32(%s));" % (offset, arg_type, arg_name) + else: + if arg_type == "GLdouble" or arg_type == "GLclampd": + retval = "\tWRITE_DOUBLE(%d, %s);" % (offset, arg_name) + else: + retval = "\tWRITE_DATA(%d, %s, %s);" % (offset, arg_type, arg_name) + return retval + + +def PrintFunction( func_name, extSuffix, num_coords, argtype, + do_swapped, do_count, do_vector ): + """ + Generate all the functions named crPackVertex[234][dfis][v]BBOX() and + crPackVertex[234][dfis][v]BBOX_COUNT(). + We also handle glVertexAttrib*ARB. + Note: func_name should not have an ARB suffix. + """ + + if do_count: + countSuffix = "_COUNT" + else: + countSuffix = "" + + if do_swapped: + swapSuffix = "SWAP" + else: + swapSuffix = "" + + if func_name[0:12] == "VertexAttrib": + isVertexAttrib = 1 + else: + isVertexAttrib = 0 + + if argtype[0] == "N": + normalized = 1 + else: + normalized = 0; + + if argtype == "b" or argtype == "Nb": + vector_type = "GLbyte" + elif argtype == "ub" or argtype == "Nub": + vector_type = "GLubyte" + elif argtype == "s" or argtype == "Ns": + vector_type = "GLshort" + elif argtype == "us" or argtype == "Nus": + vector_type = "GLushort" + elif argtype == "i" or argtype == "Ni": + vector_type = "GLint" + elif argtype == "ui" or argtype == "Nui": + vector_type = "GLuint" + elif argtype == "f": + vector_type = "GLfloat" + elif argtype == "d": + vector_type = "GLdouble" + else: + print("type is %s" % argtype) + abort() + + if do_vector: + if isVertexAttrib: + func_name = 'VertexAttrib%d%sv' % (num_coords, argtype) + else: + func_name = 'Vertex%d%sv' % (num_coords,argtype) + + params = apiutil.Parameters(func_name + extSuffix) + + print('void PACK_APIENTRY crPack%sBBOX%s%s(%s)' % (func_name + extSuffix, countSuffix, + swapSuffix, apiutil.MakeDeclarationString(params))) + print('{') + + if do_vector: + # vector version + packet_length = num_coords * apiutil.sizeof(vector_type) + if isVertexAttrib: + packet_length += 4 # for index + if packet_length % 4 != 0: + packet_length += 2 + + else: + # non-vector + packet_length = apiutil.PacketLength( params ) + if isVertexAttrib: + packet_length += 0 # for index + if packet_length % 4 != 0: + packet_length += 2 + + + print("\tCR_GET_PACKER_CONTEXT(pc);") + print("\tunsigned char *data_ptr = NULL;") + + if normalized: + if argtype == "Nb": + t = "B" + elif argtype == "Ni": + t = "I" + elif argtype == "Nui": + t = "UI" + elif argtype == "Nub": + t = "UB" + elif argtype == "Ns": + t = "S" + elif argtype == "Nus": + t = "US" + else: + abort() + if do_vector: + print("\tCREATE_%dD_VFLOATS_%s_NORMALIZED();" % (num_coords, t)) + else: + print("\tCREATE_%dD_FLOATS_%s_NORMALIZED();" % (num_coords, t)) + else: + if do_vector: + print("\tCREATE_%dD_VFLOATS();" % num_coords) + else: + print("\tCREATE_%dD_FLOATS();" % num_coords) + + print("\tCR_GET_BUFFERED%s_POINTER(pc, %d);" % (countSuffix, packet_length)) + + # Bounding box code + if isVertexAttrib: + print("\tif (pc->updateBBOX && index == 0)") + else: + print("\tif (pc->updateBBOX)") + print("\t{") + if num_coords < 4: + print("\t\tUPDATE_%dD_BBOX();" % num_coords) + else: + print("\t\tUPDATE_3D_BBOX();") + print("\t}") + + if isVertexAttrib: + print("\tif (index > 0) {") + t = argtype + print("\t\tpc->current.c.vertexAttrib.%s%d[index] = data_ptr + 4;" % (t, num_coords)) + print("\t\tpc->current.attribsUsedMask |= (1 << index);") + if do_count: + print("\t\tpc->current.vtx_count--;") + + print("\t}") + + fname = func_name + extSuffix + if do_vector: + # use non-vector opcode + opcode = apiutil.OpcodeName( func_name[:-1] + extSuffix ) + else: + opcode = apiutil.OpcodeName( func_name + extSuffix ) + counter = 0 + + if do_vector: + if isVertexAttrib: + if do_swapped: + print("\tWRITE_DATA(0, GLuint, SWAP32(index));") + else: + print("\tWRITE_DATA(0, GLuint, index);") + counter += 4 + argname = params[1][0] # skip 'index' parameter + else: + argname = params[0][0] + + for index in range(num_coords): + print(WriteData( counter, vector_type, "%s[%d]" % (argname, index), do_swapped )) + counter += apiutil.sizeof(vector_type) + + if isVertexAttrib: + if do_vector == 2: + # this is a bit of a hack + print("\tWRITE_OPCODE(pc, %s);" % apiutil.OpcodeName( func_name + "ARB" )) + else: + print("\tWRITE_OPCODE(pc, %s);" % apiutil.OpcodeName( func_name[:-1] + "ARB" )) + else: + print("\tWRITE_OPCODE(pc, %s);" % apiutil.OpcodeName( func_name[:-1] )) + else: + for index in range(0,len(params)): + (name, type, vecSize) = params[index] + print(WriteData( counter, type, name, do_swapped )) + counter += apiutil.sizeof(type) + + if isVertexAttrib: + print("\tWRITE_OPCODE(pc, %s);" % apiutil.OpcodeName( func_name + "ARB" )) + else: + print("\tWRITE_OPCODE(pc, %s);" % apiutil.OpcodeName( func_name )) + + print("\tCR_UNLOCK_PACKER_CONTEXT(pc);") + + + print('}\n') + +#end PrintFunction() + + +for num_coords in [2,3,4]: + for argtype in ['d', 'f', 'i', 's']: + func_name = 'Vertex%d%s' % (num_coords, argtype) + for swap in range(0, 2): + for count in range(0, 2): + for vec in range(0, 2): + PrintFunction( func_name, "", num_coords, argtype, swap, + count, vec ) + +for num_coords in [1,2,3,4]: + for argtype in ['d', 'f', 's']: + func_name = 'VertexAttrib%d%s' % (num_coords, argtype) + for swap in range(0, 2): + for count in range(0, 2): + for vec in range(0, 2): + PrintFunction( func_name, "ARB", num_coords, argtype, swap, + count, vec ) + +# Special vector functions +moreFuncs = [ [ "VertexAttrib4ubv", "ub" ], + [ "VertexAttrib4usv", "us" ], + [ "VertexAttrib4uiv", "ui" ], + [ "VertexAttrib4bv", "b" ], + [ "VertexAttrib4iv", "i" ], + [ "VertexAttrib4Nbv", "Nb" ], + [ "VertexAttrib4Nsv", "Ns" ], + [ "VertexAttrib4Niv", "Ni" ], + [ "VertexAttrib4Nubv", "Nub" ], + [ "VertexAttrib4Nusv", "Nus" ], + [ "VertexAttrib4Nuiv", "Nui" ] + ] +for (func_name, argtype) in moreFuncs: + vec = 2 # special, hacked value + num_coords = 4 + for swap in range(0, 2): + for count in range(0, 2): + PrintFunction( func_name, "ARB", num_coords, argtype, swap, count, vec ) + +# Special non-vector functions +moreFuncs = [ [ "VertexAttrib4Nub", "Nub" ] ] +for (func_name, argtype) in moreFuncs: + vec = 0 + num_coords = 4 + for swap in range(0, 2): + for count in range(0, 2): + PrintFunction( func_name, "ARB", num_coords, argtype, swap, count, vec ) |