The lowering needs to be disabled for sufficient precision to pass deqp-vk's 16-bit fma test on radv.
Signed-off-by: Rhys Perry <pendingchao...@gmail.com> --- src/broadcom/compiler/nir_to_vir.c | 1 + src/compiler/nir/nir.h | 1 + src/compiler/nir/nir_opt_algebraic.py | 4 +++- src/gallium/drivers/radeonsi/si_get.c | 1 + src/gallium/drivers/vc4/vc4_program.c | 1 + 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index d983f91e718..6c0a623096a 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -2471,6 +2471,7 @@ const nir_shader_compiler_options v3d_nir_options = { .lower_fdiv = true, .lower_find_lsb = true, .lower_ffma = true, + .lower_ffma16 = true, .lower_flrp32 = true, .lower_fpow = true, .lower_fsat = true, diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 740c64d2a94..8df275f4aa3 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2111,6 +2111,7 @@ typedef struct nir_function { typedef struct nir_shader_compiler_options { bool lower_fdiv; + bool lower_ffma16; bool lower_ffma; bool fuse_ffma; bool lower_flrp16; diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 71c626e1b3f..63dff878d35 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -136,7 +136,9 @@ optimizations = [ (('~fadd', a, ('fmul', ('b2f', 'c@1'), ('fadd', b, ('fneg', a)))), ('bcsel', c, b, a), 'options->lower_flrp32'), (('~fadd@32', a, ('fmul', c , ('fadd', b, ('fneg', a)))), ('flrp', a, b, c), '!options->lower_flrp32'), (('~fadd@64', a, ('fmul', c , ('fadd', b, ('fneg', a)))), ('flrp', a, b, c), '!options->lower_flrp64'), - (('ffma', a, b, c), ('fadd', ('fmul', a, b), c), 'options->lower_ffma'), + (('ffma@16', a, b, c), ('fadd', ('fmul', a, b), c), 'options->lower_ffma16'), + (('ffma@32', a, b, c), ('fadd', ('fmul', a, b), c), 'options->lower_ffma'), + (('ffma@64', a, b, c), ('fadd', ('fmul', a, b), c), 'options->lower_ffma'), (('~fadd', ('fmul', a, b), c), ('ffma', a, b, c), 'options->fuse_ffma'), (('fdot4', ('vec4', a, b, c, 1.0), d), ('fdph', ('vec3', a, b, c), d)), diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index f8ca02d4fcf..5bf107ef6fe 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -491,6 +491,7 @@ static const struct nir_shader_compiler_options nir_options = { .lower_fdiv = true, .lower_sub = true, .lower_ffma = true, + .lower_ffma16 = true, .lower_pack_snorm_2x16 = true, .lower_pack_snorm_4x8 = true, .lower_pack_unorm_2x16 = true, diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 2d0a52bb5fb..8be258cbba4 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -2234,6 +2234,7 @@ static const nir_shader_compiler_options nir_options = { .lower_extract_word = true, .lower_fdiv = true, .lower_ffma = true, + .lower_ffma16 = true, .lower_flrp32 = true, .lower_fpow = true, .lower_fsat = true, -- 2.20.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev