state_client.c revision 236b6e0fdf652661ff4c655314fe488998c5c17d
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync/* Copyright (c) 2001, Stanford University
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync * All rights reserved
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync * See the file LICENSE.txt for information on redistributing this software.
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync * This file manages all the client-side state including:
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync * Pixel pack/unpack parameters
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync * Vertex arrays
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsyncconst CRPixelPackState crStateNativePixelPacking = {
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync 0, /* rowLength */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync 0, /* skipRows */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync 0, /* skipPixels */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync 0, /* imageHeight */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync 0, /* skipImages */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* XXX why GLCLIENT_BIT_ALLOC? */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->v = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->n = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->c = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->s = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->i = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync for ( i = 0; i < CR_MAX_TEXTURE_UNITS; i++ )
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->t[i] = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->e = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->f = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync for ( i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++ )
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->a[i] = (CRbitvalue *) crCalloc(GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync unsigned int i;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* ARB multitexture */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* vertex array */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* color array */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* fog array */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* secondary color array */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* edge flag array */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* color index array */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* normal array */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* texcoord arrays */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->array.t[i].buffer = g->bufferobject.vertexBuffer;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* generic vertex attributes */
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync for (i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++) {
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync c->array.a[i].buffer = g->bufferobject.vertexBuffer;
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync * PixelStore functions are here, not in state_pixel.c because this
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync * is client-side state, like vertex arrays.
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsyncvoid STATE_APIENTRY crStatePixelStoref (GLenum pname, GLfloat param)
957e0fcedf2079feefdb1aa2d0da65e39cd8479cvboxsync /* The GL SPEC says I can do this on page 76. */
case GL_PACK_LSB_FIRST:
case GL_UNPACK_SWAP_BYTES:
case GL_UNPACK_LSB_FIRST:
FLUSH();
switch(pname) {
case GL_PACK_SWAP_BYTES:
case GL_PACK_LSB_FIRST:
case GL_PACK_ROW_LENGTH:
#ifdef CR_OPENGL_VERSION_1_2
case GL_PACK_IMAGE_HEIGHT:
case GL_PACK_SKIP_IMAGES:
case GL_PACK_SKIP_PIXELS:
case GL_PACK_SKIP_ROWS:
case GL_PACK_ALIGNMENT:
case GL_UNPACK_SWAP_BYTES:
case GL_UNPACK_LSB_FIRST:
case GL_UNPACK_ROW_LENGTH:
#ifdef CR_OPENGL_VERSION_1_2
case GL_UNPACK_IMAGE_HEIGHT:
case GL_UNPACK_SKIP_IMAGES:
case GL_UNPACK_SKIP_PIXELS:
case GL_UNPACK_SKIP_ROWS:
case GL_UNPACK_ALIGNMENT:
switch (array)
#ifdef CR_NV_vertex_program
case GL_VERTEX_ARRAY:
case GL_COLOR_ARRAY:
case GL_NORMAL_ARRAY:
case GL_INDEX_ARRAY:
case GL_TEXTURE_COORD_ARRAY:
case GL_EDGE_FLAG_ARRAY:
#ifdef CR_EXT_fog_coord
#ifdef CR_EXT_secondary_color
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "Invalid Enum passed to Enable/Disable Client State: SECONDARY_COLOR_ARRAY_EXT - EXT_secondary_color is not enabled." );
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "Invalid Enum passed to Enable/Disable Client State: 0x%x", array );
FLUSH();
FLUSH();
switch (type)
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
case GL_DOUBLE:
if (stride)
#ifdef CR_ARB_vertex_buffer_object
FLUSH();
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glVertexPointer: stride was negative: %d", stride);
FLUSH();
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glColorPointer: stride was negative: %d", stride);
FLUSH();
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glSecondaryColorPointerEXT: invalid size: %d", size);
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glSecondaryColorPointerEXT: invalid type: 0x%x", type);
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glSecondaryColorPointerEXT: stride was negative: %d", stride);
const GLvoid *p)
FLUSH();
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glIndexPointer: stride was negative: %d", stride);
const GLvoid *p)
FLUSH();
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glNormalPointer: stride was negative: %d", stride);
FLUSH();
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glTexCoordPointer: stride was negative: %d", stride);
FLUSH();
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glTexCoordPointer: stride was negative: %d", stride);
FLUSH();
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glFogCoordPointerEXT: invalid type: 0x%x", type);
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glFogCoordPointerEXT: stride was negative: %d", stride);
void STATE_APIENTRY crStateVertexAttribPointerNV(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *p)
void STATE_APIENTRY crStateVertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *p)
FLUSH();
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glVertexAttribPointerARB: invalid index: %d", (int) index);
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glVertexAttribPointerARB: invalid size: %d", size);
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glVertexAttribPointerARB: invalid type: 0x%x", type);
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glVertexAttribPointerARB: stride was negative: %d", stride);
unsigned char *base = (unsigned char *) p;
FLUSH();
if (stride < 0)
crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glInterleavedArrays: stride < 0: %d", stride);
switch (format)
case GL_T4F_C4F_N3F_V4F:
case GL_T2F_C4F_N3F_V3F:
case GL_C4F_N3F_V3F:
case GL_T4F_V4F:
case GL_T2F_C3F_V3F:
case GL_T2F_N3F_V3F:
case GL_C3F_V3F:
case GL_N3F_V3F:
case GL_T2F_C4UB_V3F:
case GL_T2F_V3F:
case GL_C4UB_V3F:
case GL_V3F:
case GL_C4UB_V2F:
case GL_V2F:
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glInterleavedArrays: Unrecognized format: %d", format);
switch (format)
case GL_T4F_C4F_N3F_V4F:
case GL_T2F_C4F_N3F_V3F:
case GL_C4F_N3F_V3F:
case GL_T4F_V4F:
case GL_T2F_C3F_V3F:
case GL_T2F_N3F_V3F:
case GL_C3F_V3F:
case GL_N3F_V3F:
case GL_T2F_C4UB_V3F:
case GL_T2F_V3F:
case GL_C4UB_V3F:
case GL_V3F:
case GL_C4UB_V2F:
case GL_V2F:
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glInterleavedArrays: Unrecognized format: %d", format);
if (stride==0)
switch (format)
case GL_T4F_C4F_N3F_V4F:
case GL_T2F_C4F_N3F_V3F:
case GL_C4F_N3F_V3F:
case GL_T2F_N3F_V3F:
case GL_N3F_V3F:
case GL_T4F_V4F:
case GL_T2F_C3F_V3F:
case GL_C3F_V3F:
case GL_T2F_C4UB_V3F:
case GL_T2F_V3F:
case GL_C4UB_V3F:
case GL_V3F:
case GL_C4UB_V2F:
case GL_V2F:
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glInterleavedArrays: Unrecognized format: %d", format);
switch (format)
case GL_T4F_C4F_N3F_V4F:
case GL_T2F_C4F_N3F_V3F:
case GL_C4F_N3F_V3F:
case GL_T2F_C3F_V3F:
case GL_C3F_V3F:
case GL_T2F_C4UB_V3F:
case GL_C4UB_V3F:
case GL_C4UB_V2F:
case GL_T2F_N3F_V3F:
case GL_N3F_V3F:
case GL_T4F_V4F:
case GL_T2F_V3F:
case GL_V3F:
case GL_V2F:
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glInterleavedArrays: Unrecognized format: %d", format);
switch (format)
case GL_T4F_C4F_N3F_V4F:
case GL_T2F_C4F_N3F_V3F:
case GL_T2F_C3F_V3F:
case GL_T2F_N3F_V3F:
case GL_T2F_C4UB_V3F:
case GL_T4F_V4F:
case GL_T2F_V3F:
case GL_C4UB_V3F:
case GL_C4UB_V2F:
case GL_C3F_V3F:
case GL_C4F_N3F_V3F:
case GL_N3F_V3F:
case GL_V3F:
case GL_V2F:
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glInterleavedArrays: Unrecognized format: %d", format);
switch (pname)
case GL_VERTEX_ARRAY_POINTER:
case GL_COLOR_ARRAY_POINTER:
case GL_NORMAL_ARRAY_POINTER:
case GL_INDEX_ARRAY_POINTER:
#ifdef CR_EXT_fog_coord
#ifdef CR_EXT_secondary_color
crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "Invalid Enum passed to glGetPointerv: SECONDARY_COLOR_ARRAY_EXT - EXT_secondary_color is not enabled." );
FLUSH();
c->pixelStoreStackDepth++;
c->vertexArrayStackDepth++;
if (c->attribStackDepth == 0) {
FLUSH();
if (c->pixelStoreStackDepth == 0) {
c->pixelStoreStackDepth--;
if (c->vertexArrayStackDepth == 0) {
c->vertexArrayStackDepth--;
#ifdef CR_ARB_vertex_buffer_object
if (!res)
return res;
return GL_FALSE;
#ifdef CR_ARB_vertex_buffer_object
return GL_TRUE;
return GL_FALSE;
return GL_FALSE;