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().
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user