mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 08:50:13 +01:00
i965/fs: Refactor try_emit_saturate
v3: Since the fs backend can emit saturate as a separate instruction, there is
no need to detect for min/max instructions and to rewrite the instruction tree
accordingly. On the other hand, we don't need to emit a separate saturated
mov either when the expression generating src can do saturate directly.
v4: Add can_do_saturate() check before enabling saturate modifer (Ken)
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
This commit is contained in:
parent
b2c0c35907
commit
cbd225057a
1 changed files with 8 additions and 15 deletions
|
|
@ -267,17 +267,14 @@ fs_visitor::emit_minmax(enum brw_conditional_mod conditionalmod, const fs_reg &d
|
|||
}
|
||||
}
|
||||
|
||||
/* Instruction selection: Produce a MOV.sat instead of
|
||||
* MIN(MAX(val, 0), 1) when possible.
|
||||
*/
|
||||
bool
|
||||
fs_visitor::try_emit_saturate(ir_expression *ir)
|
||||
{
|
||||
ir_rvalue *sat_val = ir->as_rvalue_to_saturate();
|
||||
|
||||
if (!sat_val)
|
||||
if (ir->operation != ir_unop_saturate)
|
||||
return false;
|
||||
|
||||
ir_rvalue *sat_val = ir->operands[0];
|
||||
|
||||
fs_inst *pre_inst = (fs_inst *) this->instructions.get_tail();
|
||||
|
||||
sat_val->accept(this);
|
||||
|
|
@ -285,21 +282,17 @@ fs_visitor::try_emit_saturate(ir_expression *ir)
|
|||
|
||||
fs_inst *last_inst = (fs_inst *) this->instructions.get_tail();
|
||||
|
||||
/* If the last instruction from our accept() didn't generate our
|
||||
* src, generate a saturated MOV
|
||||
/* If the last instruction from our accept() generated our
|
||||
* src, just set the saturate flag instead of emmitting a separate mov.
|
||||
*/
|
||||
fs_inst *modify = get_instruction_generating_reg(pre_inst, last_inst, src);
|
||||
if (!modify || modify->regs_written != 1) {
|
||||
this->result = fs_reg(this, ir->type);
|
||||
fs_inst *inst = emit(MOV(this->result, src));
|
||||
inst->saturate = true;
|
||||
} else {
|
||||
if (modify && modify->regs_written == 1 && modify->can_do_saturate()) {
|
||||
modify->saturate = true;
|
||||
this->result = src;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue