Mesa (master): i965: Delete previous workaround for textureGrad with shadow samplers.

Kenneth Graunke kwg at kemper.freedesktop.org
Thu Jul 12 17:19:35 UTC 2012


Module: Mesa
Branch: master
Commit: b546aebae922214dced54c75e6f64830aabd5d1c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b546aebae922214dced54c75e6f64830aabd5d1c

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Mon Jul  9 21:25:37 2012 -0700

i965: Delete previous workaround for textureGrad with shadow samplers.

It had many problems:
- The shadow comparison was done post-filtering.
- It required state-dependent recompiles whenever the comparison
  function changed.
- It didn't even work: many cases hit assertion failures.
- I never implemented it for the VS.

The new lowering pass which converts textureGrad to textureLod by
computing the LOD value works much better.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Eric Anholt <eric at anholt.net>

---

 src/mesa/drivers/dri/i965/brw_fs.cpp         |    3 -
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |   62 ++-----------------------
 src/mesa/drivers/dri/i965/brw_program.h      |   12 -----
 src/mesa/drivers/dri/i965/brw_wm.c           |    3 -
 4 files changed, 5 insertions(+), 75 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 175e36e..b3b25cc 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -2163,9 +2163,6 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
    key.clamp_fragment_color = true;
 
    for (int i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-      if (fp->Base.ShadowSamplers & (1 << i))
-	 key.tex.compare_funcs[i] = GL_LESS;
-
       /* FINISHME: depth compares might use (0,0,0,W) for example */
       key.tex.swizzles[i] = SWIZZLE_XYZW;
    }
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 28adf33..7224cbe 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -712,7 +712,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,
    /* g0 header. */
    mlen = 1;
 
-   if (ir->shadow_comparitor && ir->op != ir_txd) {
+   if (ir->shadow_comparitor) {
       for (int i = 0; i < ir->coordinate->type->vector_elements; i++) {
 	 emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + mlen + i), coordinate);
 	 coordinate.reg_offset++;
@@ -931,7 +931,7 @@ fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate,
    }
    mlen += vector_elements * reg_width;
 
-   if (ir->shadow_comparitor && ir->op != ir_txd) {
+   if (ir->shadow_comparitor) {
       mlen = MAX2(mlen, header_present + 4 * reg_width);
 
       ir->shadow_comparitor->accept(this);
@@ -1038,7 +1038,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
       base_mrf--;
    }
 
-   if (ir->shadow_comparitor && ir->op != ir_txd) {
+   if (ir->shadow_comparitor) {
       ir->shadow_comparitor->accept(this);
       emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + mlen), this->result);
       mlen += reg_width;
@@ -1163,19 +1163,6 @@ fs_visitor::visit(ir_texture *ir)
    int sampler = _mesa_get_sampler_uniform_value(ir->sampler, prog, &fp->Base);
    sampler = fp->Base.SamplerUnits[sampler];
 
-   /* Our hardware doesn't have a sample_d_c message, so shadow compares
-    * for textureGrad/TXD need to be emulated with instructions.
-    */
-   bool hw_compare_supported = ir->op != ir_txd;
-   if (ir->shadow_comparitor && !hw_compare_supported) {
-      assert(c->key.tex.compare_funcs[sampler] != GL_NONE);
-      /* No need to even sample for GL_ALWAYS or GL_NEVER...bail early */
-      if (c->key.tex.compare_funcs[sampler] == GL_ALWAYS)
-	 return swizzle_result(ir, fs_reg(1.0f), sampler);
-      else if (c->key.tex.compare_funcs[sampler] == GL_NEVER)
-	 return swizzle_result(ir, fs_reg(0.0f), sampler);
-   }
-
    if (ir->coordinate)
       ir->coordinate->accept(this);
    fs_reg coordinate = this->result;
@@ -1325,47 +1312,8 @@ fs_visitor::visit(ir_texture *ir)
 
    inst->sampler = sampler;
 
-   if (ir->shadow_comparitor) {
-      if (hw_compare_supported) {
-	 inst->shadow_compare = true;
-      } else {
-	 ir->shadow_comparitor->accept(this);
-	 fs_reg ref = this->result;
-
-	 fs_reg value = dst;
-	 dst = fs_reg(this, glsl_type::vec4_type);
-
-	 /* FINISHME: This needs to be done pre-filtering. */
-
-	 uint32_t conditional = 0;
-	 switch (c->key.tex.compare_funcs[sampler]) {
-	 /* GL_ALWAYS and GL_NEVER were handled at the top of the function */
-	 case GL_LESS:     conditional = BRW_CONDITIONAL_L;   break;
-	 case GL_GREATER:  conditional = BRW_CONDITIONAL_G;   break;
-	 case GL_LEQUAL:   conditional = BRW_CONDITIONAL_LE;  break;
-	 case GL_GEQUAL:   conditional = BRW_CONDITIONAL_GE;  break;
-	 case GL_EQUAL:    conditional = BRW_CONDITIONAL_EQ;  break;
-	 case GL_NOTEQUAL: conditional = BRW_CONDITIONAL_NEQ; break;
-	 default: assert(!"Should not get here: bad shadow compare function");
-	 }
-
-	 /* Use conditional moves to load 0 or 1 as the result */
-	 this->current_annotation = "manual shadow comparison";
-	 for (int i = 0; i < 4; i++) {
-	    inst = emit(BRW_OPCODE_MOV, dst, fs_reg(0.0f));
-
-	    inst = emit(BRW_OPCODE_CMP, reg_null_f, ref, value);
-	    inst->conditional_mod = conditional;
-
-	    inst = emit(BRW_OPCODE_MOV, dst, fs_reg(1.0f));
-	    inst->predicated = true;
-
-	    dst.reg_offset++;
-	    value.reg_offset++;
-	 }
-	 dst.reg_offset = 0;
-      }
-   }
+   if (ir->shadow_comparitor)
+      inst->shadow_compare = true;
 
    swizzle_result(ir, dst, sampler);
 }
diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h
index a2698cf..287994f 100644
--- a/src/mesa/drivers/dri/i965/brw_program.h
+++ b/src/mesa/drivers/dri/i965/brw_program.h
@@ -29,18 +29,6 @@
  */
 struct brw_sampler_prog_key_data {
    /**
-    * Per-sampler comparison functions:
-    *
-    * If comparison mode is GL_COMPARE_R_TO_TEXTURE, then this is set to one
-    * of GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL,
-    * GL_GEQUAL, or GL_ALWAYS.  Otherwise (comparison mode is GL_NONE), this
-    * field is irrelevant so it's left as GL_NONE (0).
-    *
-    * While this is a GLenum, all possible values fit in 16-bits.
-    */
-   uint16_t compare_funcs[BRW_MAX_TEX_UNIT];
-
-   /**
     * EXT_texture_swizzle and DEPTH_TEXTURE_MODE swizzles.
     */
    uint16_t swizzles[BRW_MAX_TEX_UNIT];
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index ae6c6bf..8805646 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -366,9 +366,6 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
 
       if (img->_BaseFormat == GL_DEPTH_COMPONENT ||
 	  img->_BaseFormat == GL_DEPTH_STENCIL) {
-	 if (sampler->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB)
-	    key->compare_funcs[i] = sampler->CompareFunc;
-
 	 /* We handle GL_DEPTH_TEXTURE_MODE here instead of as surface format
 	  * overrides because shadow comparison always returns the result of
 	  * the comparison in all channels anyway.




More information about the mesa-commit mailing list