On 08/08/2012 03:08 PM, Eric Anholt wrote: > 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. > --- > 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 233b94c..6cab32d 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);
With my stdbool suggestion, you could drop the silly ? 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); Likewise, stdbool saves you from ? 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, > This looks great, Eric. Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev