summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2012-08-06 14:59:39 -0700
committerIan Romanick <ian.d.romanick@intel.com>2012-10-24 11:41:06 -0700
commitf0b188a6c67ed1b78d69d27d772f1d7c3069c954 (patch)
tree9749caf2a4b532e849c1e56b38395d5aaed945c5
parent7a139205975569630586c73522c7e934d0cae937 (diff)
downloadmesa-f0b188a6c67ed1b78d69d27d772f1d7c3069c954.tar.gz
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@whitecape.org> (cherry picked from commit 9b4053cabd8bda180b352d2d2047209f6ca5f6e8)
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu.h2
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu_emit.c14
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu_util.c1
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_emit.cpp10
-rw-r--r--src/mesa/drivers/dri/i965/brw_sf_emit.c2
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_emit.cpp3
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs_emit.c3
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm_emit.c15
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 5064c18fa12..7c0aaed873c 100644
--- a/src/mesa/drivers/dri/i965/brw_eu.h
+++ b/src/mesa/drivers/dri/i965/brw_eu.h
@@ -974,7 +974,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 );
@@ -982,7 +981,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 21d3c5a27e2..ca069579962 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;
}
@@ -1567,7 +1568,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,
@@ -1603,7 +1603,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);
@@ -1624,7 +1623,6 @@ void brw_math( struct brw_compile *p,
function,
src.type == BRW_REGISTER_TYPE_D,
precision,
- saturate,
data_type);
}
}
@@ -1689,7 +1687,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 )
@@ -1704,7 +1701,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);
@@ -1732,7 +1728,6 @@ void brw_math_16( struct brw_compile *p,
function,
BRW_MATH_INTEGER_UNSIGNED,
precision,
- saturate,
BRW_MATH_DATA_VECTOR);
/* Second instruction:
@@ -1748,7 +1743,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 ebead4fe09d..541442a570d 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
@@ -194,8 +194,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);
@@ -223,8 +221,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);
@@ -233,8 +229,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);
@@ -274,8 +268,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);
@@ -284,8 +276,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 917c927a125..02d90987d3f 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 44067437a20..38b5dfb91e1 100644
--- a/src/mesa/drivers/dri/i965/brw_vs_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c
@@ -677,7 +677,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,
@@ -712,7 +711,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,
@@ -764,7 +762,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 e565b71c66e..31982e6b7b5 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 = _mesa_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,