texenvprogram: Mark textures using ARB_shadow as ShadowSamplers
authorNicolai Haehnle <nhaehnle@gmail.com>
Sat, 14 Jun 2008 00:28:58 +0000 (02:28 +0200)
committerNicolai Haehnle <nhaehnle@gmail.com>
Sat, 14 Jun 2008 02:15:31 +0000 (04:15 +0200)
Since ARB_fragment_program and friends are defined to ignore the setting of
the GL_TEXTURE_COMPARE_FUNC parameter, we have to explicitly enable the
shadow comparison by marking the texture unit in ShadowSamplers when
appropriate.

src/mesa/main/texenvprogram.c

index af19a38c42bc749c275d5aeaaef6c65a587a300b..512d52704d822c5659598d5ac7bd3248e9c1e15e 100644 (file)
@@ -68,6 +68,7 @@ struct state_key {
    struct {
       GLuint enabled:1;
       GLuint source_index:3;   /* one of TEXTURE_1D/2D/3D/CUBE/RECT_INDEX */
+      GLuint shadow:1;
       GLuint ScaleShiftRGB:2;
       GLuint ScaleShiftA:2;
 
@@ -219,6 +220,7 @@ static void make_state_key( GLcontext *ctx,  struct state_key *key )
 
       key->unit[i].source_index = 
         translate_tex_src_bit(texUnit->_ReallyEnabled);                
+      key->unit[i].shadow = texUnit->_Current->CompareMode == GL_COMPARE_R_TO_TEXTURE;
 
       key->unit[i].NumArgsRGB = texUnit->_CurrentCombine->_NumArgsRGB;
       key->unit[i].NumArgsA = texUnit->_CurrentCombine->_NumArgsA;
@@ -945,11 +947,13 @@ static void load_texture( struct texenv_fragment_program *p, GLuint unit )
                          
       /* TODO: Use D0_MASK_XY where possible.
        */
-      if (p->state->unit[unit].enabled) 
+      if (p->state->unit[unit].enabled) {
         p->src_texture[unit] = emit_texld( p, OPCODE_TXP,
                                            tmp, WRITEMASK_XYZW, 
                                            unit, dim, texcoord );
-      else
+        if (p->state->unit[unit].shadow)
+           p->program->Base.ShadowSamplers |= 1 << unit;
+      } else
         p->src_texture[unit] = get_zero(p);
    }
 }