diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 92d6d1a6ee7..2837170b13f 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -5070,12 +5070,14 @@ bool nir_lower_atomics_to_ssbo(nir_shader *shader); typedef enum { nir_lower_int_source_mods = 1 << 0, - nir_lower_float_source_mods = 1 << 1, - nir_lower_64bit_source_mods = 1 << 2, - nir_lower_triop_abs = 1 << 3, - nir_lower_all_source_mods = (1 << 4) - 1 + nir_lower_fabs_source_mods = 1 << 1, + nir_lower_fneg_source_mods = 1 << 2, + nir_lower_64bit_source_mods = 1 << 3, + nir_lower_triop_abs = 1 << 4, + nir_lower_all_source_mods = (1 << 5) - 1 } nir_lower_to_source_mods_flags; +#define nir_lower_float_source_mods (nir_lower_fabs_source_mods | nir_lower_fneg_source_mods) bool nir_lower_to_source_mods(nir_shader *shader, nir_lower_to_source_mods_flags options); diff --git a/src/compiler/nir/nir_lower_to_source_mods.c b/src/compiler/nir/nir_lower_to_source_mods.c index fa53bac2914..b44189db5ab 100644 --- a/src/compiler/nir/nir_lower_to_source_mods.c +++ b/src/compiler/nir/nir_lower_to_source_mods.c @@ -78,8 +78,10 @@ nir_lower_to_source_mods_block(nir_block *block, case nir_type_float: if (!(options & nir_lower_float_source_mods)) continue; - if (parent->op != nir_op_fabs && parent->op != nir_op_fneg) + if (!(parent->op == nir_op_fabs && (options & nir_lower_fabs_source_mods)) && + !(parent->op == nir_op_fneg && (options & nir_lower_fneg_source_mods))) { continue; + } break; case nir_type_int: if (!(options & nir_lower_int_source_mods))