[Mesa-dev] [PATCH 1/2] nir: add a compiler option for disabling float comparison simplifications

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu Nov 29 15:20:10 UTC 2018


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>
---
 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'),
    (('inot', ('ilt', a, b)), ('ige', a, b)),
    (('inot', ('ult', a, b)), ('uge', a, b)),
    (('inot', ('ige', a, b)), ('ilt', a, b)),
-- 
2.19.2



More information about the mesa-dev mailing list