Mesa (main): freedreno: switch to NIR loop unrolling

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jun 4 16:47:32 UTC 2022


Module: Mesa
Branch: main
Commit: 57dee95b854fe0ede3a6744f34e102000a118c2f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=57dee95b854fe0ede3a6744f34e102000a118c2f

Author: Timothy Arceri <tarceri at itsqueeze.com>
Date:   Fri May  6 11:38:09 2022 +1000

freedreno: switch to NIR loop unrolling

Force unroll setting based on GLSL IR settings:

   case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
   case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
   case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
   case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
      /* a2xx compiler doesn't handle indirect: */
      return is_ir3(screen) ? 1 : 0;

Reviewed-by: Emma Anholt <emma at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16366>

---

 src/freedreno/ir3/ir3_compiler.c                 | 7 +++++--
 src/gallium/drivers/freedreno/a2xx/ir2_nir.c     | 1 +
 src/gallium/drivers/freedreno/freedreno_screen.c | 3 +--
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/freedreno/ir3/ir3_compiler.c b/src/freedreno/ir3/ir3_compiler.c
index db0b62b7b4b..e7008be2034 100644
--- a/src/freedreno/ir3/ir3_compiler.c
+++ b/src/freedreno/ir3/ir3_compiler.c
@@ -115,7 +115,8 @@ ir3_compiler_destroy(struct ir3_compiler *compiler)
    .has_isub = true,                                                          \
    .force_indirect_unrolling_sampler = true,                                  \
    .lower_uniforms_to_ubo = true,                                             \
-   .use_scoped_barrier = true
+   .use_scoped_barrier = true,                                                \
+   .max_unroll_iterations = 32
 
 static const nir_shader_compiler_options nir_options = {
    COMMON_OPTIONS,
@@ -133,7 +134,6 @@ static const nir_shader_compiler_options nir_options = {
 static const nir_shader_compiler_options nir_options_a6xx = {
    COMMON_OPTIONS,
    .vectorize_io = true,
-   .max_unroll_iterations = 32,
    .force_indirect_unrolling = nir_var_all,
    .lower_wpos_pntc = true,
    .lower_cs_local_index_to_id = true,
@@ -287,6 +287,9 @@ ir3_compiler_create(struct fd_device *dev, const struct fd_dev_id *dev_id,
       compiler->nir_options.has_sudot_4x8 = dev_info->a6xx.has_dp2acc;
    } else {
       compiler->nir_options = nir_options;
+      /* a2xx compiler doesn't handle indirect: */
+      if (compiler->gen <= 2)
+         compiler->nir_options.force_indirect_unrolling = nir_var_all;
    }
 
    if (!options->disable_cache)
diff --git a/src/gallium/drivers/freedreno/a2xx/ir2_nir.c b/src/gallium/drivers/freedreno/a2xx/ir2_nir.c
index fc077c4372b..a36c1e4b777 100644
--- a/src/gallium/drivers/freedreno/a2xx/ir2_nir.c
+++ b/src/gallium/drivers/freedreno/a2xx/ir2_nir.c
@@ -51,6 +51,7 @@ static const nir_shader_compiler_options options = {
    .lower_insert_word = true,
    .force_indirect_unrolling = nir_var_all,
    .force_indirect_unrolling_sampler = true,
+   .max_unroll_iterations = 32,
 };
 
 const nir_shader_compiler_options *
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index 68d1c59f293..cc1e0d4f7d6 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -649,6 +649,7 @@ fd_screen_get_shader_param(struct pipe_screen *pscreen,
    case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
+   case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
       return 0;
    case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
       return 1;
@@ -675,8 +676,6 @@ fd_screen_get_shader_param(struct pipe_screen *pscreen,
              COND(has_compute(screen) && (shader == PIPE_SHADER_COMPUTE),
                   (1 << PIPE_SHADER_IR_NIR_SERIALIZED)) |
              (1 << PIPE_SHADER_IR_TGSI);
-   case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
-      return 32;
    case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
    case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
       if (is_a4xx(screen) || is_a5xx(screen) || is_a6xx(screen)) {



More information about the mesa-commit mailing list