Mesa (master): i965: Drop the confusing saturate argument to math instruction setup.

Eric Anholt anholt at kemper.freedesktop.org
Wed Aug 8 23:43:23 UTC 2012


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

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Aug  6 14:59:39 2012 -0700

i965: Drop the confusing saturate argument to math instruction setup.

This was ridiculous.  We were ignoring the inst->header.saturate flag in the
case of math and only math.  On gen4, we would leave inst->header.saturate in
place if it happened to be set, which would end up being applied to the
implicit mov and thus trash the first argument.  On gen6, we would overwrite
inst->header.saturate with the saturate flag from the argument, which was not
set appropriately in brw_vec4_emit.cpp, and was only not a bug due to our
incompetence at coalescing saturate moves.

By ripping the argument out and making saturate work just like all the other
brw_eu_emit.c code generation, we can avoid both these classes of bugs.

Fixes piglit fog-modes, and the new specific fs-saturate-exp2 case.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48628
NOTE: This is a candidate for the 8.0 branch.
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i965/brw_eu.h          |    2 --
 src/mesa/drivers/dri/i965/brw_eu_emit.c     |   14 ++++----------
 src/mesa/drivers/dri/i965/brw_eu_util.c     |    1 -
 src/mesa/drivers/dri/i965/brw_fs_emit.cpp   |   10 ----------
 src/mesa/drivers/dri/i965/brw_sf_emit.c     |    2 --
 src/mesa/drivers/dri/i965/brw_vec4_emit.cpp |    3 ---
 src/mesa/drivers/dri/i965/brw_vs_emit.c     |    3 ---
 src/mesa/drivers/dri/i965/brw_wm_emit.c     |   15 ++-------------
 8 files changed, 6 insertions(+), 44 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h
