diff options
author | Eric Anholt <[email protected]> | 2012-11-09 11:48:20 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2012-12-04 16:58:46 -0800 |
commit | f22a909a080d603db122ac8517a80bd8f4006fe2 (patch) | |
tree | f9bfb16691e52559e186a1d3fe6b58113f7d7a6e /src | |
parent | 9156d0cba1090c4bcc3a6c0c7b2ad8921a295be4 (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.cpp | 28 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 5 |
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 ®); 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; |