On Tuesday, February 24, 2015 01:25:18 PM Connor Abbott wrote: > On Tue, Feb 24, 2015 at 5:19 AM, Kenneth Graunke <kenn...@whitecape.org> > wrote: > > For conditional discards, we can call emit_bool_to_cond_code to generate > > the condition in f0.0. However, we want it in f0.1. The flag value is > > always produced by the last instruction emit_bool_to_cond_code > > generates, so we can simply get the last instruction and patch it up. > > Is this left over from an earlier version? It seems to me like we're > just doing the dumb thing (rather than emit_bool_to_cond_code()) here > and letting the i965 optimizer clean it up for both GLSL IR and NIR.
Oops. Yes :) I was originally doing: emit_bool_to_cond_code(new(mem_ctx) ir_expression(ir_unop_logic_not, ir->condition)) cmp = (fs_inst *) this->instructions.get_tail(); but that seemed more fragile for no real benefit - it actually emitted ir->condition as a boolean, then did an AND.z <bool> 1D to produce the condition code (making cmp an AND!). Same number of instructions. I'll fix up the commit message. > > > > Nothing generates these today, but that will change shortly. > > > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > > --- > > src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 22 ++++++++++++++-------- > > src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 21 ++++++++++++--------- > > 2 files changed, 26 insertions(+), 17 deletions(-) > > > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > > b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > > index 90eecae..6354bde 100644 > > --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > > +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > > @@ -1149,16 +1149,22 @@ fs_visitor::nir_emit_intrinsic(nir_intrinsic_instr > > *instr) > > bool has_indirect = false; > > > > switch (instr->intrinsic) { > > - case nir_intrinsic_discard: { > > + case nir_intrinsic_discard: > > + case nir_intrinsic_discard_if: { > > /* We track our discarded pixels in f0.1. By predicating on it, we > > can > > - * update just the flag bits that aren't yet discarded. By emitting > > a > > - * CMP of g0 != g0, all our currently executing channels will get > > turned > > - * off. > > + * update just the flag bits that aren't yet discarded. If there's > > no > > + * condition, we emit a CMP of g0 != g0, so all currently executing > > + * channels will get turned off. > > */ > > - fs_reg some_reg = fs_reg(retype(brw_vec8_grf(0, 0), > > - BRW_REGISTER_TYPE_UW)); > > - fs_inst *cmp = emit(CMP(reg_null_f, some_reg, some_reg, > > - BRW_CONDITIONAL_NZ)); > > + fs_inst *cmp; > > + if (instr->intrinsic == nir_intrinsic_discard_if) { > > + cmp = emit(CMP(reg_null_f, get_nir_src(instr->src[0]), > > + fs_reg(0), BRW_CONDITIONAL_Z)); > > + } else { > > + fs_reg some_reg = fs_reg(retype(brw_vec8_grf(0, 0), > > + BRW_REGISTER_TYPE_UW)); > > + cmp = emit(CMP(reg_null_f, some_reg, some_reg, > > BRW_CONDITIONAL_NZ)); > > + } > > cmp->predicate = BRW_PREDICATE_NORMAL; > > cmp->flag_subreg = 1; > > > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > > b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > > index b1b75821..75254a1 100644 > > --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > > +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > > @@ -2415,17 +2415,20 @@ fs_visitor::visit(ir_swizzle *ir) > > void > > fs_visitor::visit(ir_discard *ir) > > { > > - assert(ir->condition == NULL); /* FINISHME */ > > - > > /* We track our discarded pixels in f0.1. By predicating on it, we can > > - * update just the flag bits that aren't yet discarded. By emitting a > > - * CMP of g0 != g0, all our currently executing channels will get turned > > - * off. > > + * update just the flag bits that aren't yet discarded. If there's no > > + * condition, we emit a CMP of g0 != g0, so all currently executing > > + * channels will get turned off. > > */ > > - fs_reg some_reg = fs_reg(retype(brw_vec8_grf(0, 0), > > - BRW_REGISTER_TYPE_UW)); > > - fs_inst *cmp = emit(CMP(reg_null_f, some_reg, some_reg, > > - BRW_CONDITIONAL_NZ)); > > + fs_inst *cmp; > > + if (ir->condition) { > > + ir->condition->accept(this); > > + cmp = emit(CMP(reg_null_f, this->result, fs_reg(0), > > BRW_CONDITIONAL_Z)); > > + } else { > > + fs_reg some_reg = fs_reg(retype(brw_vec8_grf(0, 0), > > + BRW_REGISTER_TYPE_UW)); > > + cmp = emit(CMP(reg_null_f, some_reg, some_reg, BRW_CONDITIONAL_NZ)); > > + } > > cmp->predicate = BRW_PREDICATE_NORMAL; > > cmp->flag_subreg = 1; > > > > -- > > 2.2.2 > > > > _______________________________________________ > > mesa-dev mailing list > > mesa-dev@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev