diff options
author | Abdiel Janulgue <[email protected]> | 2014-07-03 04:14:39 -0700 |
---|---|---|
committer | Abdiel Janulgue <[email protected]> | 2014-08-31 21:04:09 +0300 |
commit | 40aeb558ce8a7ffaaa6f81be16419b9b238c16d8 (patch) | |
tree | c0aff97085fb51c1fb207012c390d8613c4e259d | |
parent | 0e2ba3ee827f77af0b1f322d95c650f6f7f4da88 (diff) |
i965/fs: Allow propagation of instructions with saturate flag to sel
When sel conditon is bounded within 0 and 1.0. This allows code as:
mov.sat a b
sel.ge dst a 0.25F
To be propagated as:
sel.ge.sat dst b 0.25F
v3: Syntax clarifications in inst->saturate assignment (Matt Turner)
Reviewed-by: Matt Turner <[email protected]>
Signed-off-by: Abdiel Janulgue <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
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 e0655fcf2e8..e5816df7e1b 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp @@ -43,6 +43,7 @@ struct acp_entry : public exec_node { fs_reg dst; fs_reg src; enum opcode opcode; + bool saturate; }; struct block_data { @@ -344,11 +345,26 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry) return false; } + if (entry->saturate) { + switch(inst->opcode) { + case BRW_OPCODE_SEL: + if (inst->src[1].file != IMM || + inst->src[1].fixed_hw_reg.dw1.f < 0.0 || + inst->src[1].fixed_hw_reg.dw1.f > 1.0) { + return false; + } + break; + default: + return false; + } + } + inst->src[arg].file = entry->src.file; inst->src[arg].reg = entry->src.reg; inst->src[arg].reg_offset = entry->src.reg_offset; inst->src[arg].subreg_offset = entry->src.subreg_offset; inst->src[arg].stride *= entry->src.stride; + inst->saturate = inst->saturate || entry->saturate; if (!inst->src[arg].abs) { inst->src[arg].abs = entry->src.abs; @@ -511,7 +527,6 @@ can_propagate_from(fs_inst *inst) inst->src[0].file == UNIFORM || inst->src[0].file == IMM) && inst->src[0].type == inst->dst.type && - !inst->saturate && !inst->is_partial_write()); } @@ -566,6 +581,7 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, bblock_t *block, entry->dst = inst->dst; entry->src = inst->src[0]; entry->opcode = inst->opcode; + entry->saturate = inst->saturate; acp[entry->dst.reg % ACP_HASH_SIZE].push_tail(entry); } else if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD && inst->dst.file == GRF) { |