On Tue, Aug 13, 2013 at 4:47 PM, Kenneth Graunke <kenn...@whitecape.org> wrote: > Sandybridge is the only platform that supports an IF instruction > with an embedded comparison. In this case, we need to emit a CMP > to go along with the SEL. > > Fixes regressions in Piglit's glsl-fs-atan-3, fs-unpackHalf2x16, > fs-faceforward-float-float-float, isinf-and-isnan fs_basic, and > isinf-and-isnan fs_fbo. > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > --- > src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 17 +++++++++++++---- > 1 file changed, 13 insertions(+), 4 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > index a36c248..984b08a 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > @@ -1911,10 +1911,19 @@ fs_visitor::try_replace_with_sel() > emit(MOV(src0, then_mov->src[0])); > } > > - fs_inst *sel = emit(BRW_OPCODE_SEL, then_mov->dst, src0, > else_mov->src[0]); > - sel->predicate = if_inst->predicate; > - sel->predicate_inverse = if_inst->predicate_inverse; > - sel->conditional_mod = if_inst->conditional_mod; > + fs_inst *sel; > + if (if_inst->conditional_mod) { > + /* Sandybridge-specific IF with embedded comparison */ > + emit(CMP(reg_null_d, if_inst->src[0], if_inst->src[1], > + if_inst->conditional_mod)); > + sel = emit(BRW_OPCODE_SEL, then_mov->dst, src0, else_mov->src[0]); > + sel->predicate = BRW_PREDICATE_NORMAL; > + } else { > + /* Separate CMP and IF instructions */ > + sel = emit(BRW_OPCODE_SEL, then_mov->dst, src0, else_mov->src[0]); > + sel->predicate = if_inst->predicate; > + sel->predicate_inverse = if_inst->predicate_inverse; > + } > } > } > > -- > 1.8.3.4
Reviewed-by: Matt Turner <matts...@gmail.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev