[Mesa-dev] [PATCH 1/2] i965/fs: Simulate MAD opcode with gen<6

Juha-Pekka Heikkilä juhapekka.heikkila at gmail.com
Wed May 7 06:04:37 PDT 2014


On Tue, May 6, 2014 at 7:37 PM, Matt Turner <mattst88 at gmail.com> wrote:
> On Tue, May 6, 2014 at 3:53 AM, Juha-Pekka Heikkila
> <juhapekka.heikkila at gmail.com> wrote:
>> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at 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


I will take a look at your branch, thanks Matt.

/Juha-Pekka


More information about the mesa-dev mailing list