summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2012-11-09 11:48:20 -0800
committerEric Anholt <[email protected]>2012-12-04 16:58:46 -0800
commitf22a909a080d603db122ac8517a80bd8f4006fe2 (patch)
treef9bfb16691e52559e186a1d3fe6b58113f7d7a6e /src
parent9156d0cba1090c4bcc3a6c0c7b2ad8921a295be4 (diff)
i965/fs: Restrict optimization that would fail for gen7's SENDs from GRFs
v2: Fix SNB math bug in register_coalesce() where I was looking at the instruction to be removed, not the instruction to be copy propagated into.
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp28
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.h3
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp5
3 files changed, 28 insertions, 8 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 6ccc0d99743..d0260af3e21 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -288,6 +288,24 @@ fs_inst::is_math()
opcode == SHADER_OPCODE_POW);
}
+bool
+fs_inst::is_send_from_grf()
+{
+ return opcode == FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN7;
+}
+
+bool
+fs_visitor::can_do_source_mods(fs_inst *inst)
+{
+ if (intel->gen == 6 && inst->is_math())
+ return false;
+
+ if (inst->is_send_from_grf())
+ return false;
+
+ return true;
+}
+
void
fs_reg::init()
{
@@ -1622,7 +1640,9 @@ fs_visitor::register_coalesce()
inst->dst.type != inst->src[0].type)
continue;
- bool has_source_modifiers = inst->src[0].abs || inst->src[0].negate;
+ bool has_source_modifiers = (inst->src[0].abs ||
+ inst->src[0].negate ||
+ inst->src[0].file == UNIFORM);
/* Found a move of a GRF to a GRF. Let's see if we can coalesce
* them: check for no writes to either one until the exit of the
@@ -1645,10 +1665,8 @@ fs_visitor::register_coalesce()
* unusual register regions, so avoid coalescing those for
* now. We should do something more specific.
*/
- if (intel->gen == 6 &&
- scan_inst->is_math() &&
- (has_source_modifiers || inst->src[0].file == UNIFORM)) {
- interfered = true;
+ if (has_source_modifiers && !can_do_source_mods(scan_inst)) {
+ interfered = true;
break;
}
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index dae78155269..ec4d486b682 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -156,6 +156,7 @@ public:
bool overwrites_reg(const fs_reg &reg);
bool is_tex();
bool is_math();
+ bool is_send_from_grf();
fs_reg dst;
fs_reg src[3];
@@ -222,6 +223,8 @@ public:
void swizzle_result(ir_texture *ir, fs_reg orig_val, int sampler);
+ bool can_do_source_mods(fs_inst *inst);
+
fs_inst *emit(fs_inst inst);
fs_inst *emit(fs_inst *inst);
diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
index d296e48c038..c9c90284eac 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
@@ -216,9 +216,8 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
bool has_source_modifiers = entry->src.abs || entry->src.negate;
- if (intel->gen == 6 && inst->is_math() &&
- (has_source_modifiers || entry->src.file == UNIFORM ||
- entry->src.smear != -1))
+ if ((has_source_modifiers || entry->src.file == UNIFORM ||
+ entry->src.smear != -1) && !can_do_source_mods(inst))
return false;
inst->src[arg].file = entry->src.file;