From 9b4053cabd8bda180b352d2d2047209f6ca5f6e8 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 6 Aug 2012 14:59:39 -0700 Subject: [PATCH] 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 --- 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 3ab00a263eb..e0e02d4f103 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 25bf91be532..b82a858d9a7 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 5405cf17a4e..2037634981c 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 a5cebcb32e6..4564e3b42e9 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 ff6383bb188..5f3673bec08 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 7658bb86454..21eafcbcb5d 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 d0ee5f3b4b7..6169f737417 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 61f66e7ccdd..b6defa3d59d 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, -- 2.30.2