[Mesa-dev] [PATCH 2/8] glsl: Fix constant evaluation of the rcp op.

Francisco Jerez currojerez at riseup.net
Wed Jan 25 18:53:56 UTC 2017


Hi Ian, and thank you for your comments,

Ian Romanick <idr at freedesktop.org> writes:

> On 01/24/2017 03:26 PM, Francisco Jerez wrote:
>> Will avoid a regression in a future commit that introduces some
>> additional rcp operations.
>
> When I converted GLSL IR to ir_expression_operation.py, I was careful to
> keep all the expressions the same.  rcp and div had these weird guards.
> GLSL doesn't require that NaN be generated, and quite a few old GPUs
> don't.  If the atan2 implementation depends on NaN being generated by
> rcp, it may have problems on i915, r300, and similar GPUs.  I don't know
> what they generate, but it's not NaN and it's probably not 0.0.
>

The atan2 implementation from patch 5 doesn't rely on NaNs being
generated, but it does rely on the reciprocal operation handling zero
and infinity correctly as specified by GLSL for the division operation.

> That said, this matches NIR, and it's probably fine.
>
>> ---
>>  src/compiler/glsl/ir_expression_operation.py | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py
>> index f91ac9b..4ac1ffb 100644
>> --- a/src/compiler/glsl/ir_expression_operation.py
>> +++ b/src/compiler/glsl/ir_expression_operation.py
>> @@ -422,7 +422,7 @@ ir_expression_operation = [
>>     operation("neg", 1, source_types=numeric_types, c_expression={'u': "-((int) {src0})", 'default': "-{src0}"}),
>>     operation("abs", 1, source_types=signed_numeric_types, c_expression={'i': "{src0} < 0 ? -{src0} : {src0}", 'f': "fabsf({src0})", 'd': "fabs({src0})", 'i64': "{src0} < 0 ? -{src0} : {src0}"}),
>>     operation("sign", 1, source_types=signed_numeric_types, c_expression={'i': "({src0} > 0) - ({src0} < 0)", 'f': "float(({src0} > 0.0F) - ({src0} < 0.0F))", 'd': "double(({src0} > 0.0) - ({src0} < 0.0))", 'i64': "({src0} > 0) - ({src0} < 0)"}),
>> -   operation("rcp", 1, source_types=real_types, c_expression={'f': "{src0} != 0.0F ? 1.0F / {src0} : 0.0F", 'd': "{src0} != 0.0 ? 1.0 / {src0} : 0.0"}),
>> +   operation("rcp", 1, source_types=real_types, c_expression={'f': "1.0F / {src0}", 'd': "1.0 / {src0}"}),
>>     operation("rsq", 1, source_types=real_types, c_expression={'f': "1.0F / sqrtf({src0})", 'd': "1.0 / sqrt({src0})"}),
>>     operation("sqrt", 1, source_types=real_types, c_expression={'f': "sqrtf({src0})", 'd': "sqrt({src0})"}),
>>     operation("exp", 1, source_types=(float_type,), c_expression="expf({src0})"),         # Log base e on gentype
>> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170125/19206b62/attachment-0001.sig>


More information about the mesa-dev mailing list