mesa: add TexShadow field to prog_instruction
authorBrian Paul <brianp@vmware.com>
Fri, 20 Feb 2009 20:42:08 +0000 (13:42 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 20 Feb 2009 20:42:08 +0000 (13:42 -0700)
If the instruction is TEX/TXP/TXL/etc the TexShadow field will be true if
the instruction is a texture fetch with shadow compare.

src/mesa/main/texenvprogram.c
src/mesa/shader/arbprogparse.c
src/mesa/shader/prog_instruction.h
src/mesa/shader/prog_print.c

index af51a206a56c733f74d036328f7aac043e6a6cd8..d2a9e35dd53ad8e118572a5ea50c6f316ec87071 100644 (file)
@@ -736,6 +736,7 @@ static struct ureg emit_texld( struct texenv_fragment_program *p,
                               GLuint destmask,
                               GLuint tex_unit,
                               GLuint tex_idx,
+                               GLuint tex_shadow,
                               struct ureg coord )
 {
    struct prog_instruction *inst = emit_op( p, op, 
@@ -747,6 +748,7 @@ static struct ureg emit_texld( struct texenv_fragment_program *p,
    
    inst->TexSrcTarget = tex_idx;
    inst->TexSrcUnit = tex_unit;
+   inst->TexShadow = tex_shadow;
 
    p->program->Base.NumTexInstructions++;
 
@@ -1160,22 +1162,27 @@ emit_texenv(struct texenv_fragment_program *p, GLuint unit)
 static void load_texture( struct texenv_fragment_program *p, GLuint unit )
 {
    if (is_undef(p->src_texture[unit])) {
-      GLuint dim = p->state->unit[unit].source_index;
+      GLuint texTarget = p->state->unit[unit].source_index;
       struct ureg texcoord = register_input(p, FRAG_ATTRIB_TEX0+unit);
       struct ureg tmp = get_tex_temp( p );
 
-      if (dim == TEXTURE_UNKNOWN_INDEX)
+      if (texTarget == TEXTURE_UNKNOWN_INDEX)
          program_error(p, "TexSrcBit");
                          
       /* TODO: Use D0_MASK_XY where possible.
        */
       if (p->state->unit[unit].enabled) {
-        p->src_texture[unit] = emit_texld( p, OPCODE_TXP,
-                                           tmp, WRITEMASK_XYZW, 
-                                           unit, dim, texcoord );
+         GLboolean shadow = GL_FALSE;
 
-        if (p->state->unit[unit].shadow)
+        if (p->state->unit[unit].shadow) {
            p->program->Base.ShadowSamplers |= 1 << unit;
+            shadow = GL_TRUE;
+         }
+
+        p->src_texture[unit] = emit_texld( p, OPCODE_TXP,
+                                           tmp, WRITEMASK_XYZW, 
+                                           unit, texTarget, shadow,
+                                            texcoord );
 
          p->program->Base.SamplersUsed |= (1 << unit);
          /* This identity mapping should already be in place
index 2e0fc3694a4f709377ff9968227553868d2553f3..62edb7f59549e52ce75883e107fb81ba381ffa81 100644 (file)
@@ -3104,6 +3104,9 @@ parse_fp_instruction (GLcontext * ctx, const GLubyte ** inst,
                break;
          }
 
+         if (shadow_tex)
+            fp->TexShadow = 1;
+
          /* Don't test the first time a particular sampler is seen.  Each time
           * after that, make sure the shadow state is the same.
           */
index 84dd98b498486eebfc8c3b8e562138f6ceb4f9c8..e3bb7ac01db558d79908b7c59141923b24146b0d 100644 (file)
@@ -396,6 +396,9 @@ struct prog_instruction
    
    /** Source texture target, one of TEXTURE_{1D,2D,3D,CUBE,RECT}_INDEX */
    GLuint TexSrcTarget:3;
+
+   /** True if tex instruction should do shadow comparison */
+   GLuint TexShadow:1;
    /*@}*/
 
    /**
index 516ea733017002ce6f68a09fca3cc4d9dcfb952f..80be51c3c577c55e262e6a560fc79da1c8d44e62 100644 (file)
@@ -592,6 +592,8 @@ _mesa_fprint_instruction_opt(FILE *f,
       default:
          ;
       }
+      if (inst->TexShadow)
+         _mesa_fprintf(f, " SHADOW");
       fprint_comment(f, inst);
       break;