/****************************************************************************
* PROJECT: Balloon 3D Graphics Subsystem for Squeak
* FILE: b3dAlloc.h
* CONTENT: Memory allocation for the Balloon 3D rasterizer
*
* AUTHOR: Andreas Raab (ar)
* ADDRESS: Walt Disney Imagineering, Glendale, CA
* EMAIL: andreasr@wdi.disney.com
* RCSID: $Id: b3dAlloc.h 2 2001-10-24 23:11:49Z rowledge $
*
* NOTES:
*
*
*****************************************************************************/
#ifndef B3D_ALLOC_H
#define B3D_ALLOC_H
#include "b3dTypes.h"
/************************ Allocator definitions ************************/
#define B3D_EDGE_ALLOC_MAGIC 0x45443341
typedef struct B3DEdgeAllocList {
int magic;
void *This;
int max; /* Note: size is ALWAYS less than max */
int size;
int nFree;
B3DPrimitiveEdge *firstFree; /* pointer to the first free edge (< max) */
B3DPrimitiveEdge data[1];
} B3DEdgeAllocList;
#define B3D_FACE_ALLOC_MAGIC 0x46443341
typedef struct B3DFaceAllocList {
int magic;
void *This;
int max; /* Note: size is ALWAYS less than max */
int size;
int nFree;
B3DPrimitiveFace *firstFree; /* pointer to the first free face (< max) */
B3DPrimitiveFace data[1];
} B3DFaceAllocList;
#define B3D_ATTR_ALLOC_MAGIC 0x41443341
typedef struct B3DAttrAllocList {
int magic;
void *This;
int max; /* Note: size is ALWAYS less than max */
int size;
int nFree;
B3DPrimitiveAttribute *firstFree; /* pointer to the first free attribute (< max) */
B3DPrimitiveAttribute data[1];
} B3DAttrAllocList;
/* The mapping from face flags to the number of attributes needed */
extern int B3D_ATTRIBUTE_SIZES[B3D_MAX_ATTRIBUTES];
#define B3D_FACE_ATTRIB_SIZE(face) (B3D_ATTRIBUTE_SIZES[(face->flags >> B3D_ATTR_SHIFT) & B3D_ATTR_MASK])
#ifdef DEBUG_ALLOC
B3DPrimitiveFace *dbg_b3dAllocFace(B3DFaceAllocList *list);
B3DPrimitiveEdge *dbg_b3dAllocEdge(B3DEdgeAllocList *list);
int dbg_b3dAllocAttrib(B3DAttrAllocList *attrList, B3DPrimitiveFace *face);
void dbg_b3dFreeFace(B3DFaceAllocList *list, B3DPrimitiveFace *face);
void dbg_b3dFreeEdge(B3DEdgeAllocList *list, B3DPrimitiveEdge *edge);
void dbg_b3dFreeAttrib(B3DAttrAllocList *list, B3DPrimitiveFace *face);
#define b3dAllocFace(list, face) face = dbg_b3dAllocFace(list);
#define b3dAllocEdge(list, edge) edge = dbg_b3dAllocEdge(list);
#define b3dAllocAttrib(attrList, face, result) result = dbg_b3dAllocAttrib(attrList, face);
#define b3dFreeFace(list, face) dbg_b3dFreeFace(list, face);
#define b3dFreeEdge(list, edge) dbg_b3dFreeEdge(list, edge);
#define b3dFreeAttrib(list, face) dbg_b3dFreeAttrib(list, face);
#else /* RELEASE */
#define b3dAlloc(list,object) \
{\
if(list->firstFree) { \
object = list->firstFree; \
list->firstFree = object->nextFree; \
object->flags = B3D_ALLOC_FLAG; \
list->nFree--;\
} else { \
if(list->size < list->max) { \
object = list->data + list->size; \
list->size++;\
object->flags = B3D_ALLOC_FLAG;\
list->nFree--;\
} else object = NULL;\
}\
}
#define b3dFree(list, object) \
{\
object->flags = 0;\
object->nextFree = list->firstFree; \
list->firstFree = object;\
list->nFree++;\
}
#define b3dAllocFace(list, face) b3dAlloc(list,face)
#define b3dAllocEdge(list, edge) b3dAlloc(list, edge)
#define b3dFreeFace(list, face) b3dFree(list, face)
#define b3dFreeEdge(list, edge) b3dFree(list, edge)
#define b3dAllocSingleAttr(list,object) \
{\
if(list->firstFree) { \
object = list->firstFree; \
list->firstFree = object->next; \
list->nFree--;\
} else { \
if(list->size < list->max) { \
object = list->data + list->size; \
list->size++;\
list->nFree--;\
} else object = NULL;\
}\
}
#define b3dAllocAttrib(attrList,face, result) \
{\
B3DPrimitiveAttribute *firstAttr, *nextAttr;\
int nAttrs = 0;\
\
if(face->flags & B3D_FACE_RGB) nAttrs += 3;\
if(face->flags & B3D_FACE_ALPHA) nAttrs += 1;\
if(face->flags & B3D_FACE_STW) nAttrs += 3;\
firstAttr = nextAttr = NULL;\
while(nAttrs--) {\
b3dAllocSingleAttr(attrList, nextAttr);\
if(!nextAttr) break;\
nextAttr->next = firstAttr;\
firstAttr = nextAttr;\
};\
face->attributes = firstAttr;\
result = nextAttr != NULL;\
}
#define b3dFreeAttrib(list, face) \
{\
B3DPrimitiveAttribute *attr, *nextAttr = face->attributes;\
while(nextAttr) {\
attr = nextAttr;\
nextAttr = attr->next;\
attr->next = list->firstFree;\
list->firstFree = attr;\
list->nFree++;\
}\
}
#endif
#endif /* ifndef B3D_ALLOC_H */
|