From: Brian Paul Date: Tue, 31 Oct 2006 16:02:56 +0000 (+0000) Subject: We need to call _mesa_load_state_parameters() whenever a fragment program X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4e9e0aff790656821970ba74d8996718e415ea68;p=mesa.git 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(). --- diff --git a/src/mesa/swrast/s_context.c b/src/mesa/swrast/s_context.c index 18f5fe497bb..0de6dc25b4a 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 a34db23fa64..94c249926dc 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)) {