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#include "state.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state_internals.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_string.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * General notes:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Vertex programs can change vertices so bounding boxes may not be
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * practical for tilesort. Tilesort may have to broadcast geometry
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * when vertex programs are in effect. We could semi-parse vertex
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * programs to determine if they write to the o[HPOS] register.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Lookup the named program and return a pointer to it.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * If the program doesn't exist, create it and reserve its Id and put
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * it into the hash table.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic CRProgram *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGetProgram(CRProgramState *p, GLenum target, GLuint id)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = crHashtableSearch(p->programHash, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = (CRProgram *) crCalloc(sizeof(CRProgram));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->target = target;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->id = id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->format = GL_PROGRAM_FORMAT_ASCII_ARB;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->resident = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->symbolTable = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (id > 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd(p->programHash, id, (void *) prog);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Delete a CRProgram object and all attached data.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDeleteProgram(CRProgram *prog)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramSymbol *symbol, *next;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog->string)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree((void *) prog->string);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (symbol = prog->symbolTable; symbol; symbol = next) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync next = symbol->next;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree((void *) symbol->name);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree(symbol);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree(prog);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Set the named symbol to the value (x, y, z, w).
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * NOTE: Symbols should only really be added during parsing of the program.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * However, the state tracker does not parse the programs (yet). So, when
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * someone calls glProgramNamedParameter4fNV() we always enter the symbol
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * since we don't know if it's really valid or not.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncSetProgramSymbol(CRProgram *prog, const char *name, GLsizei len,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat x, GLfloat y, GLfloat z, GLfloat w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramSymbol *symbol;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (symbol = prog->symbolTable; symbol; symbol = symbol->next) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* NOTE: <name> may not be null-terminated! */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (crStrncmp(symbol->name, name, len) == 0 && symbol->name[len] == 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* found it */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[0] = x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[1] = y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[2] = z;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[3] = w;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FILLDIRTY(symbol->dirty);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* add new symbol table entry */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol = (CRProgramSymbol *) crAlloc(sizeof(CRProgramSymbol));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (symbol) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->name = crStrndup(name, len);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->cbName = len;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[0] = x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[1] = y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[2] = z;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[3] = w;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->next = prog->symbolTable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->symbolTable = symbol;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FILLDIRTY(symbol->dirty);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Return a pointer to the values for the given symbol. Return NULL if
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * the name doesn't exist in the symbol table.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic const GLfloat *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGetProgramSymbol(const CRProgram *prog, const char *name, GLsizei len)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramSymbol *symbol = prog->symbolTable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (symbol = prog->symbolTable; symbol; symbol = symbol->next) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* NOTE: <name> may not be null-terminated! */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (crStrncmp(symbol->name, name, len) == 0 && symbol->name[len] == 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return symbol->value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Used by both glBindProgramNV and glBindProgramARB
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic CRProgram *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncBindProgram(GLenum target, GLuint id,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum vertexTarget, GLenum fragmentTarget)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glBindProgram called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (id == 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == vertexTarget) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->defaultVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == fragmentTarget) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->defaultFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glBindProgram(bad target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = GetProgram(p, target, id );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_OUT_OF_MEMORY, "glBindProgram");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (prog->target != target) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glBindProgram target mismatch");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == vertexTarget) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->currentVertexProgram = prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vpProgramBinding = id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->vpBinding, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == fragmentTarget) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->currentFragmentProgram = prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fpProgramBinding = id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->fpBinding, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateBindProgramNV(GLenum target, GLuint id)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog = BindProgram(target, id, GL_VERTEX_PROGRAM_NV,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GL_FRAGMENT_PROGRAM_NV);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->isARBprogram = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateBindProgramARB(GLenum target, GLuint id)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog = BindProgram(target, id, GL_VERTEX_PROGRAM_ARB,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GL_FRAGMENT_PROGRAM_ARB);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->isARBprogram = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateDeleteProgramsARB(GLsizei n, const GLuint *ids)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glDeleteProgramsNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (n < 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glDeleteProgramsNV(n)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < n; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (ids[i] > 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = (CRProgram *) crHashtableSearch(p->programHash, ids[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog == p->currentVertexProgram) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->currentVertexProgram = p->defaultVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->vpBinding, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (prog == p->currentFragmentProgram) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->currentFragmentProgram = p->defaultFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->fpBinding, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DeleteProgram(prog);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableDelete(p->programHash, ids[i], GL_FALSE);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Hmmm, this is really hard to do if we don't actually execute
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * the program in a software simulation.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void)params;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void)target;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void)id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGenProgramsNV(GLsizei n, GLuint *ids)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
7bcc9300d10d0bd2c659be811f360748ecbc8274vboxsync crStateGenNames(g, p->programHash, n, ids);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGenProgramsARB(GLsizei n, GLuint *ids)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateGenProgramsNV(n, ids);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean STATE_APIENTRY crStateIsProgramARB(GLuint id)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glIsProgram called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (id == 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glIsProgram(id==0)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = (CRProgram *) crHashtableSearch(p->programHash, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean STATE_APIENTRY crStateAreProgramsResidentNV(GLsizei n, const GLuint *ids, GLboolean *residences)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean retVal = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (n < 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glAreProgramsResidentNV(n)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < n; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (ids[i] == 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glAreProgramsResidentNV(id)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = (CRProgram *) crHashtableSearch(p->programHash, ids[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glAreProgramsResidentNV(id)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog->resident) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync retVal = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (retVal == GL_FALSE) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < n; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog = (CRProgram *)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableSearch(p->programHash, ids[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync residences[i] = prog->resident;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return retVal;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateRequestResidentProgramsNV(GLsizei n, const GLuint *ids)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glRequestResidentProgramsNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (n < 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glRequestResidentProgramsNV(n<0)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < n ; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog = (CRProgram *) crHashtableSearch(p->programHash, ids[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->resident = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateLoadProgramNV(GLenum target, GLuint id, GLsizei len,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLubyte *program)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLubyte *progCopy;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glLoadProgramNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (id == 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glLoadProgramNV(id==0)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = GetProgram(p, target, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_OUT_OF_MEMORY, "glLoadProgramNV");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (prog && prog->target != target) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glLoadProgramNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync progCopy = crAlloc(len);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!progCopy) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_OUT_OF_MEMORY, "glLoadProgramNV");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (crStrncmp((const char *) program,"!!FP1.0", 7) != 0
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && crStrncmp((const char *) program,"!!FCP1.0", 8) != 0
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && crStrncmp((const char *) program,"!!VP1.0", 7) != 0
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && crStrncmp((const char *) program,"!!VP1.1", 7) != 0
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && crStrncmp((const char *) program,"!!VP2.0", 7) != 0
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && crStrncmp((const char *) program,"!!VSP1.0", 8) != 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glLoadProgramNV");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("program = (%s)\n",program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy(progCopy, program, len);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog->string)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree((void *) prog->string);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->string = progCopy;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->length = len;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->isARBprogram = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(prog->dirtyProgram, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramStringARB(GLenum target, GLenum format,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLsizei len, const GLvoid *string)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLubyte *progCopy;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramStringARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (format != GL_PROGRAM_FORMAT_ASCII_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramStringARB(format)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_FRAGMENT_PROGRAM_ARB
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == GL_VERTEX_PROGRAM_ARB
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && g->extensions.ARB_vertex_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramStringARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(prog);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync progCopy = crAlloc(len);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!progCopy) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_OUT_OF_MEMORY, "glProgramStringARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (crStrncmp(string,"!!ARBvp1.0", 10) != 0
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && crStrncmp(string,"!!ARBfp1.0", 10) != 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "glProgramStringARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy(progCopy, string, len);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog->string)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree((void *) prog->string);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->string = progCopy;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->length = len;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->format = format;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->isARBprogram = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(prog->dirtyProgram, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramivNV(GLuint id, GLenum pname, GLint *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramivNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (id == 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramivNV(bad id)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = (CRProgram *) crHashtableSearch(p->programHash, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramivNV(bad id)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (pname) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_TARGET_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->target;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_LENGTH_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->length;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_RESIDENT_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->resident;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramivNV(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramStringNV(GLuint id, GLenum pname, GLubyte *program)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname != GL_PROGRAM_STRING_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramStringNV(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramStringNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (id == 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramStringNV(bad id)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = (CRProgram *) crHashtableSearch(p->programHash, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramStringNV(bad id)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy(program, prog->string, prog->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramStringARB(GLenum target, GLenum pname, GLvoid *string)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == GL_FRAGMENT_PROGRAM_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramStringNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname != GL_PROGRAM_STRING_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramStringNV(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramStringNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy(string, prog->string, prog->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramParameter4dNV(GLenum target, GLuint index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLdouble x, GLdouble y, GLdouble z, GLdouble w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramParameter4fNV(target, index, (GLfloat) x, (GLfloat) y,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (GLfloat) z, (GLfloat) w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramParameter4dvNV(GLenum target, GLuint index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramParameter4fNV(target, index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (GLfloat) params[0], (GLfloat) params[1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (GLfloat) params[2], (GLfloat) params[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramParameter4fNV(GLenum target, GLuint index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat x, GLfloat y, GLfloat z, GLfloat w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameterNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index < g->limits.maxVertexProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index][0] = x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index][1] = y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index][2] = z;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index][3] = w;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->vertexEnvParameter[index], g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->vertexEnvParameters, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameterNV(index=%d)", index);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameterNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramParameter4fvNV(GLenum target, GLuint index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramParameter4fNV(target, index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0], params[1], params[2], params[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramParameters4dvNV(GLenum target, GLuint index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint num, const GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameters4dvNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index + num < g->limits.maxVertexProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < num; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index+i][0] = (GLfloat) params[i*4+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index+i][1] = (GLfloat) params[i*4+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index+i][2] = (GLfloat) params[i*4+2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index+i][3] = (GLfloat) params[i*4+3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->vertexEnvParameters, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameters4dvNV(index+num)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameterNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramParameters4fvNV(GLenum target, GLuint index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint num, const GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameters4dvNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index + num < g->limits.maxVertexProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < num; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index+i][0] = params[i*4+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index+i][1] = params[i*4+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index+i][2] = params[i*4+2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index+i][3] = params[i*4+3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->vertexEnvParameters, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameters4dvNV(index+num)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramParameterNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramParameterfvNV(GLenum target, GLuint index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum pname, GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramParameterfvNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname == GL_PROGRAM_PARAMETER_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index < g->limits.maxVertexProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = p->vertexParameters[index][0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = p->vertexParameters[index][1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = p->vertexParameters[index][2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = p->vertexParameters[index][3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramParameterfvNV(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramParameterfvNV(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramParameterfvNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramParameterdvNV(GLenum target, GLuint index,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum pname, GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramParameterdvNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname == GL_PROGRAM_PARAMETER_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index < g->limits.maxVertexProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = p->vertexParameters[index][0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = p->vertexParameters[index][1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = p->vertexParameters[index][2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = p->vertexParameters[index][3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramParameterdvNV(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramParameterdvNV(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramParameterdvNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateTrackMatrixNV(GLenum target, GLuint address,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum matrix, GLenum transform)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetTrackMatrixivNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (address & 0x3) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* addr must be multiple of four */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glTrackMatrixNV(address)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (matrix) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_NONE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MODELVIEW:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROJECTION:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_COLOR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MODELVIEW_PROJECTION_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MATRIX0_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MATRIX1_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MATRIX2_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MATRIX3_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MATRIX4_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MATRIX5_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MATRIX6_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MATRIX7_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE0_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE1_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE2_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE3_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE4_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE5_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE6_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE7_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* OK, fallthrough */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glTrackMatrixNV(matrix = %x)",matrix);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (transform) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_IDENTITY_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INVERSE_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TRANSPOSE_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INVERSE_TRANSPOSE_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* OK, fallthrough */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glTrackMatrixNV(transform = %x)",transform);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->TrackMatrix[address / 4] = matrix;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->TrackMatrixTransform[address / 4] = transform;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->trackMatrix[address/4], g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glTrackMatrixNV(target = %x)",target);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetTrackMatrixivNV(GLenum target, GLuint address,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum pname, GLint *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetTrackMatrixivNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if ((address & 0x3) || address >= g->limits.maxVertexProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetTrackMatrixivNV(address)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname == GL_TRACK_MATRIX_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLint) p->TrackMatrix[address / 4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (pname == GL_TRACK_MATRIX_TRANSFORM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLint) p->TrackMatrixTransform[address / 4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetTrackMatrixivNV(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetTrackMatrixivNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* init vars to prevent compiler warnings/errors */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat floatParams[4] = { 0.0, 0.0, 0.0, 0.0 };
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateGetVertexAttribfvNV(index, pname, floatParams);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = floatParams[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname == GL_CURRENT_ATTRIB_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = floatParams[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = floatParams[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = floatParams[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetVertexAttribfvNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= CR_MAX_VERTEX_ATTRIBS) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetVertexAttribfvNV(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (pname) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_ATTRIB_ARRAY_SIZE_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLfloat) g->client.array.a[index].size;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_ATTRIB_ARRAY_STRIDE_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLfloat) g->client.array.a[index].stride;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_ATTRIB_ARRAY_TYPE_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLfloat) g->client.array.a[index].type;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_CURRENT_ATTRIB_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateCurrentRecover();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync COPY_4V(params , g->current.vertexAttrib[index]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glGetVertexAttribfvNV");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetVertexAttribivNV(GLuint index, GLenum pname, GLint *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* init vars to prevent compiler warnings/errors */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat floatParams[4] = { 0.0, 0.0, 0.0, 0.0 };
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateGetVertexAttribfvNV(index, pname, floatParams);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLint) floatParams[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname == GL_CURRENT_ATTRIB_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = (GLint) floatParams[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = (GLint) floatParams[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = (GLint) floatParams[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetVertexAttribfvARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= CR_MAX_VERTEX_ATTRIBS) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetVertexAttribfvARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (pname) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLfloat) g->client.array.a[index].enabled;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLfloat) g->client.array.a[index].size;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLfloat) g->client.array.a[index].stride;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLfloat) g->client.array.a[index].type;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLfloat) g->client.array.a[index].normalized;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_CURRENT_VERTEX_ATTRIB_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateCurrentRecover();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync COPY_4V(params , g->current.vertexAttrib[index]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glGetVertexAttribfvARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetVertexAttribivARB(GLuint index, GLenum pname, GLint *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* init vars to prevent compiler warnings/errors */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat floatParams[4] = { 0.0, 0.0, 0.0, 0.0 };
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateGetVertexAttribfvARB(index, pname, floatParams);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = (GLint) floatParams[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = (GLint) floatParams[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = (GLint) floatParams[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = (GLint) floatParams[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* init vars to prevent compiler warnings/errors */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat floatParams[4] = { 0.0, 0.0, 0.0, 0.0 };
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateGetVertexAttribfvARB(index, pname, floatParams);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = floatParams[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = floatParams[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = floatParams[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = floatParams[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**********************************************************************/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Added by GL_NV_fragment_program
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramNamedParameterfNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = (CRProgram *) crHashtableSearch(p->programHash, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramNamedParameterNV(bad id %d)", id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog->target != GL_FRAGMENT_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramNamedParameterNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SetProgramSymbol(prog, (const char *)name, len, x, y, z, w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(prog->dirtyNamedParams, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramNamedParameter4fNV(id, len, name, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name, const GLfloat v[])
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramNamedParameter4fNV(id, len, name, v[0], v[1], v[2], v[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name, const GLdouble v[])
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramNamedParameter4fNV(id, len, name, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name, GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLfloat *value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramNamedParameterfNV called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = (const CRProgram *) crHashtableSearch(p->programHash, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramNamedParameterNV(bad id)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (prog->target != GL_FRAGMENT_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramNamedParameterNV(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync value = GetProgramSymbol(prog, (const char *)name, len);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!value) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramNamedParameterNV(name)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = value[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = value[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = value[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = value[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte *name, GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat floatParams[4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateGetProgramNamedParameterfvNV(id, len, name, floatParams);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = floatParams[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = floatParams[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = floatParams[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = floatParams[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramLocalParameter4fARB(target, index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramLocalParameter4fARB(target, index, (GLfloat) params[0], (GLfloat) params[1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (GLfloat) params[2], (GLfloat) params[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramLocalParameterARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_FRAGMENT_PROGRAM_ARB || target == GL_FRAGMENT_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= CR_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMS) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramLocalParameterARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == GL_VERTEX_PROGRAM_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= CR_MAX_VERTEX_PROGRAM_LOCAL_PARAMS) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramLocalParameterARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramLocalParameterARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(prog);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->parameters[index][0] = x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->parameters[index][1] = y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->parameters[index][2] = z;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog->parameters[index][3] = w;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(prog->dirtyParam[index], g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(prog->dirtyParams, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramLocalParameter4fARB(target, index, params[0], params[1], params[2], params[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const CRProgram *prog = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramLocalParameterARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_FRAGMENT_PROGRAM_ARB || target == GL_FRAGMENT_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= g->limits.maxFragmentProgramLocalParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramLocalParameterARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == GL_VERTEX_PROGRAM_ARB || target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= g->limits.maxVertexProgramLocalParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramLocalParameterARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramLocalParameterARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramLocalParameterARB(no program)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!prog) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramLocalParameterARB(no program)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(prog);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(index < CR_MAX_PROGRAM_LOCAL_PARAMS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = prog->parameters[index][0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = prog->parameters[index][1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = prog->parameters[index][2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = prog->parameters[index][3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat floatParams[4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateGetProgramLocalParameterfvARB(target, index, floatParams);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = floatParams[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = floatParams[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = floatParams[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = floatParams[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramivARB(GLenum target, GLenum pname, GLint *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramivARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == GL_FRAGMENT_PROGRAM_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync prog = p->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramivARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(prog);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (pname) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_LENGTH_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->length;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_FORMAT_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->format;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_BINDING_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_TEMPORARIES_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numTemporaries;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_TEMPORARIES_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramTemps;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramTemps;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_NATIVE_TEMPORARIES_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_PROGRAM_TEMPORARIES_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numTemporaries;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_MAX_PROGRAM_TEMPORARIES_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramTemps;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramTemps;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_PARAMETERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numParameters;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_PARAMETERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramLocalParams;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramLocalParams;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_NATIVE_PARAMETERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numParameters;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramLocalParams;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramLocalParams;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_ATTRIBS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numAttributes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_ATTRIBS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramAttribs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramAttribs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_NATIVE_ATTRIBS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_PROGRAM_ATTRIBS_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numAttributes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_MAX_PROGRAM_ATTRIBS_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramAttribs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramAttribs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_ADDRESS_REGISTERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numAddressRegs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramAddressRegs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramAddressRegs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_PROGRAM_ADDRESS_REGISTERS_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numAddressRegs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramAddressRegs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramAddressRegs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramLocalParams;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramLocalParams;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_VERTEX_PROGRAM_ARB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxVertexProgramEnvParams;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramEnvParams;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX ok? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * These are for fragment programs only
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_ALU_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numAluInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_TEX_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numTexInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_TEX_INDIRECTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numTexIndirections;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_PROGRAM_ALU_INSTRUCTIONS_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numAluInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX same as GL_PROGRAM_ALU_INSTRUCTIONS_ARB? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numTexInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = prog->numTexIndirections;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramAluInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramTexInstructions;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_FRAGMENT_PROGRAM_ARB || !g->extensions.ARB_fragment_program) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(target or pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = g->limits.maxFragmentProgramTexIndirections;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "crStateGetProgramivARB(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* XXX maybe move these two functions into state_client.c? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateDisableVertexAttribArrayARB(GLuint index)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientState *c = &(g->client);
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync CRStateBits *sb = GetCurrentBits();
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync CRClientBits *cb = &(sb->client);
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= g->limits.maxVertexProgramAttribs) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
6ff14916eae1a5211d0fd98247f489cc0bd0959bvboxsync "glDisableVertexAttribArrayARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync c->array.a[index].enabled = GL_FALSE;
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync DIRTY(cb->dirty, g->neg_bitid);
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync DIRTY(cb->enableClientState, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateEnableVertexAttribArrayARB(GLuint index)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRClientState *c = &(g->client);
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync CRStateBits *sb = GetCurrentBits();
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync CRClientBits *cb = &(sb->client);
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= g->limits.maxVertexProgramAttribs) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glEnableVertexAttribArrayARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync c->array.a[index].enabled = GL_TRUE;
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync DIRTY(cb->dirty, g->neg_bitid);
28a247e967c544c8089d1ea01b4610b8311c64c6vboxsync DIRTY(cb->enableClientState, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramEnvParameterdvARB(GLenum target, GLuint index, GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat fparams[4];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateGetProgramEnvParameterfvARB(target, index, fparams);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = fparams[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = fparams[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = fparams[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = fparams[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateGetProgramEnvParameterfvARB(GLenum target, GLuint index, GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramEnvParameterARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_FRAGMENT_PROGRAM_ARB || target == GL_FRAGMENT_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= g->limits.maxFragmentProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramEnvParameterARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = p->fragmentParameters[index][0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = p->fragmentParameters[index][1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = p->fragmentParameters[index][2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = p->fragmentParameters[index][3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == GL_VERTEX_PROGRAM_ARB || target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= g->limits.maxVertexProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramEnvParameterARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[0] = p->vertexParameters[index][0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[1] = p->vertexParameters[index][1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[2] = p->vertexParameters[index][2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync params[3] = p->vertexParameters[index][3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetProgramEnvParameterARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramEnvParameter4fARB(target, index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramEnvParameter4fARB(target, index, (GLfloat) params[0], (GLfloat) params[1], (GLfloat) params[2], (GLfloat) params[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(g->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramEnvParameterARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target == GL_FRAGMENT_PROGRAM_ARB || target == GL_FRAGMENT_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= g->limits.maxFragmentProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramEnvParameterARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fragmentParameters[index][0] = x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fragmentParameters[index][1] = y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fragmentParameters[index][2] = z;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fragmentParameters[index][3] = w;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->fragmentEnvParameter[index], g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->fragmentEnvParameters, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (target == GL_VERTEX_PROGRAM_ARB || target == GL_VERTEX_PROGRAM_NV) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (index >= g->limits.maxVertexProgramEnvParams) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramEnvParameterARB(index)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index][0] = x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index][1] = y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index][2] = z;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[index][3] = w;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->vertexEnvParameter[index], g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->vertexEnvParameters, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glProgramEnvParameterARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(pb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateProgramEnvParameter4fARB(target, index, params[0], params[1], params[2], params[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**********************************************************************/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crStateProgramInit( CRContext *ctx )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(ctx->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *sb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramBits *pb = &(sb->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(CR_MAX_PROGRAM_ENV_PARAMS >= CR_MAX_VERTEX_PROGRAM_ENV_PARAMS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(CR_MAX_PROGRAM_ENV_PARAMS >= CR_MAX_FRAGMENT_PROGRAM_ENV_PARAMS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(CR_MAX_PROGRAM_LOCAL_PARAMS >= CR_MAX_VERTEX_PROGRAM_LOCAL_PARAMS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(CR_MAX_PROGRAM_LOCAL_PARAMS >= CR_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->programHash = crAllocHashtable();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* ARB_vertex/fragment_program define default program objects */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->defaultVertexProgram = GetProgram(p, GL_VERTEX_PROGRAM_ARB, 0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->defaultFragmentProgram = GetProgram(p, GL_FRAGMENT_PROGRAM_ARB, 0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->currentVertexProgram = p->defaultVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->currentFragmentProgram = p->defaultFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->errorPos = -1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->errorString = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < ctx->limits.maxVertexProgramEnvParams / 4; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->TrackMatrix[i] = GL_NONE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->TrackMatrixTransform[i] = GL_IDENTITY_NV;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < ctx->limits.maxVertexProgramEnvParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[i][0] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[i][1] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[i][2] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vertexParameters[i][3] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < CR_MAX_FRAGMENT_PROGRAM_ENV_PARAMS; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fragmentParameters[i][0] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fragmentParameters[i][1] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fragmentParameters[i][2] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fragmentParameters[i][3] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vpEnabled = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fpEnabled = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->fpEnabledARB = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vpPointSize = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync p->vpTwoSide = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RESET(pb->dirty, ctx->bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void DeleteProgramCallback( void *data )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *prog = (CRProgram *) data;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DeleteProgram(prog);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crStateProgramDestroy(CRContext *ctx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *p = &(ctx->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFreeHashtable(p->programHash, DeleteProgramCallback);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DeleteProgram(p->defaultVertexProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DeleteProgram(p->defaultFragmentProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* XXX it would be nice to autogenerate this, but we can't for now.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateProgramDiff(CRProgramBits *b, CRbitvalue *bitID,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *fromCtx, CRContext *toCtx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *from = &(fromCtx->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *to = &(toCtx->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int i, j;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue nbitID[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(from->currentVertexProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(to->currentVertexProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(from->currentFragmentProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(to->currentFragmentProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (j=0;j<CR_MAX_BITARRAY;j++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync nbitID[j] = ~bitID[j];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program enable */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->vpEnable, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync glAble able[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *toProg = to->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[0] = diff_api.Disable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[1] = diff_api.Enable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->vpEnabled != to->vpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->vpEnabled](GL_VERTEX_PROGRAM_ARB);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->vpEnabled](GL_VERTEX_PROGRAM_NV);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->vpEnabled = to->vpEnabled;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->vpTwoSide != to->vpTwoSide) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->vpTwoSide](GL_VERTEX_PROGRAM_TWO_SIDE_NV);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->vpTwoSide = to->vpTwoSide;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->vpPointSize != to->vpPointSize) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->vpPointSize](GL_VERTEX_PROGRAM_POINT_SIZE_NV);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->vpPointSize = to->vpPointSize;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->vpEnable, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program enable */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fpEnable, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync glAble able[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[0] = diff_api.Disable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[1] = diff_api.Enable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->fpEnabled != to->fpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->fpEnabled](GL_FRAGMENT_PROGRAM_NV);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->fpEnabled = to->fpEnabled;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->fpEnabledARB != to->fpEnabledARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->fpEnabledARB](GL_FRAGMENT_PROGRAM_ARB);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->fpEnabledARB = to->fpEnabledARB;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->fpEnable, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* program/track matrices */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (to->vpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxVertexProgramEnvParams / 4; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->trackMatrix[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->TrackMatrix[i] != to->TrackMatrix[i] ||
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->TrackMatrixTransform[i] != to->TrackMatrixTransform[i]) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.TrackMatrixNV(GL_VERTEX_PROGRAM_NV, i * 4,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->TrackMatrix[i],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->TrackMatrixTransform[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->TrackMatrix[i] = to->TrackMatrix[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->TrackMatrixTransform[i] = to->TrackMatrixTransform[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->trackMatrix[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (to->vpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program binding */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *fromProg = from->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *toProg = to->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->vpBinding, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg->id != toProg->id) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramARB(GL_VERTEX_PROGRAM_ARB, toProg->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramNV(GL_VERTEX_PROGRAM_NV, toProg->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->currentVertexProgram = toProg;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->vpBinding, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program text */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyProgram, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramStringARB( GL_VERTEX_PROGRAM_ARB, toProg->format, toProg->length, toProg->string );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.LoadProgramNV( GL_VERTEX_PROGRAM_NV, toProg->id, toProg->length, toProg->string );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyProgram, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program global/env parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->vertexEnvParameters, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxVertexProgramEnvParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->vertexEnvParameter[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->vertexParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, i,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->vertexParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync COPY_4V(from->vertexParameters[i],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->vertexParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->vertexEnvParameter[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->vertexEnvParameters, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParams, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxVertexProgramLocalParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParam[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i, toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_NV, i, toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyParam[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyParams, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Separate paths for NV vs ARB fragment program
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (to->fpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* NV fragment program binding */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *fromProg = from->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *toProg = to->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fpBinding, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg->id != toProg->id) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramNV(GL_FRAGMENT_PROGRAM_NV, toProg->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->currentFragmentProgram = toProg;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->fpBinding, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program text */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyProgram, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.LoadProgramNV( GL_FRAGMENT_PROGRAM_NV, toProg->id,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync toProg->length, toProg->string );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyProgram, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program global/env parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fragmentEnvParameters, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxFragmentProgramEnvParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fragmentEnvParameter[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramParameter4fvNV(GL_FRAGMENT_PROGRAM_NV, i,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->fragmentParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync COPY_4V(from->fragmentParameters[i],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->fragmentParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->fragmentEnvParameter[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->fragmentEnvParameters, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* named local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyNamedParams, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramSymbol *symbol;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (symbol = toProg->symbolTable; symbol; symbol = symbol->next) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(symbol->dirty, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint len = crStrlen(symbol->name);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramNamedParameter4fvNV(toProg->id, len,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (const GLubyte *) symbol->name,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SetProgramSymbol(fromProg, symbol->name, len,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[0], symbol->value[1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value[2], symbol->value[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(symbol->dirty, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyNamedParams, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* numbered local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParams, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < CR_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMS; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParam[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_NV, i,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync COPY_4V(fromProg->parameters[i], toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyParam[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyParams, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (to->fpEnabledARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* ARB fragment program binding */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *fromProg = from->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *toProg = to->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fpBinding, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg->id != toProg->id) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, toProg->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync from->currentFragmentProgram = toProg;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->fpBinding, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program text */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyProgram, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, toProg->format,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync toProg->length, toProg->string );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyProgram, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program global/env parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fragmentEnvParameters, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxFragmentProgramEnvParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fragmentEnvParameter[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->fragmentParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync COPY_4V(from->fragmentParameters[i],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->fragmentParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->fragmentEnvParameter[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->fragmentEnvParameters, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* numbered local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParams, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < CR_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMS; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParam[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync COPY_4V(fromProg->parameters[i], toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyParam[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(toProg->dirtyParams, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CLEARDIRTY(b->dirty, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateProgramSwitch(CRProgramBits *b, CRbitvalue *bitID,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *fromCtx, CRContext *toCtx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *from = &(fromCtx->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramState *to = &(toCtx->program);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int i, j;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue nbitID[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum whichVert = fromCtx->extensions.ARB_vertex_program && toCtx->extensions.ARB_vertex_program ? GL_VERTEX_PROGRAM_ARB : GL_VERTEX_PROGRAM_NV;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (j=0;j<CR_MAX_BITARRAY;j++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync nbitID[j] = ~bitID[j];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program enable */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->vpEnable, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync glAble able[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[0] = diff_api.Disable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[1] = diff_api.Enable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->vpEnabled != to->vpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->vpEnabled](whichVert);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->vpTwoSide != to->vpTwoSide) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->vpTwoSide](GL_VERTEX_PROGRAM_TWO_SIDE_NV);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->vpPointSize != to->vpPointSize) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->vpPointSize](GL_VERTEX_PROGRAM_POINT_SIZE_NV);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->vpEnable, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program enable */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fpEnable, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync glAble able[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[0] = diff_api.Disable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[1] = diff_api.Enable;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->fpEnabled != to->fpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->fpEnabled](GL_FRAGMENT_PROGRAM_NV);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->fpEnabledARB != to->fpEnabledARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync able[to->fpEnabledARB](GL_FRAGMENT_PROGRAM_ARB);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->fpEnable, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* program/track matrices */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (to->vpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxVertexProgramEnvParams / 4; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->trackMatrix[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (from->TrackMatrix[i] != to->TrackMatrix[i]) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.TrackMatrixNV(GL_VERTEX_PROGRAM_NV, i * 4,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->TrackMatrix[i],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->TrackMatrixTransform[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->trackMatrix[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (to->vpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program binding */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *fromProg = from->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *toProg = to->currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->vpBinding, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg->id != toProg->id) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramARB(GL_VERTEX_PROGRAM_ARB, toProg->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramNV(GL_VERTEX_PROGRAM_NV, toProg->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->vpBinding, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program text */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyProgram, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.ProgramStringARB(GL_VERTEX_PROGRAM_ARB, toProg->format, toProg->length, toProg->string);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.LoadProgramNV(GL_VERTEX_PROGRAM_NV, toProg->id, toProg->length, toProg->string);
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(toProg->dirtyProgram, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program global/env parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->vertexEnvParameters, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxVertexProgramEnvParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->vertexEnvParameter[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.ProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i, to->vertexParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.ProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, i, to->vertexParameters[i]);
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->vertexEnvParameter[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->vertexEnvParameters, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParams, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxVertexProgramLocalParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParam[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i, toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_NV, i, toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(toProg->dirtyParams, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Separate paths for NV vs ARB fragment program
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (to->fpEnabled) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* NV fragment program binding */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *fromProg = from->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *toProg = to->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fpBinding, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg->id != toProg->id) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramNV(GL_FRAGMENT_PROGRAM_NV, toProg->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->fpBinding, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program text */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyProgram, bitID)) {
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.LoadProgramNV(GL_FRAGMENT_PROGRAM_NV, toProg->id, toProg->length, toProg->string);
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(toProg->dirtyProgram, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program global/env parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fragmentEnvParameters, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxFragmentProgramEnvParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fragmentEnvParameter[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramParameter4fvNV(GL_FRAGMENT_PROGRAM_NV, i,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync to->fragmentParameters[i]);
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->fragmentEnvParameter[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->fragmentEnvParameters, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* named local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyNamedParams, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramSymbol *symbol;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (symbol = toProg->symbolTable; symbol; symbol = symbol->next) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(symbol->dirty, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint len = crStrlen(symbol->name);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramNamedParameter4fvNV(toProg->id, len,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (const GLubyte *) symbol->name,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync symbol->value);
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(symbol->dirty, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(toProg->dirtyNamedParams, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* numbered local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParams, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < CR_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMS; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParam[i], bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg->isARBprogram)
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.ProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i, toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.ProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_NV, i, toProg->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(toProg->dirtyParams, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (to->fpEnabledARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* ARB fragment program binding */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *fromProg = from->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *toProg = to->currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fpBinding, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fromProg->id != toProg->id) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, toProg->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->fpBinding, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toProg) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program text */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyProgram, bitID)) {
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.ProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, toProg->format, toProg->length, toProg->string);
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(toProg->dirtyProgram, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fragment program global/env parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fragmentEnvParameters, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < toCtx->limits.maxFragmentProgramEnvParams; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(b->fragmentEnvParameter[i], bitID)) {
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.ProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i, to->fragmentParameters[i]);
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->fragmentEnvParameter[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->fragmentEnvParameters, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* numbered local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParams, bitID)) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < CR_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMS; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (CHECKDIRTY(toProg->dirtyParam[i], bitID)) {
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync diff_api.ProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i, toProg->parameters[i]);
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(toProg->dirtyParam[i], nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(toProg->dirtyParams, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
7a0360e6e8726ba9af4f4c8917e051e0298fb8fevboxsync DIRTY(b->dirty, nbitID);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Resend program data */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (toCtx->program.bResyncNeeded)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync toCtx->program.bResyncNeeded = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateDiffAllPrograms(toCtx, bitID, GL_TRUE);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*@todo support NVprograms and add some data validity checks*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDiffProgramCallback(unsigned long key, void *pProg, void *pCtx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *pContext = (CRContext *) pCtx;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *pProgram = (CRProgram *) pProg;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uint32_t i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pProgram->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramARB(pProgram->target, pProgram->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramStringARB(pProgram->target, pProgram->format, pProgram->length, pProgram->string);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (GL_VERTEX_PROGRAM_ARB == pProgram->target)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program global/env parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < pContext->limits.maxVertexProgramEnvParams; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i, pContext->program.vertexParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < pContext->limits.maxVertexProgramLocalParams; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i, pProgram->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (GL_FRAGMENT_PROGRAM_ARB == pProgram->target)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program global/env parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < pContext->limits.maxFragmentProgramEnvParams; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i, pContext->program.fragmentParameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* vertex program local parameters */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < CR_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMS; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.ProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i, pProgram->parameters[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("Unexpected program target");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramNV(pProgram->target, pProgram->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crStateDiffAllPrograms(CRContext *g, CRbitvalue *bitID, GLboolean bForceUpdate)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *pOrigVP, *pOrigFP;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) bForceUpdate;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* save original bindings */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pOrigVP = g->program.currentVertexProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pOrigFP = g->program.currentFragmentProgram;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableWalk(g->program.programHash, DiffProgramCallback, g);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* restore original bindings */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pOrigVP->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramARB(pOrigVP->target, pOrigVP->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramNV(pOrigVP->target, pOrigVP->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pOrigFP->isARBprogram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramARB(pOrigFP->target, pOrigFP->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync diff_api.BindProgramNV(pOrigFP->target, pOrigFP->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}