/******************************Module*Header*******************************\ * Module Name: glarray.h * * Vertex array states. * * Created: 2-04-1996 * Author: Hock San Lee [hockl] * * Copyright (c) 1996 Microsoft Corporation \**************************************************************************/ #ifndef __glarray_h_ #define __glarray_h_ extern GLuint vaEnable[]; typedef struct { GLuint iIn; GLushort next; } VAMAP; // Vertex array structures. typedef void (FASTCALL *PFNVAELEMENTBATCH) (__GLcontext *gc, GLint firstIndex, GLint nVertices); typedef void (FASTCALL *PFNVAELEMENTBATCHINDIRECT) (__GLcontext *gc, GLint nVertices, VAMAP* indices); typedef void (FASTCALL *PFNVAELEMENT)(__GLcontext *gc, GLint i); typedef void (APIENTRY *PFNGLVECTOR)(IN const GLvoid *v); typedef struct __GLarrayEdgeFlagRec { GLuint ibytes; GLsizei stride; const GLbyte *pointer; PFNGLVECTOR pfn; PFNGLVECTOR pfnCompile; } __GLarrayEdgeFlag; typedef struct __GLarrayTexCoordRec { GLint size; GLenum type; GLuint ibytes; GLsizei stride; const GLbyte *pointer; PFNGLVECTOR pfn; PFNGLVECTOR pfnCompile; } __GLarrayTexCoord; typedef struct __GLarrayIndexRec { GLenum type; GLuint ibytes; GLsizei stride; const GLbyte *pointer; PFNGLVECTOR pfn; PFNGLVECTOR pfnCompile; } __GLarrayIndex; typedef struct __GLarrayColorRec { GLint size; GLenum type; GLuint ibytes; GLsizei stride; const GLbyte *pointer; PFNGLVECTOR pfn; PFNGLVECTOR pfnCompile; } __GLarrayColor; typedef struct __GLarrayNormalRec { GLenum type; GLuint ibytes; GLsizei stride; const GLbyte *pointer; PFNGLVECTOR pfn; PFNGLVECTOR pfnCompile; } __GLarrayNormal; typedef struct __GLarrayVertexRec { GLint size; GLenum type; GLuint ibytes; GLsizei stride; const GLbyte *pointer; PFNGLVECTOR pfn; PFNGLVECTOR pfnCompile; } __GLarrayVertex; // Vertex array states. typedef struct __GLvertexArrayRec { GLuint flags; GLuint mask; PFNVAELEMENT pfnArrayElement; PFNVAELEMENTBATCH pfnArrayElementBatch; PFNVAELEMENTBATCHINDIRECT pfnArrayElementBatchIndirect; __GLarrayEdgeFlag edgeFlag; __GLarrayTexCoord texCoord; __GLarrayIndex index; __GLarrayColor color; __GLarrayNormal normal; __GLarrayVertex vertex; } __GLvertexArray; // Vertex array flags. #define __GL_VERTEX_ARRAY_DIRTY 0x0001 // Mask that encapsulates the current vertex array settings. // It is maintained in the mask field in __GLvertexArray. // The mask is given in the following binary form in 24 bits: // // VeVsVsVtVtNeNtNtNtCeCsCtCtCtIeItItItTeTsTsTtTtEe // 232221201918171615141312111009080706050403020100 // // where V:vertex pointer, // N:normal pointer, // C:color pointer, // I:index pointer, // T:texture coord pointer, // E:edge flag pointer, // e:enable flag, // s:size field, // t:type field. #define VAMASK_EDGEFLAG_ENABLE_SHIFT 0 #define VAMASK_TEXCOORD_TYPE_SHIFT 1 #define VAMASK_TEXCOORD_SIZE_SHIFT 3 #define VAMASK_TEXCOORD_ENABLE_SHIFT 5 #define VAMASK_INDEX_TYPE_SHIFT 6 #define VAMASK_INDEX_ENABLE_SHIFT 9 #define VAMASK_COLOR_TYPE_SHIFT 10 #define VAMASK_COLOR_SIZE_SHIFT 13 #define VAMASK_COLOR_ENABLE_SHIFT 14 #define VAMASK_NORMAL_TYPE_SHIFT 15 #define VAMASK_NORMAL_ENABLE_SHIFT 18 #define VAMASK_VERTEX_TYPE_SHIFT 19 #define VAMASK_VERTEX_SIZE_SHIFT 21 #define VAMASK_VERTEX_ENABLE_SHIFT 23 #define VAMASK_EDGEFLAG_ENABLE_MASK (1 << VAMASK_EDGEFLAG_ENABLE_SHIFT) #define VAMASK_TEXCOORD_TYPE_MASK (3 << VAMASK_TEXCOORD_TYPE_SHIFT) #define VAMASK_TEXCOORD_SIZE_MASK (3 << VAMASK_TEXCOORD_SIZE_SHIFT) #define VAMASK_TEXCOORD_ENABLE_MASK (1 << VAMASK_TEXCOORD_ENABLE_SHIFT) #define VAMASK_INDEX_TYPE_MASK (7 << VAMASK_INDEX_TYPE_SHIFT) #define VAMASK_INDEX_ENABLE_MASK (1 << VAMASK_INDEX_ENABLE_SHIFT) #define VAMASK_COLOR_TYPE_MASK (7 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_SIZE_MASK (1 << VAMASK_COLOR_SIZE_SHIFT) #define VAMASK_COLOR_ENABLE_MASK (1 << VAMASK_COLOR_ENABLE_SHIFT) #define VAMASK_NORMAL_TYPE_MASK (7 << VAMASK_NORMAL_TYPE_SHIFT) #define VAMASK_NORMAL_ENABLE_MASK (1 << VAMASK_NORMAL_ENABLE_SHIFT) #define VAMASK_VERTEX_TYPE_MASK (3 << VAMASK_VERTEX_TYPE_SHIFT) #define VAMASK_VERTEX_SIZE_MASK (3 << VAMASK_VERTEX_SIZE_SHIFT) #define VAMASK_VERTEX_ENABLE_MASK (1 << VAMASK_VERTEX_ENABLE_SHIFT) #define VAMASK_EDGEFLAG_TYPE_SIZE_MASK \ (0) #define VAMASK_TEXCOORD_TYPE_SIZE_MASK \ (VAMASK_TEXCOORD_TYPE_MASK | VAMASK_TEXCOORD_SIZE_MASK) #define VAMASK_INDEX_TYPE_SIZE_MASK \ (VAMASK_INDEX_TYPE_MASK) #define VAMASK_COLOR_TYPE_SIZE_MASK \ (VAMASK_COLOR_TYPE_MASK | VAMASK_COLOR_SIZE_MASK) #define VAMASK_NORMAL_TYPE_SIZE_MASK \ (VAMASK_NORMAL_TYPE_MASK) #define VAMASK_VERTEX_TYPE_SIZE_MASK \ (VAMASK_VERTEX_TYPE_MASK | VAMASK_VERTEX_SIZE_MASK) #define VAMASK_TEXCOORD_TYPE_SHORT (0 << VAMASK_TEXCOORD_TYPE_SHIFT) #define VAMASK_TEXCOORD_TYPE_INT (1 << VAMASK_TEXCOORD_TYPE_SHIFT) #define VAMASK_TEXCOORD_TYPE_FLOAT (2 << VAMASK_TEXCOORD_TYPE_SHIFT) #define VAMASK_TEXCOORD_TYPE_DOUBLE (3 << VAMASK_TEXCOORD_TYPE_SHIFT) #define VAMASK_TEXCOORD_SIZE_1 (0 << VAMASK_TEXCOORD_SIZE_SHIFT) #define VAMASK_TEXCOORD_SIZE_2 (1 << VAMASK_TEXCOORD_SIZE_SHIFT) #define VAMASK_TEXCOORD_SIZE_3 (2 << VAMASK_TEXCOORD_SIZE_SHIFT) #define VAMASK_TEXCOORD_SIZE_4 (3 << VAMASK_TEXCOORD_SIZE_SHIFT) #define VAMASK_INDEX_TYPE_UBYTE (0 << VAMASK_INDEX_TYPE_SHIFT) #define VAMASK_INDEX_TYPE_SHORT (1 << VAMASK_INDEX_TYPE_SHIFT) #define VAMASK_INDEX_TYPE_INT (2 << VAMASK_INDEX_TYPE_SHIFT) #define VAMASK_INDEX_TYPE_FLOAT (3 << VAMASK_INDEX_TYPE_SHIFT) #define VAMASK_INDEX_TYPE_DOUBLE (4 << VAMASK_INDEX_TYPE_SHIFT) #define VAMASK_COLOR_TYPE_BYTE (0 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_TYPE_UBYTE (1 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_TYPE_SHORT (2 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_TYPE_USHORT (3 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_TYPE_INT (4 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_TYPE_UINT (5 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_TYPE_FLOAT (6 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_TYPE_DOUBLE (7 << VAMASK_COLOR_TYPE_SHIFT) #define VAMASK_COLOR_SIZE_3 (0 << VAMASK_COLOR_SIZE_SHIFT) #define VAMASK_COLOR_SIZE_4 (1 << VAMASK_COLOR_SIZE_SHIFT) #define VAMASK_NORMAL_TYPE_BYTE (0 << VAMASK_NORMAL_TYPE_SHIFT) #define VAMASK_NORMAL_TYPE_SHORT (1 << VAMASK_NORMAL_TYPE_SHIFT) #define VAMASK_NORMAL_TYPE_INT (2 << VAMASK_NORMAL_TYPE_SHIFT) #define VAMASK_NORMAL_TYPE_FLOAT (3 << VAMASK_NORMAL_TYPE_SHIFT) #define VAMASK_NORMAL_TYPE_DOUBLE (4 << VAMASK_NORMAL_TYPE_SHIFT) #define VAMASK_VERTEX_TYPE_SHORT (0 << VAMASK_VERTEX_TYPE_SHIFT) #define VAMASK_VERTEX_TYPE_INT (1 << VAMASK_VERTEX_TYPE_SHIFT) #define VAMASK_VERTEX_TYPE_FLOAT (2 << VAMASK_VERTEX_TYPE_SHIFT) #define VAMASK_VERTEX_TYPE_DOUBLE (3 << VAMASK_VERTEX_TYPE_SHIFT) #define VAMASK_VERTEX_SIZE_2 (0 << VAMASK_VERTEX_SIZE_SHIFT) #define VAMASK_VERTEX_SIZE_3 (1 << VAMASK_VERTEX_SIZE_SHIFT) #define VAMASK_VERTEX_SIZE_4 (2 << VAMASK_VERTEX_SIZE_SHIFT) // Constants used by DrawElements. Do not modify them because // glcltDrawElements assumes they have these values! #define VA_DRAWELEM_MAP_SIZE 256 #define VA_DRAWELEM_INDEX_SIZE (8*VA_DRAWELEM_MAP_SIZE) // Constants used by DrawRangeElementsEXT : currently these map identically // with DrawElements constants. #define VA_DRAWRANGEELEM_MAX_VERTICES VA_DRAWELEM_MAP_SIZE #define VA_DRAWRANGEELEM_MAX_INDICES VA_DRAWELEM_INDEX_SIZE void FASTCALL __glInitVertexArray(__GLcontext *gc); void FASTCALL VA_ValidateArrayPointers(__GLcontext *gc); void FASTCALL VA_DrawElementsBegin(POLYARRAY *pa, GLenum mode, GLsizei count); void FASTCALL VA_DrawElementsEnd(POLYARRAY *pa); void FASTCALL VA_DrawElementsFlushPartialPrimitive(POLYARRAY *pa, GLenum mode); extern GLint nReservedIndicesPartialBegin[]; typedef void (FASTCALL *pfnReducedElementsHandler) (__GLcontext *gc, GLenum mode, GLsizei iVertexCount, GLsizei iVertexBase, VAMAP *pvmVertices, GLsizei iElementCount, GLubyte *pbElements, GLboolean fPartial); void FASTCALL glcltReducedElementsHandler(__GLcontext *gc, GLenum mode, GLsizei iVertexCount, GLsizei iVertexBase, VAMAP *pvmVertices, GLsizei iElementCount, GLubyte *pbElements, GLboolean fPartial); void FASTCALL ReduceDrawElements(__GLcontext *gc, GLenum mode, GLsizei count, GLenum type, const GLvoid *pIn, pfnReducedElementsHandler pfnHandler); #endif // __glarray_h_