nir: Add posibility to not lower to source mod 'abs' for ops with three sources
authorGert Wollny <gw.fossdev@gmail.com>
Sat, 2 Feb 2019 17:38:17 +0000 (18:38 +0100)
committerGert Wollny <gw.fossdev@gmail.com>
Wed, 27 Feb 2019 11:04:06 +0000 (11:04 +0000)
This is useful for r600 since there the abs source modifier is not supported
for ops with three sources

v2: Use correct logic to enable lowering to abs source mod (Eric Anhold)

Signed-off-by: Gert Wollny <gw.fossdev@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/compiler/nir/nir.h
src/compiler/nir/nir_lower_to_source_mods.c

index 3403f841939cc552553952bdc8fb9fe92a26fe84..ac574f903f060aefd63747c64a8b917ce1e446de 100644 (file)
@@ -3205,7 +3205,8 @@ bool nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset);
 typedef enum  {
    nir_lower_int_source_mods = 1 << 0,
    nir_lower_float_source_mods = 1 << 1,
-   nir_lower_all_source_mods = (1 << 2) - 1
+   nir_lower_triop_abs = 1 << 2,
+   nir_lower_all_source_mods = (1 << 3) - 1
 } nir_lower_to_source_mods_flags;
 
 
index 657bf8a3d71ea5afe99e1d0064fc0729ca65e1e9..3ca53c34afc595a42944cf975c7a8adc284ef354 100644 (file)
@@ -45,6 +45,9 @@ nir_lower_to_source_mods_block(nir_block *block,
 
       nir_alu_instr *alu = nir_instr_as_alu(instr);
 
+      bool lower_abs = (nir_op_infos[alu->op].num_inputs < 3) ||
+            (options & nir_lower_triop_abs);
+
       for (unsigned i = 0; i < nir_op_infos[alu->op].num_inputs; i++) {
          if (!alu->src[i].src.is_ssa)
             continue;
@@ -81,6 +84,9 @@ nir_lower_to_source_mods_block(nir_block *block,
          if (!parent->src[0].src.is_ssa)
             continue;
 
+         if (!lower_abs && parent->src[0].abs)
+            continue;
+
          nir_instr_rewrite_src(instr, &alu->src[i].src, parent->src[0].src);
          if (alu->src[i].abs) {
             /* abs trumps both neg and abs, do nothing */