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.pitoi...@gmail.com <mailto:samuel.pitoi...@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.pitoi...@gmail.com
<mailto:samuel.pitoi...@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@lists.freedesktop.org <mailto:mesa-dev@lists.freedesktop.org>
https://lists.freedesktop.org/mailman/listinfo/mesa-dev