e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifndef CR_STATE_CLIENT_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CR_STATE_CLIENT_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_statetypes.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_limits.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_bufferobject.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_bits.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/cdefs.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern "C" {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirty[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* pixel pack/unpack */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue pack[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue unpack[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex array */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue enableClientState[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue clientPointer[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *v; /* vertex */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *n; /* normal */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *c; /* color */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *i; /* index */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *t[CR_MAX_TEXTURE_UNITS]; /* texcoord */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *e; /* edgeflag */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *s; /* secondary color */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *f; /* fog coord */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_vertex_program
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue *a[CR_MAX_VERTEX_ATTRIBS]; /* NV_vertex_program */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRClientBits;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * NOTE!!!! If you change this structure, search through the code for
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * occurrences of 'defaultPacking' and fix the static initializations!!!!
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint rowLength;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint skipRows;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint skipPixels;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint alignment;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint imageHeight;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint skipImages;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean swapBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean psLSBFirst; /* don't conflict with crap from Xlib.h */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRPixelPackState;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned char *p;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint size;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint type;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint stride;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean enabled;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean normalized; /* Added with GL_ARB_vertex_program */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int bytesPerIndex;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_vertex_buffer_object
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRBufferObject *buffer;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync#ifdef CR_EXT_compiled_vertex_array
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLboolean locked;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync unsigned char *prevPtr;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLint prevStride;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRClientPointer;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer v; /* vertex */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer n; /* normal */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer c; /* color */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer i; /* color index */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer t[CR_MAX_TEXTURE_UNITS]; /* texcoords */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer e; /* edge flags */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer s; /* secondary color */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer f; /* fog coord */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_vertex_program
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientPointer a[CR_MAX_VERTEX_ATTRIBS]; /* vertex attribs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_vertex_array_range
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean arrayRange;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean arrayRangeValid;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync void *arrayRangePointer;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint arrayRangeLength;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync#ifdef CR_EXT_compiled_vertex_array
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLint lockFirst;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLint lockCount;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLboolean locked;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync# ifdef IN_GUEST
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLboolean synced;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync# endif
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRVertexArrays;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync#define CRSTATECLIENT_MAX_VERTEXARRAYS (7+CR_MAX_TEXTURE_UNITS+CR_MAX_VERTEX_ATTRIBS)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* pixel pack/unpack */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRPixelPackState pack;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRPixelPackState unpack;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRVertexArrays array;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint curClientTextureUnit;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* state stacks (glPush/PopClientState) */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint attribStackDepth;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue pushMaskStack[CR_MAX_CLIENT_ATTRIB_STACK_DEPTH];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint pixelStoreStackDepth;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRPixelPackState pixelPackStoreStack[CR_MAX_CLIENT_ATTRIB_STACK_DEPTH];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRPixelPackState pixelUnpackStoreStack[CR_MAX_CLIENT_ATTRIB_STACK_DEPTH];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint vertexArrayStackDepth;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRVertexArrays vertexArrayStack[CR_MAX_CLIENT_ATTRIB_STACK_DEPTH];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRClientState;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern const CRPixelPackState crStateNativePixelPacking;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
ef2097f13c2179b2ee9689e9cf2c0a0ce52231f9vboxsyncstruct CRContext;
ef2097f13c2179b2ee9689e9cf2c0a0ce52231f9vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crStateClientInitBits(CRClientBits *c);
1e74d5ef6d6f0f4363c04e17cfec55784144811bvboxsyncDECLEXPORT(void) crStateClientDestroyBits(CRClientBits *c);
0e30fe79e4624e42422e7eb3232c41f1832d69d9vboxsyncDECLEXPORT(void) crStateClientInit(struct CRContext *g);
0e30fe79e4624e42422e7eb3232c41f1832d69d9vboxsyncDECLEXPORT(void) crStateClientDestroy(struct CRContext *g);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(GLboolean) crStateUseServerArrays(void);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(GLboolean) crStateUseServerArrayElements(void);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsyncDECLEXPORT(CRClientPointer*) crStateGetClientPointerByIndex(int index, CRVertexArrays *array);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif /* CR_CLIENT_H */