blob: ee8b5503420fb031db2d0eb2d325ddab51d2a082 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/* Copyright (c) 2001, Stanford University
* All rights reserved.
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#ifndef CR_STATE_PROGRAM_H
#define CR_STATE_PROGRAM_H
#include "cr_hash.h"
#include "state/cr_statetypes.h"
#include "state/cr_limits.h"
#include <iprt/cdefs.h>
/*
* Dirty bits for per-context program state. Per-program dirty bits
* are in the CRProgram structure.
*/
typedef struct {
CRbitvalue dirty[CR_MAX_BITARRAY];
CRbitvalue vpEnable[CR_MAX_BITARRAY];
CRbitvalue fpEnable[CR_MAX_BITARRAY];
CRbitvalue vpBinding[CR_MAX_BITARRAY];
CRbitvalue fpBinding[CR_MAX_BITARRAY];
CRbitvalue vertexAttribArrayEnable[CR_MAX_VERTEX_ATTRIBS][CR_MAX_BITARRAY];
CRbitvalue map1AttribArrayEnable[CR_MAX_VERTEX_ATTRIBS][CR_MAX_BITARRAY];
CRbitvalue map2AttribArrayEnable[CR_MAX_VERTEX_ATTRIBS][CR_MAX_BITARRAY];
/* per-param flags: */
CRbitvalue vertexEnvParameter[CR_MAX_VERTEX_PROGRAM_ENV_PARAMS][CR_MAX_BITARRAY];
CRbitvalue fragmentEnvParameter[CR_MAX_FRAGMENT_PROGRAM_ENV_PARAMS][CR_MAX_BITARRAY];
/* any param flags: */
CRbitvalue vertexEnvParameters[CR_MAX_BITARRAY];
CRbitvalue fragmentEnvParameters[CR_MAX_BITARRAY];
CRbitvalue trackMatrix[CR_MAX_VERTEX_PROGRAM_ENV_PARAMS / 4][CR_MAX_BITARRAY];
} CRProgramBits;
/*
* Fragment programs have named symbols which are defined/declared
* within the fragment program that can also be set with the
* glProgramNamedParameter4*NV() functions.
* We keep a linked list of these CRProgramSymbol structures to implement
* a symbol table. A simple linked list is sufficient since a fragment
* program typically has just a few symbols.
*/
typedef struct CRProgramSymbol {
const char *name;
GLuint cbName;
GLfloat value[4];
CRbitvalue dirty[CR_MAX_BITARRAY];
struct CRProgramSymbol *next;
} CRProgramSymbol;
/*
* A vertex or fragment program.
*/
typedef struct {
GLenum target;
GLuint id;
GLboolean isARBprogram; /* to distinguish between NV and ARB programs */
const GLubyte *string;
GLsizei length;
GLboolean resident;
GLenum format;
/* Set with ProgramNamedParameterNV */
struct CRProgramSymbol *symbolTable;
/* Set with ProgramLocalParameterARB: */
GLfloat parameters[CR_MAX_PROGRAM_LOCAL_PARAMS][4];
/* ARB info (this could be impossible to implement without parsing */
GLint numInstructions;
GLint numTemporaries;
GLint numParameters;
GLint numAttributes;
GLint numAddressRegs;
GLint numAluInstructions;
GLint numTexInstructions;
GLint numTexIndirections;
CRbitvalue dirtyNamedParams[CR_MAX_BITARRAY];
CRbitvalue dirtyParam[CR_MAX_PROGRAM_LOCAL_PARAMS][CR_MAX_BITARRAY];
CRbitvalue dirtyParams[CR_MAX_BITARRAY];
CRbitvalue dirtyProgram[CR_MAX_BITARRAY];
} CRProgram;
typedef struct {
CRProgram *currentVertexProgram;
CRProgram *currentFragmentProgram;
GLint errorPos;
const GLubyte *errorString;
GLboolean loadedProgram; /* XXX temporary */
CRProgram *defaultVertexProgram;
CRProgram *defaultFragmentProgram;
/* tracking matrices for vertex programs */
GLenum TrackMatrix[CR_MAX_VERTEX_PROGRAM_LOCAL_PARAMS / 4];
GLenum TrackMatrixTransform[CR_MAX_VERTEX_PROGRAM_LOCAL_PARAMS / 4];
/* global/env params shared by all programs */
GLfloat fragmentParameters[CR_MAX_FRAGMENT_PROGRAM_ENV_PARAMS][4];
GLfloat vertexParameters[CR_MAX_VERTEX_PROGRAM_ENV_PARAMS][4];
CRHashTable *programHash; /* XXX belongs in shared state, actually */
GLuint vpProgramBinding;
GLuint fpProgramBinding;
GLboolean vpEnabled; /* GL_VERTEX_PROGRAM_NV / ARB*/
GLboolean fpEnabled; /* GL_FRAGMENT_PROGRAM_NV */
GLboolean fpEnabledARB; /* GL_FRAGMENT_PROGRAM_ARB */
GLboolean vpPointSize; /* GL_VERTEX_PROGRAM_NV */
GLboolean vpTwoSide; /* GL_VERTEX_PROGRAM_NV */
/* Indicates that we have to resend program data to GPU on first glMakeCurrent call with owning context */
GLboolean bResyncNeeded;
} CRProgramState;
extern DECLEXPORT(void) crStateProgramInit(CRContext *ctx);
extern DECLEXPORT(void) crStateProgramDestroy(CRContext *ctx);
extern DECLEXPORT(void) crStateProgramDiff(CRProgramBits *b, CRbitvalue *bitID,
CRContext *fromCtx, CRContext *toCtx);
extern DECLEXPORT(void) crStateProgramSwitch(CRProgramBits *b, CRbitvalue *bitID,
CRContext *fromCtx, CRContext *toCtx);
DECLEXPORT(void) crStateDiffAllPrograms(CRContext *g, CRbitvalue *bitID, GLboolean bForceUpdate);
#endif /* CR_STATE_PROGRAM_H */
|