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_PROGRAM_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CR_STATE_PROGRAM_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_hash.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_statetypes.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_limits.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/cdefs.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Dirty bits for per-context program state. Per-program dirty bits
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * are in the CRProgram structure.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirty[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue vpEnable[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue fpEnable[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue vpBinding[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue fpBinding[CR_MAX_BITARRAY];
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 vertexEnvParameters[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue fragmentEnvParameters[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue trackMatrix[CR_MAX_VERTEX_PROGRAM_ENV_PARAMS / 4][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRProgramBits;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
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 */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct CRProgramSymbol {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *name;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint cbName;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat value[4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirty[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync struct CRProgramSymbol *next;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRProgramSymbol;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * A vertex or fragment program.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum target;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean isARBprogram; /* to distinguish between NV and ARB programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLubyte *string;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLsizei length;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean resident;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum format;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set with ProgramNamedParameterNV */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync struct CRProgramSymbol *symbolTable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set with ProgramLocalParameterARB: */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat parameters[CR_MAX_PROGRAM_LOCAL_PARAMS][4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* ARB info (this could be impossible to implement without parsing */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numTemporaries;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numParameters;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numAttributes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numAddressRegs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numAluInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numTexInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numTexIndirections;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirtyNamedParams[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirtyParam[CR_MAX_PROGRAM_LOCAL_PARAMS][CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirtyParams[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirtyProgram[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint errorPos;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLubyte *errorString;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean loadedProgram; /* XXX temporary */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *defaultVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *defaultFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
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
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
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRHashTable *programHash; /* XXX belongs in shared state, actually */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint vpProgramBinding;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint fpProgramBinding;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean vpEnabled; /* GL_VERTEX_PROGRAM_NV / ARB*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean fpEnabled; /* GL_FRAGMENT_PROGRAM_NV */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean fpEnabledARB; /* GL_FRAGMENT_PROGRAM_ARB */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean vpPointSize; /* GL_VERTEX_PROGRAM_NV */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean vpTwoSide; /* GL_VERTEX_PROGRAM_NV */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Indicates that we have to resend program data to GPU on first glMakeCurrent call with owning context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean bResyncNeeded;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRProgramState;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(void) crStateProgramInit(CRContext *ctx);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(void) crStateProgramDestroy(CRContext *ctx);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(void) crStateProgramDiff(CRProgramBits *b, CRbitvalue *bitID,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *fromCtx, CRContext *toCtx);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(void) crStateProgramSwitch(CRProgramBits *b, CRbitvalue *bitID,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *fromCtx, CRContext *toCtx);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crStateDiffAllPrograms(CRContext *g, CRbitvalue *bitID, GLboolean bForceUpdate);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif /* CR_STATE_PROGRAM_H */