texenv: Calculate whether we need to do secondary color on our own.
authorEric Anholt <eric@anholt.net>
Fri, 17 Jul 2009 01:41:03 +0000 (18:41 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 17 Jul 2009 02:02:04 +0000 (19:02 -0700)
The _TriangleCaps bit is deprecated, not updated when we require, and
is set based on state that hasn't been updated at that point in
_mesa_update_state_locked().

Fixes incorrect clear color in glsl/twoside.c with meta_clear_tris.

src/mesa/main/state.c
src/mesa/main/texenvprogram.c

index 9ba131bee50b238f18a663a34f4d92436d59ded8..d8191ab5187894adadfef12d8ad9dec81aec660d 100644 (file)
@@ -546,7 +546,7 @@ _mesa_update_state_locked( GLcontext *ctx )
 
    /* Determine which state flags effect vertex/fragment program state */
    if (ctx->FragmentProgram._MaintainTexEnvProgram) {
-      prog_flags |= (_NEW_TEXTURE | _NEW_FOG | _DD_NEW_SEPARATE_SPECULAR |
+      prog_flags |= (_NEW_TEXTURE | _NEW_FOG |
                     _NEW_ARRAY | _NEW_LIGHT | _NEW_POINT | _NEW_RENDERMODE);
    }
    if (ctx->VertexProgram._MaintainTnlProgram) {
index a3f1246c98596f7f11b3333c23b346e79a4a0d0a..6b090ff399be1d2fc49dbc6c5691a12f0f504a94 100644 (file)
@@ -62,6 +62,18 @@ struct texenvprog_cache_item
    struct texenvprog_cache_item *next;
 };
 
+static GLboolean
+texenv_doing_secondary_color(GLcontext *ctx)
+{
+   if (ctx->Light.Enabled &&
+       (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR))
+      return GL_TRUE;
+
+   if (ctx->Fog.ColorSumEnabled)
+      return GL_TRUE;
+
+   return GL_FALSE;
+}
 
 /**
  * Up to nine instructions per tex unit, plus fog, specular color.
@@ -298,7 +310,7 @@ static GLbitfield get_fp_input_mask( GLcontext *ctx )
       if (ctx->Light.Enabled) {
          fp_inputs |= FRAG_BIT_COL0;
 
-         if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
+         if (texenv_doing_secondary_color(ctx))
             fp_inputs |= FRAG_BIT_COL1;
       }
 
@@ -416,8 +428,8 @@ static void make_state_key( GLcontext *ctx,  struct state_key *key )
        }
    }
 
-   /* _DD_NEW_SEPARATE_SPECULAR */
-   if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) {
+   /* _NEW_LIGHT | _NEW_FOG */
+   if (texenv_doing_secondary_color(ctx)) {
       key->separate_specular = 1;
       inputs_referenced |= FRAG_BIT_COL1;
    }