summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/shader/program.c77
-rw-r--r--src/mesa/shader/program.h3
2 files changed, 80 insertions, 0 deletions
diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c
index b6371329a5c..c668ce8a5a0 100644
--- a/src/mesa/shader/program.c
+++ b/src/mesa/shader/program.c
@@ -45,6 +45,9 @@
static const char *
make_state_string(const GLint stateTokens[6]);
+static GLuint
+make_state_flags(const GLint state[]);
+
/**********************************************************************/
/* Utility functions */
@@ -459,6 +462,9 @@ _mesa_add_state_reference(struct program_parameter_list *paramList,
for (i = 0; i < 6; i++)
paramList->Parameters[index].StateIndexes[i]
= (enum state_index) stateTokens[i];
+
+ paramList->StateFlags |=
+ make_state_flags(stateTokens);
}
return index;
@@ -899,6 +905,77 @@ _mesa_fetch_state(GLcontext *ctx, const enum state_index state[],
}
+/* Return a bit mask of the Mesa state flags under which a parameter's
+ * value might change.
+ */
+static GLuint make_state_flags(const GLint state[])
+{
+ switch (state[0]) {
+ case STATE_MATERIAL:
+ case STATE_LIGHT:
+ case STATE_LIGHTMODEL_AMBIENT:
+ case STATE_LIGHTMODEL_SCENECOLOR:
+ case STATE_LIGHTPROD:
+ return _NEW_LIGHT;
+
+ case STATE_TEXGEN:
+ case STATE_TEXENV_COLOR:
+ return _NEW_TEXTURE;
+
+ case STATE_FOG_COLOR:
+ case STATE_FOG_PARAMS:
+ return _NEW_FOG;
+
+ case STATE_CLIPPLANE:
+ return _NEW_TRANSFORM;
+
+ case STATE_POINT_SIZE:
+ case STATE_POINT_ATTENUATION:
+ return _NEW_POINT;
+
+ case STATE_MATRIX:
+ switch (state[1]) {
+ case STATE_MODELVIEW:
+ return _NEW_MODELVIEW;
+ case STATE_PROJECTION:
+ return _NEW_PROJECTION;
+ case STATE_MVP:
+ return _NEW_MODELVIEW | _NEW_PROJECTION;
+ case STATE_TEXTURE:
+ return _NEW_TEXTURE_MATRIX;
+ case STATE_PROGRAM:
+ return _NEW_TRACK_MATRIX;
+ default:
+ assert(0);
+ return 0;
+ }
+
+ case STATE_DEPTH_RANGE:
+ return _NEW_VIEWPORT;
+
+ case STATE_FRAGMENT_PROGRAM:
+ case STATE_VERTEX_PROGRAM:
+ return _NEW_PROGRAM;
+
+ case STATE_INTERNAL:
+ switch (state[1]) {
+ case STATE_NORMAL_SCALE:
+ return _NEW_MODELVIEW;
+ default:
+ assert(0);
+ return 0;
+ }
+
+ default:
+ assert(0);
+ return 0;
+ }
+}
+
+
+
+
+
static void
append(char *dst, const char *src)
{
diff --git a/src/mesa/shader/program.h b/src/mesa/shader/program.h
index a1ee3349dce..3e6c8a7d98a 100644
--- a/src/mesa/shader/program.h
+++ b/src/mesa/shader/program.h
@@ -204,6 +204,9 @@ struct program_parameter_list
GLuint NumParameters; /** number of parameters in arrays */
struct program_parameter *Parameters; /** Array [Size] */
GLfloat (*ParameterValues)[4]; /** Array [Size] */
+ GLuint StateFlags; /** _NEW_* flags indicating which
+ statechanges might invalidate
+ ParameterValues[] */
};