From f22a909a080d603db122ac8517a80bd8f4006fe2 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 9 Nov 2012 11:48:20 -0800 Subject: [PATCH] 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. --- src/mesa/drivers/dri/i965/brw_fs.cpp | 28 ++++++++++++++++++---- src/mesa/drivers/dri/i965/brw_fs.h | 3 +++ .../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 6ccc0d9..d0260af 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 dae7815..ec4d486 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 d296e48..c9c9028 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; -- 2.7.4