summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brian.paul@tungstengraphics.com>2006-10-31 16:02:56 +0000
committerBrian Paul <brian.paul@tungstengraphics.com>2006-10-31 16:02:56 +0000
commit4e9e0aff790656821970ba74d8996718e415ea68 (patch)
tree74f28e91c90865fd34ffe903f863c3de486c7dbd
parent72f49657e8f7eac9bdb09435230fbe8f6a2c854b (diff)
We need to call _mesa_load_state_parameters() whenever a fragment program
is enabled and we've changed any GL state that might be referenced by a fragment program (such as state.fog.params). Do this during swrast validation, not in _swrast_exec_fragment_program().
-rw-r--r--src/mesa/swrast/s_context.c16
-rw-r--r--src/mesa/swrast/s_nvfragprog.c5
2 files changed, 15 insertions, 6 deletions
diff --git a/src/mesa/swrast/s_context.c b/src/mesa/swrast/s_context.c
index 18f5fe497b..0de6dc25b4 100644
--- a/src/mesa/swrast/s_context.c
+++ b/src/mesa/swrast/s_context.c
@@ -226,6 +226,10 @@ static void
_swrast_update_fragment_program( GLcontext *ctx )
{
if (ctx->FragmentProgram._Enabled) {
+ /* XXX it would be nice to have a per-program bitmask indicating
+ * what global state vars are used (lighting, point, fog, etc) to
+ * avoid doing this when not needed.
+ */
const struct gl_fragment_program *fp = ctx->FragmentProgram._Current;
_mesa_load_state_parameters(ctx, fp->Base.Parameters);
}
@@ -521,7 +525,17 @@ _swrast_validate_derived( GLcontext *ctx )
if (swrast->NewState & (_NEW_FOG | _NEW_PROGRAM))
_swrast_update_fog_state( ctx );
- if (swrast->NewState & _NEW_PROGRAM)
+ if (swrast->NewState & (_NEW_MODELVIEW |
+ _NEW_PROJECTION |
+ _NEW_TEXTURE_MATRIX |
+ _NEW_FOG |
+ _NEW_LIGHT |
+ _NEW_LINE |
+ _NEW_TEXTURE |
+ _NEW_TRANSFORM |
+ _NEW_POINT |
+ _NEW_VIEWPORT |
+ _NEW_PROGRAM))
_swrast_update_fragment_program( ctx );
if (swrast->NewState & _NEW_TEXTURE)
diff --git a/src/mesa/swrast/s_nvfragprog.c b/src/mesa/swrast/s_nvfragprog.c
index a34db23fa6..94c249926d 100644
--- a/src/mesa/swrast/s_nvfragprog.c
+++ b/src/mesa/swrast/s_nvfragprog.c
@@ -1597,11 +1597,6 @@ _swrast_exec_fragment_program( GLcontext *ctx, SWspan *span )
ctx->_CurrentProgram = GL_FRAGMENT_PROGRAM_ARB; /* or NV, doesn't matter */
-#if 0 /* we really shouldn't need this here... */
- if (program->Base.Parameters) {
- _mesa_load_state_parameters(ctx, program->Base.Parameters);
- }
-#endif
run_program(ctx, span, 0, span->end);
if (program->Base.OutputsWritten & (1 << FRAG_RESULT_DEPR)) {