Module: Mesa
Branch: master
Commit: 6702e542cf1df4de65c4329731fe8c461c321e48
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6702e542cf1df4de65c4329731fe8c461c321e48

Author: Marek Olšák <[email protected]>
Date:   Fri Jul 24 16:14:02 2020 -0400

radeonsi: don't scalarize 16-bit vec2 ALU opcodes

prerequisite for enabling vectorization, so that we don't scalarize
and vectorize at the same time, causing an infinite loop.

Acked-by: Pierre-Eric Pelloux-Prayer <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6622>

---

 src/gallium/drivers/radeonsi/si_shader_nir.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c 
b/src/gallium/drivers/radeonsi/si_shader_nir.c
index 043482d6ec1..171c2b37203 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -465,12 +465,29 @@ void si_nir_scan_shader(const struct nir_shader *nir, 
struct si_shader_info *inf
       info->output_readmask[i] &= info->output_usagemask[i];
 }
 
-static void si_nir_opts(struct nir_shader *nir, bool first)
+static bool si_alu_to_scalar_filter(const nir_instr *instr, const void *data)
+{
+   struct si_screen *sscreen = (struct si_screen *)data;
+
+   if (sscreen->info.has_packed_math_16bit &&
+       instr->type == nir_instr_type_alu) {
+      nir_alu_instr *alu = nir_instr_as_alu(instr);
+
+      if (alu->dest.dest.is_ssa &&
+          alu->dest.dest.ssa.bit_size == 16 &&
+          alu->dest.dest.ssa.num_components == 2)
+         return false;
+   }
+
+   return true;
+}
+
+static void si_nir_opts(struct si_screen *sscreen, struct nir_shader *nir, 
bool first)
 {
    bool progress;
 
    NIR_PASS_V(nir, nir_lower_vars_to_ssa);
-   NIR_PASS_V(nir, nir_lower_alu_to_scalar, NULL, NULL);
+   NIR_PASS_V(nir, nir_lower_alu_to_scalar, si_alu_to_scalar_filter, sscreen);
    NIR_PASS_V(nir, nir_lower_phis_to_scalar);
 
    do {
@@ -507,7 +524,7 @@ static void si_nir_opts(struct nir_shader *nir, bool first)
       NIR_PASS(progress, nir, nir_opt_dead_cf);
 
       if (lower_alu_to_scalar)
-         NIR_PASS_V(nir, nir_lower_alu_to_scalar, NULL, NULL);
+         NIR_PASS_V(nir, nir_lower_alu_to_scalar, si_alu_to_scalar_filter, 
sscreen);
       if (lower_phis_to_scalar)
          NIR_PASS_V(nir, nir_lower_phis_to_scalar);
       progress |= lower_alu_to_scalar | lower_phis_to_scalar;
@@ -720,7 +737,7 @@ static void si_lower_nir(struct si_screen *sscreen, struct 
nir_shader *nir)
        sscreen->b.get_shader_param(&sscreen->b, PIPE_SHADER_FRAGMENT, 
PIPE_SHADER_CAP_FP16))
       NIR_PASS_V(nir, nir_lower_mediump_outputs);
 
-   si_nir_opts(nir, true);
+   si_nir_opts(sscreen, nir, true);
 
    /* Lower large variables that are always constant with load_constant
     * intrinsics, which get turned into PC-relative loads from a data
@@ -737,7 +754,7 @@ static void si_lower_nir(struct si_screen *sscreen, struct 
nir_shader *nir)
 
    changed |= ac_lower_indirect_derefs(nir, sscreen->info.chip_class);
    if (changed)
-      si_nir_opts(nir, false);
+      si_nir_opts(sscreen, nir, false);
 
    /* Run late optimizations to fuse ffma. */
    bool more_late_algebraic = true;

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to