e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Dirty bits for per-context program state. Per-program dirty bits
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * are in the CRProgram structure.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue vertexAttribArrayEnable[CR_MAX_VERTEX_ATTRIBS][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue map1AttribArrayEnable[CR_MAX_VERTEX_ATTRIBS][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue map2AttribArrayEnable[CR_MAX_VERTEX_ATTRIBS][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* per-param flags: */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue vertexEnvParameter[CR_MAX_VERTEX_PROGRAM_ENV_PARAMS][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue fragmentEnvParameter[CR_MAX_FRAGMENT_PROGRAM_ENV_PARAMS][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* any param flags: */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue trackMatrix[CR_MAX_VERTEX_PROGRAM_ENV_PARAMS / 4][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Fragment programs have named symbols which are defined/declared
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * within the fragment program that can also be set with the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * glProgramNamedParameter4*NV() functions.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * We keep a linked list of these CRProgramSymbol structures to implement
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * a symbol table. A simple linked list is sufficient since a fragment
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * program typically has just a few symbols.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * A vertex or fragment program.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean isARBprogram; /* to distinguish between NV and ARB programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set with ProgramNamedParameterNV */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set with ProgramLocalParameterARB: */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat parameters[CR_MAX_PROGRAM_LOCAL_PARAMS][4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* ARB info (this could be impossible to implement without parsing */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirtyParam[CR_MAX_PROGRAM_LOCAL_PARAMS][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* tracking matrices for vertex programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum TrackMatrix[CR_MAX_VERTEX_PROGRAM_LOCAL_PARAMS / 4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum TrackMatrixTransform[CR_MAX_VERTEX_PROGRAM_LOCAL_PARAMS / 4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* global/env params shared by all programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat fragmentParameters[CR_MAX_FRAGMENT_PROGRAM_ENV_PARAMS][4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat vertexParameters[CR_MAX_VERTEX_PROGRAM_ENV_PARAMS][4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRHashTable *programHash; /* XXX belongs in shared state, actually */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean vpEnabled; /* GL_VERTEX_PROGRAM_NV / ARB*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean fpEnabledARB; /* GL_FRAGMENT_PROGRAM_ARB */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Indicates that we have to resend program data to GPU on first glMakeCurrent call with owning context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(void) crStateProgramInit(CRContext *ctx);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(void) crStateProgramDestroy(CRContext *ctx);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(void) crStateProgramDiff(CRProgramBits *b, CRbitvalue *bitID,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(void) crStateProgramSwitch(CRProgramBits *b, CRbitvalue *bitID,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crStateDiffAllPrograms(CRContext *g, CRbitvalue *bitID, GLboolean bForceUpdate);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif /* CR_STATE_PROGRAM_H */