[Mesa-dev] [PATCH 14/21] i965: Disallow saturation for MACH operations
Ben Widawsky
benjamin.widawsky at intel.com
Mon Dec 22 19:29:24 PST 2014
"As mach is used to generate part of the 64-bit DWord integer results,
saturation modifier should not be used. In fact, saturation modifier should not
be used for any of these four instructions."
I believe this never actually occurred anyway, and no tests should be effected.
Similar to previous patches, this actually applies to the whole MUL/MACH macro
operation, but it's easier to just catch it at MACH, since that is the only
thing we use MACH for.
Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
---
src/mesa/drivers/dri/i965/brw_fs_saturate_propagation.cpp | 2 +-
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 2 +-
src/mesa/drivers/dri/i965/brw_shader.cpp | 8 ++++++--
src/mesa/drivers/dri/i965/brw_shader.h | 2 +-
4 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs_saturate_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_saturate_propagation.cpp
index a9966a4..840b86f 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_saturate_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_saturate_propagation.cpp
@@ -72,7 +72,7 @@ opt_saturate_propagation_local(fs_visitor *v, bblock_t *block)
inst->saturate = false;
progress = true;
} else if (src_end_ip <= ip || inst->dst.equals(inst->src[0])) {
- if (scan_inst->can_do_saturate()) {
+ if (scan_inst->can_do_saturate(v->brw)) {
scan_inst->saturate = true;
inst->saturate = false;
progress = true;
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 98f1b0d..96ed17e 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -350,7 +350,7 @@ fs_visitor::try_emit_saturate(ir_expression *ir)
*/
fs_inst *modify = get_instruction_generating_reg(pre_inst, last_inst, src);
if (modify && modify->regs_written == modify->dst.width / 8 &&
- modify->can_do_saturate()) {
+ modify->can_do_saturate(this->brw)) {
modify->saturate = true;
this->result = src;
return true;
diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
index 3891f43..006efe3 100644
--- a/src/mesa/drivers/dri/i965/brw_shader.cpp
+++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
@@ -702,7 +702,7 @@ backend_instruction::can_do_source_mods() const
}
bool
-backend_instruction::can_do_saturate() const
+backend_instruction::can_do_saturate(const struct brw_context *brw) const
{
switch (opcode) {
case BRW_OPCODE_ADD:
@@ -717,7 +717,6 @@ backend_instruction::can_do_saturate() const
case BRW_OPCODE_LINE:
case BRW_OPCODE_LRP:
case BRW_OPCODE_MAC:
- case BRW_OPCODE_MACH:
case BRW_OPCODE_MAD:
case BRW_OPCODE_MATH:
case BRW_OPCODE_MOV:
@@ -740,6 +739,11 @@ backend_instruction::can_do_saturate() const
case SHADER_OPCODE_SIN:
case SHADER_OPCODE_SQRT:
return true;
+ case BRW_OPCODE_MACH:
+ if (brw->gen < 8)
+ return true;
+ else
+ return false;
default:
return false;
}
diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h
index 05434a7..4c4bb1a 100644
--- a/src/mesa/drivers/dri/i965/brw_shader.h
+++ b/src/mesa/drivers/dri/i965/brw_shader.h
@@ -86,7 +86,7 @@ struct backend_instruction : public exec_node {
bool is_math() const;
bool is_control_flow() const;
bool can_do_source_mods() const;
- bool can_do_saturate() const;
+ bool can_do_saturate(const struct brw_context *brw) const;
bool reads_accumulator_implicitly() const;
bool writes_accumulator_implicitly(struct brw_context *brw) const;
--
2.2.1
More information about the mesa-dev
mailing list