diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 3a211dc9950..d17fc4c1d38 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -1206,7 +1206,8 @@ _mesa_PopAttrib(void) if (mask & GL_TEXTURE_BIT) { pop_texture_group(ctx, &attr->Texture); - ctx->NewState |= _NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE; + ctx->NewState |= _NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE | + _NEW_FF_VERT_PROGRAM | _NEW_FF_FRAG_PROGRAM; } if (mask & GL_VIEWPORT_BIT) { diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index 3f63d265ba6..15c3062e5f3 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -936,7 +936,8 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state) newenabled |= coordBit; if (texUnit->TexGenEnabled == newenabled) return; - FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, + FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE | _NEW_FF_VERT_PROGRAM | + _NEW_FF_FRAG_PROGRAM, GL_TEXTURE_BIT | GL_ENABLE_BIT); texUnit->TexGenEnabled = newenabled; } @@ -958,7 +959,8 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state) newenabled |= STR_BITS; if (texUnit->TexGenEnabled == newenabled) return; - FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, 0); + FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE | _NEW_FF_VERT_PROGRAM | + _NEW_FF_FRAG_PROGRAM, 0); texUnit->TexGenEnabled = newenabled; } } diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp index a5d664725b6..302c3b1de9b 100644 --- a/src/mesa/main/ff_fragment_shader.cpp +++ b/src/mesa/main/ff_fragment_shader.cpp @@ -192,7 +192,6 @@ static GLbitfield filter_fp_input_mask( GLbitfield fp_inputs, possible_inputs = VARYING_BITS_TEX_ANY; } else { - /* _NEW_TEXTURE_STATE */ const GLbitfield possible_tex_inputs = ctx->Texture._TexGenEnabled | ctx->Texture._TexMatEnabled | diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 7b8ecbb9649..5f62ffc47b4 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -4672,7 +4672,8 @@ struct gl_matrix_stack _NEW_FF_VERT_PROGRAM | \ _NEW_FF_FRAG_PROGRAM) -#define _NEW_TEXTURE (_NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE) +#define _NEW_TEXTURE (_NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE | \ + _NEW_FF_VERT_PROGRAM | _NEW_FF_FRAG_PROGRAM) #define _MESA_NEW_NEED_EYE_COORDS (_NEW_FF_VERT_PROGRAM | \ _NEW_FF_FRAG_PROGRAM | \ diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 4ed4ad42a42..43466a236de 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -460,7 +460,7 @@ _mesa_update_state_locked( struct gl_context *ctx ) _mesa_update_texture_matrices(ctx); if (new_state & (_NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE | _NEW_PROGRAM)) - _mesa_update_texture_state(ctx); + new_state |= _mesa_update_texture_state(ctx); if (new_state & _NEW_LIGHT_CONSTANTS) _mesa_update_lighting(ctx); @@ -496,9 +496,8 @@ _mesa_update_state_locked( struct gl_context *ctx ) } if (ctx->VertexProgram._UsesTnlProgram) { - prog_flags |= _NEW_FF_VERT_PROGRAM | _NEW_TEXTURE_OBJECT | - _NEW_TEXTURE_MATRIX | _NEW_TRANSFORM | _NEW_POINT | - _NEW_FOG | _NEW_TEXTURE_STATE; + prog_flags |= _NEW_FF_VERT_PROGRAM | _NEW_TEXTURE_MATRIX | + _NEW_TRANSFORM | _NEW_POINT | _NEW_FOG; } if (new_state & prog_flags) { diff --git a/src/mesa/main/texgen.c b/src/mesa/main/texgen.c index d87452187e6..57aa5c5d767 100644 --- a/src/mesa/main/texgen.c +++ b/src/mesa/main/texgen.c @@ -129,7 +129,8 @@ texgenfv( GLuint texunitIndex, GLenum coord, GLenum pname, return; } - FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT); + FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE | _NEW_FF_VERT_PROGRAM, + GL_TEXTURE_BIT); texgen->Mode = mode; texgen->_ModeBit = bit; } diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 63a0f4a56d1..3beb5363cf6 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -879,7 +879,7 @@ fix_missing_textures_for_atifs(struct gl_context *ctx, * * \param ctx GL context. */ -void +GLbitfield _mesa_update_texture_state(struct gl_context *ctx) { struct gl_program *prog[MESA_SHADER_STAGES]; @@ -897,6 +897,10 @@ _mesa_update_texture_state(struct gl_context *ctx) /* TODO: only set this if there are actual changes */ ctx->NewState |= _NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE; + GLbitfield old_enabled_coord_units = ctx->Texture._EnabledCoordUnits; + GLbitfield old_texgen_enabled = ctx->Texture._TexGenEnabled; + GLbitfield old_texmat_enabled = ctx->Texture._TexMatEnabled; + ctx->Texture._GenFlags = 0x0; ctx->Texture._TexMatEnabled = 0x0; ctx->Texture._TexGenEnabled = 0x0; @@ -935,6 +939,16 @@ _mesa_update_texture_state(struct gl_context *ctx) if (!prog[MESA_SHADER_FRAGMENT] || !prog[MESA_SHADER_VERTEX]) update_texgen(ctx); + + GLbitfield new_state = 0; + + if (old_enabled_coord_units != ctx->Texture._EnabledCoordUnits || + old_texgen_enabled != ctx->Texture._TexGenEnabled || + old_texmat_enabled != ctx->Texture._TexMatEnabled) { + new_state |= _NEW_FF_VERT_PROGRAM | _NEW_FF_FRAG_PROGRAM; + } + + return new_state; } diff --git a/src/mesa/main/texstate.h b/src/mesa/main/texstate.h index f2e55f1a4af..1244f77c9e9 100644 --- a/src/mesa/main/texstate.h +++ b/src/mesa/main/texstate.h @@ -112,7 +112,7 @@ _mesa_ClientActiveTexture( GLenum target ); extern void _mesa_update_texture_matrices(struct gl_context *ctx); -extern void +extern GLbitfield _mesa_update_texture_state(struct gl_context *ctx); extern GLboolean