On Tue, May 6, 2014 at 3:53 AM, Juha-Pekka Heikkila <juhapekka.heikk...@gmail.com> wrote: > Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikk...@gmail.com> > --- > src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > index d2dc5fa..22ca528 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > @@ -293,10 +293,6 @@ fs_visitor::try_emit_saturate(ir_expression *ir) > bool > fs_visitor::try_emit_mad(ir_expression *ir) > { > - /* 3-src instructions were introduced in gen6. */ > - if (brw->gen < 6) > - return false; > - > /* MAD can only handle floating-point data. */ > if (ir->type != glsl_type::float_type) > return false; > @@ -327,7 +323,16 @@ fs_visitor::try_emit_mad(ir_expression *ir) > fs_reg src2 = this->result; > > this->result = fs_reg(this, ir->type); > - emit(BRW_OPCODE_MAD, this->result, src0, src1, src2); > + > + /* 3-src instructions were introduced in gen6. */ > + if (brw->gen < 6) { > + fs_reg temp = fs_reg(this, glsl_type::float_type); > + > + emit(MUL(temp, src1, src2)); > + emit(ADD(this->result, src0, temp)); > + } else { > + emit(BRW_OPCODE_MAD, this->result, src0, src1, src2); > + } > > return true; > } > -- > 1.8.1.2
try_emit_mad is called every time we visit an add-expression, and on platforms that don't have MAD it fails and the compiler generates standard code for the expression tree. So, if your expression tree was a a multiply-add the compiler will generate a multiply and an add instruction. Adding code to make try_emit_mad do that doesn't actually change anything. I've made a branch that uses the LINE instruction to perform multiply-adds when the arguments are immediates. Minus the shader size explosion in unigine tropics, it seems to be a pretty nice improvement. But the problem with unigine will have to be sorted out before it can be committed. Maybe you'd be interested in taking a look at that? See https://bugs.freedesktop.org/show_bug.cgi?id=77544 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev