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.
This commit is contained in:
parent
9156d0cba1
commit
f22a909a08
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue