[Mesa-dev] [PATCH 1/2] nir: add a compiler option for disabling float comparison simplifications
Samuel Pitoiset
samuel.pitoiset at gmail.com
Sat Dec 1 14:41:33 UTC 2018
On 12/1/18 3:36 PM, Connor Abbott wrote:
> On Sat, Dec 1, 2018 at 3:22 PM Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>>
>> I'm not saying this series is the right thing to do. It just fixes two
>> test failures in the vkd3d testsuite for RADV. I added a new compiler
>> option to not break anything and to only affects RADV. Anyways, it seems
>> unclear what the best option is. To sum up, looks like there is 3 ways:
>>
>> 1) set the exact bit for all SPIRV float comparisons ops
>> 2) draft a new extension, not sure if we really need to
>> 3) just remove these optimisations when targeting Vulkan
>>
>> Opinions are welcome, thanks!
>
> Well, I was just pointing out that this has bit us in the past, and
> will probably bite us in the future if we don't fix it once and for
> all, so it's about more than the vkd3d testsuite. We're just getting
> lucky since right now the optimizations only trigger and mess things
> up with this testsuite. After thinking about it, I think it's best if
> we do another option 4, which is to remove the optimizations in
> question and always do the right thing even for GLSL.
I agree, it's not the first time we have problems with that and it would
be very nice to fix it for real. vkd3d is just one example.
>
>>
>> On 11/29/18 4:22 PM, Jason Ekstrand wrote:
>>> Can you provide some context for this? Those rules are already flagged
>>> "inexact" (that's what the ~ means) so they won't apply to anything
>>> that's "precise" or "invariant".
>>>
>>> On Thu, Nov 29, 2018 at 9:18 AM Samuel Pitoiset
>>> <samuel.pitoiset at gmail.com <mailto:samuel.pitoiset at gmail.com>> wrote:
>>>
>>> It's correct in GLSL because the behaviour is undefined in
>>> presence of NaNs. But this seems incorrect in Vulkan.
>>>
>>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com
>>> <mailto:samuel.pitoiset at gmail.com>>
>>> ---
>>> src/compiler/nir/nir.h | 6 ++++++
>>> src/compiler/nir/nir_opt_algebraic.py | 8 ++++----
>>> 2 files changed, 10 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
>>> index db935c8496b..4107c293962 100644
>>> --- a/src/compiler/nir/nir.h
>>> +++ b/src/compiler/nir/nir.h
>>> @@ -2188,6 +2188,12 @@ typedef struct nir_shader_compiler_options {
>>> /* Set if nir_lower_wpos_ytransform() should also invert
>>> gl_PointCoord. */
>>> bool lower_wpos_pntc;
>>>
>>> + /* If false, lower ~inot(flt(a,b)) -> fge(a,b) and variants.
>>> + * In presence of NaNs, this is correct in GLSL because the
>>> behaviour is
>>> + * undefined. In Vulkan, doing these transformations is
>>> incorrect.
>>> + */
>>> + bool exact_float_comparisons;
>>> +
>>> /**
>>> * Should nir_lower_io() create load_interpolated_input intrinsics?
>>> *
>>> diff --git a/src/compiler/nir/nir_opt_algebraic.py
>>> b/src/compiler/nir/nir_opt_algebraic.py
>>> index f2a7be0c403..3750874407b 100644
>>> --- a/src/compiler/nir/nir_opt_algebraic.py
>>> +++ b/src/compiler/nir/nir_opt_algebraic.py
>>> @@ -154,10 +154,10 @@ optimizations = [
>>> (('ishl', ('imul', a, '#b'), '#c'), ('imul', a, ('ishl', b, c))),
>>>
>>> # Comparison simplifications
>>> - (('~inot', ('flt', a, b)), ('fge', a, b)),
>>> - (('~inot', ('fge', a, b)), ('flt', a, b)),
>>> - (('~inot', ('feq', a, b)), ('fne', a, b)),
>>> - (('~inot', ('fne', a, b)), ('feq', a, b)),
>>> + (('~inot', ('flt', a, b)), ('fge', a, b),
>>> '!options->exact_float_comparisons'),
>>> + (('~inot', ('fge', a, b)), ('flt', a, b),
>>> '!options->exact_float_comparisons'),
>>> + (('~inot', ('feq', a, b)), ('fne', a, b),
>>> '!options->exact_float_comparisons'),
>>> + (('~inot', ('fne', a, b)), ('feq', a, b),
>>> '!options->exact_float_comparisons'),
>>>
>>>
>>> The feq/fne one is actually completely safe. fne is defined to be !feq
>>> even when NaN is considered.
>>>
>>> --Jasoan
>>>
>>> (('inot', ('ilt', a, b)), ('ige', a, b)),
>>> (('inot', ('ult', a, b)), ('uge', a, b)),
>>> (('inot', ('ige', a, b)), ('ilt', a, b)),
>>> --
>>> 2.19.2
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list