index 3ab00a2..e0e02d4 100644
--- a/src/mesa/drivers/dri/i965/brw_eu.h
+++ b/src/mesa/drivers/dri/i965/brw_eu.h
@@ -975,7 +975,6 @@ void brw_SAMPLE(struct brw_compile *p,
 void brw_math_16( struct brw_compile *p,
 		  struct brw_reg dest,
 		  GLuint function,
-		  GLuint saturate,
 		  GLuint msg_reg_nr,
 		  struct brw_reg src,
 		  GLuint precision );
@@ -983,7 +982,6 @@ void brw_math_16( struct brw_compile *p,
 void brw_math( struct brw_compile *p,
 	       struct brw_reg dest,
 	       GLuint function,
-	       GLuint saturate,
 	       GLuint msg_reg_nr,
 	       struct brw_reg src,
 	       GLuint data_type,
diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
index 25bf91b..b82a858 100644
--- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
@@ -429,7 +429,6 @@ static void brw_set_math_message( struct brw_compile *p,
 				  GLuint function,
 				  GLuint integer_type,
 				  bool low_precision,
-				  bool saturate,
 				  GLuint dataType )
 {
    struct brw_context *brw = p->brw;
@@ -461,22 +460,24 @@ static void brw_set_math_message( struct brw_compile *p,
       break;
    }
 
+
    brw_set_message_descriptor(p, insn, BRW_SFID_MATH,
 			      msg_length, response_length, false, false);
    if (intel->gen == 5) {
       insn->bits3.math_gen5.function = function;
       insn->bits3.math_gen5.int_type = integer_type;
       insn->bits3.math_gen5.precision = low_precision;
-      insn->bits3.math_gen5.saturate = saturate;
+      insn->bits3.math_gen5.saturate = insn->header.saturate;
       insn->bits3.math_gen5.data_type = dataType;
       insn->bits3.math_gen5.snapshot = 0;
    } else {
       insn->bits3.math.function = function;
       insn->bits3.math.int_type = integer_type;
       insn->bits3.math.precision = low_precision;
-      insn->bits3.math.saturate = saturate;
+      insn->bits3.math.saturate = insn->header.saturate;
       insn->bits3.math.data_type = dataType;
    }
+   insn->header.saturate = 0;
 }
 
 
@@ -1657,7 +1658,6 @@ void brw_WAIT (struct brw_compile *p)
 void brw_math( struct brw_compile *p,
 	       struct brw_reg dest,
 	       GLuint function,
-	       GLuint saturate,
 	       GLuint msg_reg_nr,
 	       struct brw_reg src,
 	       GLuint data_type,
@@ -1693,7 +1693,6 @@ void brw_math( struct brw_compile *p,
        * becomes FC[3:0] and ThreadCtrl becomes FC[5:4].
        */
       insn->header.destreg__conditionalmod = function;
-      insn->header.saturate = saturate;
 
       brw_set_dest(p, insn, dest);
       brw_set_src0(p, insn, src);
@@ -1714,7 +1713,6 @@ void brw_math( struct brw_compile *p,
 			   function,
 			   src.type == BRW_REGISTER_TYPE_D,
 			   precision,
-			   saturate,
 			   data_type);
    }
 }
@@ -1779,7 +1777,6 @@ void brw_math2(struct brw_compile *p,
 void brw_math_16( struct brw_compile *p,
 		  struct brw_reg dest,
 		  GLuint function,
-		  GLuint saturate,
 		  GLuint msg_reg_nr,
 		  struct brw_reg src,
 		  GLuint precision )
@@ -1794,7 +1791,6 @@ void brw_math_16( struct brw_compile *p,
        * becomes FC[3:0] and ThreadCtrl becomes FC[5:4].
        */
       insn->header.destreg__conditionalmod = function;
-      insn->header.saturate = saturate;
 
       /* Source modifiers are ignored for extended math instructions. */
       assert(!src.negate);
@@ -1822,7 +1818,6 @@ void brw_math_16( struct brw_compile *p,
 			function,
 			BRW_MATH_INTEGER_UNSIGNED,
 			precision,
-			saturate,
 			BRW_MATH_DATA_VECTOR);
 
    /* Second instruction:
@@ -1838,7 +1833,6 @@ void brw_math_16( struct brw_compile *p,
 			function,
 			BRW_MATH_INTEGER_UNSIGNED,
 			precision,
-			saturate,
 			BRW_MATH_DATA_VECTOR);
 
    brw_pop_insn_state(p);
diff --git a/src/mesa/drivers/dri/i965/brw_eu_util.c b/src/mesa/drivers/dri/i965/brw_eu_util.c
index 5405cf1..2037634 100644
--- a/src/mesa/drivers/dri/i965/brw_eu_util.c
+++ b/src/mesa/drivers/dri/i965/brw_eu_util.c
@@ -42,7 +42,6 @@ void brw_math_invert( struct brw_compile *p,
    brw_math( p, 
 	     dst,
 	     BRW_MATH_FUNCTION_INV, 
-	     BRW_MATH_SATURATE_NONE,
 	     0,
 	     src,
 	     BRW_MATH_PRECISION_FULL, 
diff --git a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
index a5cebcb..4564e3b 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
@@ -160,8 +160,6 @@ fs_visitor::generate_math1_gen7(fs_inst *inst,
    assert(inst->mlen == 0);
    brw_math(p, dst,
 	    brw_math_function(inst->opcode),
-	    inst->saturate ? BRW_MATH_SATURATE_SATURATE
-			   : BRW_MATH_SATURATE_NONE,
 	    0, src0,
 	    BRW_MATH_DATA_VECTOR,
 	    BRW_MATH_PRECISION_FULL);
@@ -189,8 +187,6 @@ fs_visitor::generate_math1_gen6(fs_inst *inst,
    brw_set_compression_control(p, BRW_COMPRESSION_NONE);
    brw_math(p, dst,
 	    op,
-	    inst->saturate ? BRW_MATH_SATURATE_SATURATE :
-	    BRW_MATH_SATURATE_NONE,
 	    0, src0,
 	    BRW_MATH_DATA_VECTOR,
 	    BRW_MATH_PRECISION_FULL);
@@ -199,8 +195,6 @@ fs_visitor::generate_math1_gen6(fs_inst *inst,
       brw_set_compression_control(p, BRW_COMPRESSION_2NDHALF);
       brw_math(p, sechalf(dst),
 	       op,
-	       inst->saturate ? BRW_MATH_SATURATE_SATURATE :
-	       BRW_MATH_SATURATE_NONE,
 	       0, sechalf(src0),
 	       BRW_MATH_DATA_VECTOR,
 	       BRW_MATH_PRECISION_FULL);
@@ -240,8 +234,6 @@ fs_visitor::generate_math_gen4(fs_inst *inst,
    brw_set_compression_control(p, BRW_COMPRESSION_NONE);
    brw_math(p, dst,
 	    op,
-	    inst->saturate ? BRW_MATH_SATURATE_SATURATE :
-	    BRW_MATH_SATURATE_NONE,
 	    inst->base_mrf, src,
 	    BRW_MATH_DATA_VECTOR,
 	    BRW_MATH_PRECISION_FULL);
@@ -250,8 +242,6 @@ fs_visitor::generate_math_gen4(fs_inst *inst,
       brw_set_compression_control(p, BRW_COMPRESSION_2NDHALF);
       brw_math(p, sechalf(dst),
 	       op,
-	       inst->saturate ? BRW_MATH_SATURATE_SATURATE :
-	       BRW_MATH_SATURATE_NONE,
 	       inst->base_mrf + 1, sechalf(src),
 	       BRW_MATH_DATA_VECTOR,
 	       BRW_MATH_PRECISION_FULL);
diff --git a/src/mesa/drivers/dri/i965/brw_sf_emit.c b/src/mesa/drivers/dri/i965/brw_sf_emit.c
index ff6383b..5f3673b 100644
--- a/src/mesa/drivers/dri/i965/brw_sf_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_sf_emit.c
@@ -314,7 +314,6 @@ static void invert_det( struct brw_sf_compile *c)
    brw_math(&c->func, 
 	    c->inv_det, 
 	    BRW_MATH_FUNCTION_INV,
-	    BRW_MATH_SATURATE_NONE,
 	    0, 
 	    c->det,
 	    BRW_MATH_DATA_SCALAR,
@@ -599,7 +598,6 @@ void brw_emit_point_sprite_setup(struct brw_sf_compile *c, bool allocate)
 	 brw_math(&c->func,
 		  c->tmp,
 		  BRW_MATH_FUNCTION_INV,
-		  BRW_MATH_SATURATE_NONE,
 		  0,
 		  c->dx0,
 		  BRW_MATH_DATA_SCALAR,
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
index 7658bb8..21eafcb 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
@@ -262,7 +262,6 @@ vec4_visitor::generate_math1_gen4(vec4_instruction *inst,
    brw_math(p,
 	    dst,
 	    brw_math_function(inst->opcode),
-	    BRW_MATH_SATURATE_NONE,
 	    inst->base_mrf,
 	    src,
 	    BRW_MATH_DATA_VECTOR,
@@ -291,7 +290,6 @@ vec4_visitor::generate_math1_gen6(vec4_instruction *inst,
    brw_math(p,
 	    dst,
 	    brw_math_function(inst->opcode),
-	    BRW_MATH_SATURATE_NONE,
 	    inst->base_mrf,
 	    src,
 	    BRW_MATH_DATA_SCALAR,
@@ -355,7 +353,6 @@ vec4_visitor::generate_math2_gen4(vec4_instruction *inst,
    brw_math(p,
 	    dst,
 	    brw_math_function(inst->opcode),
-	    BRW_MATH_SATURATE_NONE,
 	    inst->base_mrf,
 	    op0,
 	    BRW_MATH_DATA_VECTOR,
diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c
index d0ee5f3..6169f73 100644
--- a/src/mesa/drivers/dri/i965/brw_vs_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c
@@ -670,7 +670,6 @@ static void emit_math1_gen4(struct brw_vs_compile *c,
    brw_math(p, 
 	    tmp,
 	    function,
-	    BRW_MATH_SATURATE_NONE,
 	    2,
 	    arg0,
 	    BRW_MATH_DATA_SCALAR,
@@ -705,7 +704,6 @@ emit_math1_gen6(struct brw_vs_compile *c,
    brw_math(p,
 	    tmp_dst,
 	    function,
-	    BRW_MATH_SATURATE_NONE,
 	    2,
 	    tmp_src,
 	    BRW_MATH_DATA_SCALAR,
@@ -757,7 +755,6 @@ static void emit_math2_gen4( struct brw_vs_compile *c,
    brw_math(p, 
 	    tmp,
 	    function,
-	    BRW_MATH_SATURATE_NONE,
 	    2,
  	    arg0,
 	    BRW_MATH_DATA_SCALAR,
diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c
index 61f66e7..b6defa3 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c
@@ -297,13 +297,11 @@ void emit_pixel_w(struct brw_wm_compile *c,
       if (c->dispatch_width == 16) {
 	 brw_math_16(p, dst[3],
 		     BRW_MATH_FUNCTION_INV,
-		     BRW_MATH_SATURATE_NONE,
 		     2, src,
 		     BRW_MATH_PRECISION_FULL);
       } else {
 	 brw_math(p, dst[3],
 		  BRW_MATH_FUNCTION_INV,
-		  BRW_MATH_SATURATE_NONE,
 		  2, src,
 		  BRW_MATH_DATA_VECTOR,
 		  BRW_MATH_PRECISION_FULL);
@@ -890,9 +888,6 @@ void emit_math1(struct brw_wm_compile *c,
    struct brw_compile *p = &c->func;
    struct intel_context *intel = &p->brw->intel;
    int dst_chan = ffs(mask & WRITEMASK_XYZW) - 1;
-   GLuint saturate = ((mask & SATURATE) ?
-		      BRW_MATH_SATURATE_SATURATE :
-		      BRW_MATH_SATURATE_NONE);
    struct brw_reg src;
 
    if (!(mask & WRITEMASK_XYZW))
@@ -918,11 +913,11 @@ void emit_math1(struct brw_wm_compile *c,
    /* Send two messages to perform all 16 operations:
     */
    brw_push_insn_state(p);
+   brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);
    brw_set_compression_control(p, BRW_COMPRESSION_NONE);
    brw_math(p,
 	    dst[dst_chan],
 	    function,
-	    saturate,
 	    2,
 	    src,
 	    BRW_MATH_DATA_VECTOR,
@@ -933,7 +928,6 @@ void emit_math1(struct brw_wm_compile *c,
       brw_math(p,
 	       offset(dst[dst_chan],1),
 	       function,
-	       saturate,
 	       3,
 	       sechalf(src),
 	       BRW_MATH_DATA_VECTOR,
@@ -1005,10 +999,6 @@ void emit_math2(struct brw_wm_compile *c,
 		   sechalf(src1));
       }
    } else {
-      GLuint saturate = ((mask & SATURATE) ?
-			 BRW_MATH_SATURATE_SATURATE :
-			 BRW_MATH_SATURATE_NONE);
-
       brw_set_compression_control(p, BRW_COMPRESSION_NONE);
       brw_MOV(p, brw_message_reg(3), arg1[0]);
       if (c->dispatch_width == 16) {
@@ -1016,11 +1006,11 @@ void emit_math2(struct brw_wm_compile *c,
 	 brw_MOV(p, brw_message_reg(5), sechalf(arg1[0]));
       }
 
+      brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);
       brw_set_compression_control(p, BRW_COMPRESSION_NONE);
       brw_math(p,
 	       dst[dst_chan],
 	       function,
-	       saturate,
 	       2,
 	       arg0[0],
 	       BRW_MATH_DATA_VECTOR,
@@ -1033,7 +1023,6 @@ void emit_math2(struct brw_wm_compile *c,
 	 brw_math(p,
 		  offset(dst[dst_chan],1),
 		  function,
-		  saturate,
 		  4,
 		  sechalf(arg0[0]),
 		  BRW_MATH_DATA_VECTOR,




More information about the mesa-commit mailing list