Mesa (main): freedreno/ir3: Reduce use of compiler->gpu_id

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Aug 6 19:21:23 UTC 2021


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

Author: Rob Clark <robdclark at chromium.org>
Date:   Sat Jul 31 12:32:28 2021 -0700

freedreno/ir3: Reduce use of compiler->gpu_id

For the same reason as previous patch.  Mostly we only care about the
generation, so convert things to use compiler->gen instead.

Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12159>

---

 src/freedreno/ir3/ir3.c                    |  6 +++---
 src/freedreno/ir3/ir3_compiler.c           | 13 +++++++------
 src/freedreno/ir3/ir3_compiler.h           |  1 +
 src/freedreno/ir3/ir3_compiler_nir.c       | 22 +++++++++++-----------
 src/freedreno/ir3/ir3_context.c            |  8 ++++----
 src/freedreno/ir3/ir3_legalize.c           |  6 +++---
 src/freedreno/ir3/ir3_lower_parallelcopy.c |  2 +-
 src/freedreno/ir3/ir3_nir.c                | 16 ++++++++--------
 src/freedreno/ir3/ir3_shader.c             | 10 +++++-----
 src/freedreno/ir3/ir3_shader.h             |  2 +-
 src/freedreno/isa/encode.c                 |  4 ++--
 11 files changed, 46 insertions(+), 44 deletions(-)

diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c
index 41d10393895..1491429c14a 100644
--- a/src/freedreno/ir3/ir3.c
+++ b/src/freedreno/ir3/ir3.c
@@ -135,7 +135,7 @@ ir3_should_double_threadsize(struct ir3_shader_variant *v, unsigned regs_count)
        * fit. For smaller workgroup sizes, we follow the blob and use the
        * smaller threadsize.
        */
-      if (compiler->gpu_id < 600) {
+      if (compiler->gen < 6) {
          return v->local_size_variable ||
                 threads_per_wg >
                    compiler->threadsize_base * compiler->max_waves;
@@ -317,7 +317,7 @@ ir3_collect_info(struct ir3_shader_variant *v)
     */
    unsigned regs_count =
       info->max_reg + 1 +
-      (compiler->gpu_id >= 600 ? ((info->max_half_reg + 2) / 2) : 0);
+      (compiler->gen >= 6 ? ((info->max_half_reg + 2) / 2) : 0);
 
    info->double_threadsize = ir3_should_double_threadsize(v, regs_count);
    unsigned reg_independent_max_waves =
@@ -781,7 +781,7 @@ ir3_valid_flags(struct ir3_instruction *instr, unsigned n, unsigned flags)
        * same block (since we can't propagate address register values
        * across blocks currently)
        */
-      if (compiler->gpu_id < 600)
+      if (compiler->gen < 6)
          return false;
 
       /* NOTE in the special try_swap_mad_two_srcs() case we can be
diff --git a/src/freedreno/ir3/ir3_compiler.c b/src/freedreno/ir3/ir3_compiler.c
index e3a9b3584f0..edcd3052b46 100644
--- a/src/freedreno/ir3/ir3_compiler.c
+++ b/src/freedreno/ir3/ir3_compiler.c
@@ -84,6 +84,7 @@ ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
 
    compiler->dev = dev;
    compiler->gpu_id = gpu_id;
+   compiler->gen = gpu_id / 100;
    compiler->robust_ubo_access = robust_ubo_access;
 
    /* All known GPU's have 32k local memory (aka shared) */
@@ -93,7 +94,7 @@ ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
    compiler->wave_granularity = 2;
    compiler->max_waves = 16;
 
-   if (compiler->gpu_id >= 600) {
+   if (compiler->gen >= 6) {
       compiler->samgq_workaround = true;
       /* a6xx split the pipeline state into geometry and fragment state, in
        * order to let the VS run ahead of the FS. As a result there are now
@@ -136,10 +137,10 @@ ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
       compiler->max_const_safe = 256;
    }
 
-   if (compiler->gpu_id >= 600) {
+   if (compiler->gen >= 6) {
       compiler->reg_size_vec4 =
             fd_dev_info(compiler->gpu_id)->a6xx.reg_size_vec4;
-   } else if (compiler->gpu_id >= 400) {
+   } else if (compiler->gen >= 4) {
       /* On a4xx-a5xx, using r24.x and above requires using the smallest
        * threadsize.
        */
@@ -149,9 +150,9 @@ ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
       compiler->reg_size_vec4 = 96;
    }
 
-   if (compiler->gpu_id >= 600) {
+   if (compiler->gen >= 6) {
       compiler->threadsize_base = 64;
-   } else if (compiler->gpu_id >= 400) {
+   } else if (compiler->gen >= 4) {
       /* TODO: Confirm this for a4xx. For a5xx this is based on the Vulkan
        * 1.1 subgroupSize which is 32.
        */
@@ -160,7 +161,7 @@ ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
       compiler->threadsize_base = 8;
    }
 
-   if (compiler->gpu_id >= 400) {
+   if (compiler->gen >= 4) {
       /* need special handling for "flat" */
       compiler->flat_bypass = true;
       compiler->levels_add_one = false;
diff --git a/src/freedreno/ir3/ir3_compiler.h b/src/freedreno/ir3/ir3_compiler.h
index 427a3b2ea6a..d8e9f0c1205 100644
--- a/src/freedreno/ir3/ir3_compiler.h
+++ b/src/freedreno/ir3/ir3_compiler.h
@@ -38,6 +38,7 @@ struct ir3_shader;
 struct ir3_compiler {
    struct fd_device *dev;
    uint32_t gpu_id;
+   uint8_t gen;
    uint32_t shader_count;
 
    struct disk_cache *disk_cache;
diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index a5bc577f726..a660788ed78 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -1312,7 +1312,7 @@ emit_control_barrier(struct ir3_context *ctx)
    struct ir3_block *b = ctx->block;
    struct ir3_instruction *barrier = ir3_BAR(b);
    barrier->cat7.g = true;
-   if (ctx->compiler->gpu_id < 600)
+   if (ctx->compiler->gen < 6)
       barrier->cat7.l = true;
    barrier->flags = IR3_INSTR_SS | IR3_INSTR_SY;
    barrier->barrier_class = IR3_BARRIER_EVERYTHING;
@@ -1361,7 +1361,7 @@ emit_intrinsic_barrier(struct ir3_context *ctx, nir_intrinsic_instr *intr)
             barrier->cat7.g = true;
          }
 
-         if (ctx->compiler->gpu_id > 600) {
+         if (ctx->compiler->gen >= 6) {
             if (modes & nir_var_mem_ssbo) {
                barrier->cat7.l = true;
             }
@@ -1407,7 +1407,7 @@ emit_intrinsic_barrier(struct ir3_context *ctx, nir_intrinsic_instr *intr)
    case nir_intrinsic_memory_barrier_buffer:
       barrier = ir3_FENCE(b);
       barrier->cat7.g = true;
-      if (ctx->compiler->gpu_id > 600)
+      if (ctx->compiler->gen >= 6)
          barrier->cat7.l = true;
       barrier->cat7.r = true;
       barrier->cat7.w = true;
@@ -1425,7 +1425,7 @@ emit_intrinsic_barrier(struct ir3_context *ctx, nir_intrinsic_instr *intr)
       break;
    case nir_intrinsic_memory_barrier_shared:
       barrier = ir3_FENCE(b);
-      if (ctx->compiler->gpu_id < 600)
+      if (ctx->compiler->gen < 6)
          barrier->cat7.l = true;
       barrier->cat7.r = true;
       barrier->cat7.w = true;
@@ -1564,14 +1564,14 @@ emit_intrinsic_barycentric(struct ir3_context *ctx, nir_intrinsic_instr *intr,
          sysval = SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL;
          break;
       case SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID:
-         if (ctx->compiler->gpu_id < 600)
+         if (ctx->compiler->gen < 6)
             sysval = SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL;
          break;
       case SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE:
          sysval = SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL;
          break;
       case SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID:
-         if (ctx->compiler->gpu_id < 600)
+         if (ctx->compiler->gen < 6)
             sysval = SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL;
          break;
       default:
@@ -3289,7 +3289,7 @@ emit_function(struct ir3_context *ctx, nir_function_impl *impl)
     * out, we guarantee that all exit paths flow into the stream-
     * out instructions.
     */
-   if ((ctx->compiler->gpu_id < 500) &&
+   if ((ctx->compiler->gen < 5) &&
        (ctx->so->shader->stream_output.num_outputs > 0) &&
        !ctx->so->binning_pass) {
       debug_assert(ctx->so->type == MESA_SHADER_VERTEX);
@@ -4103,7 +4103,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
        * need to make sure not to remove any inputs that are used by
        * the nonbinning VS.
        */
-      if (ctx->compiler->gpu_id >= 600 && so->binning_pass &&
+      if (ctx->compiler->gen >= 6 && so->binning_pass &&
           so->type == MESA_SHADER_VERTEX) {
          for (int i = 0; i < ctx->ninputs; i++) {
             struct ir3_instruction *in = ctx->inputs[i];
@@ -4140,7 +4140,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
       array_insert(ctx->block, ctx->block->keeps, end);
 
       /* at this point, for binning pass, throw away unneeded outputs: */
-      if (so->binning_pass && (ctx->compiler->gpu_id < 600))
+      if (so->binning_pass && (ctx->compiler->gen < 6))
          fixup_binning_pass(ctx, end);
    }
 
@@ -4163,7 +4163,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
     * that the uniform/constant layout for BS and VS matches, so that
     * we can re-use same VS_CONST state group.
     */
-   if (so->binning_pass && (ctx->compiler->gpu_id >= 600)) {
+   if (so->binning_pass && (ctx->compiler->gen >= 6)) {
       fixup_binning_pass(ctx, find_end(ctx->so->ir));
       /* cleanup the result of removing unneeded outputs: */
       while (IR3_PASS(ir, ir3_dce, so)) {
@@ -4195,7 +4195,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
     *
     * Note that VS inputs are expected to be full precision.
     */
-   bool pre_assign_inputs = (ir->compiler->gpu_id >= 600) &&
+   bool pre_assign_inputs = (ir->compiler->gen >= 6) &&
                             (ir->type == MESA_SHADER_VERTEX) &&
                             so->binning_pass;
 
diff --git a/src/freedreno/ir3/ir3_context.c b/src/freedreno/ir3/ir3_context.c
index e5341435283..c215baaa057 100644
--- a/src/freedreno/ir3/ir3_context.c
+++ b/src/freedreno/ir3/ir3_context.c
@@ -35,7 +35,7 @@ ir3_context_init(struct ir3_compiler *compiler, struct ir3_shader_variant *so)
 {
    struct ir3_context *ctx = rzalloc(NULL, struct ir3_context);
 
-   if (compiler->gpu_id >= 400) {
+   if (compiler->gen >= 4) {
       if (so->type == MESA_SHADER_VERTEX) {
          ctx->astc_srgb = so->key.vastc_srgb;
       } else if (so->type == MESA_SHADER_FRAGMENT) {
@@ -50,9 +50,9 @@ ir3_context_init(struct ir3_compiler *compiler, struct ir3_shader_variant *so)
       }
    }
 
-   if (compiler->gpu_id >= 600) {
+   if (compiler->gen >= 6) {
       ctx->funcs = &ir3_a6xx_funcs;
-   } else if (compiler->gpu_id >= 400) {
+   } else if (compiler->gen >= 4) {
       ctx->funcs = &ir3_a4xx_funcs;
    }
 
@@ -109,7 +109,7 @@ ir3_context_init(struct ir3_compiler *compiler, struct ir3_shader_variant *so)
    /* Enable the texture pre-fetch feature only a4xx onwards.  But
     * only enable it on generations that have been tested:
     */
-   if ((so->type == MESA_SHADER_FRAGMENT) && (compiler->gpu_id >= 600))
+   if ((so->type == MESA_SHADER_FRAGMENT) && (compiler->gen >= 6))
       NIR_PASS_V(ctx->s, ir3_nir_lower_tex_prefetch);
 
    NIR_PASS(progress, ctx->s, nir_lower_phis_to_scalar, true);
diff --git a/src/freedreno/ir3/ir3_legalize.c b/src/freedreno/ir3/ir3_legalize.c
index 1e64e10e6d0..b2d8ab2a3a2 100644
--- a/src/freedreno/ir3/ir3_legalize.c
+++ b/src/freedreno/ir3/ir3_legalize.c
@@ -273,7 +273,7 @@ legalize_block(struct ir3_legalize_ctx *ctx, struct ir3_block *block)
             regmask_set(&state->needs_sy, n->dsts[0]);
       } else if (is_atomic(n->opc)) {
          if (n->flags & IR3_INSTR_G) {
-            if (ctx->compiler->gpu_id >= 600) {
+            if (ctx->compiler->gen >= 6) {
                /* New encoding, returns  result via second src: */
                regmask_set(&state->needs_sy, n->srcs[2]);
             } else {
@@ -801,7 +801,7 @@ nop_sched(struct ir3 *ir, struct ir3_shader_variant *so)
           * a6xx.
           */
 
-         if ((delay > 0) && (ir->compiler->gpu_id >= 600) && last &&
+         if ((delay > 0) && (ir->compiler->gen >= 6) && last &&
              ((opc_cat(last->opc) == 2) || (opc_cat(last->opc) == 3)) &&
              (last->repeat == 0)) {
             /* the previous cat2/cat3 instruction can encode at most 3 nop's: */
@@ -870,7 +870,7 @@ ir3_legalize(struct ir3 *ir, struct ir3_shader_variant *so, int *max_bary)
       }
    }
 
-   assert(ctx->early_input_release || ctx->compiler->gpu_id > 500);
+   assert(ctx->early_input_release || ctx->compiler->gen >= 5);
 
    /* process each block: */
    do {
diff --git a/src/freedreno/ir3/ir3_lower_parallelcopy.c b/src/freedreno/ir3/ir3_lower_parallelcopy.c
index 81087d694ef..32b2d300c55 100644
--- a/src/freedreno/ir3/ir3_lower_parallelcopy.c
+++ b/src/freedreno/ir3/ir3_lower_parallelcopy.c
@@ -147,7 +147,7 @@ do_swap(struct ir3_compiler *compiler, struct ir3_instruction *instr,
    /* a5xx+ is known to support swz, which enables us to swap two registers
     * in-place. If unsupported we emulate it using the xor trick.
     */
-   if (compiler->gpu_id < 500) {
+   if (compiler->gen < 5) {
       /* Shared regs only exist since a5xx, so we don't have to provide a
        * fallback path for them.
        */
diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c
index c0c9a7b90b8..08ba6b8b115 100644
--- a/src/freedreno/ir3/ir3_nir.c
+++ b/src/freedreno/ir3/ir3_nir.c
@@ -149,7 +149,7 @@ static const nir_shader_compiler_options options_a6xx = {
 const nir_shader_compiler_options *
 ir3_get_compiler_options(struct ir3_compiler *compiler)
 {
-   if (compiler->gpu_id >= 600)
+   if (compiler->gen >= 6)
       return &options_a6xx;
    return &options;
 }
@@ -352,7 +352,7 @@ ir3_finalize_nir(struct ir3_compiler *compiler, nir_shader *s)
       .lower_tg4_offsets = true,
    };
 
-   if (compiler->gpu_id >= 400) {
+   if (compiler->gen >= 4) {
       /* a4xx seems to have *no* sam.p */
       tex_options.lower_txp = ~0; /* lower all txp */
    } else {
@@ -376,7 +376,7 @@ ir3_finalize_nir(struct ir3_compiler *compiler, nir_shader *s)
 
    OPT_V(s, nir_lower_tex, &tex_options);
    OPT_V(s, nir_lower_load_const_to_scalar);
-   if (compiler->gpu_id < 500)
+   if (compiler->gen < 5)
       OPT_V(s, ir3_nir_lower_tg4_to_tex);
 
    ir3_optimize_loop(compiler, s);
@@ -491,7 +491,7 @@ ir3_nir_post_finalize(struct ir3_compiler *compiler, nir_shader *s)
       NIR_PASS_V(s, nir_lower_fb_read);
    }
 
-   if (compiler->gpu_id >= 600 && s->info.stage == MESA_SHADER_FRAGMENT &&
+   if (compiler->gen >= 6 && s->info.stage == MESA_SHADER_FRAGMENT &&
        !(ir3_shader_debug & IR3_DBG_NOFP16)) {
       NIR_PASS_V(s, nir_lower_mediump_io, nir_var_shader_out, 0, false);
    }
@@ -671,7 +671,7 @@ ir3_nir_lower_variant(struct ir3_shader_variant *so, nir_shader *s)
    /* UBO offset lowering has to come after we've decided what will
     * be left as load_ubo
     */
-   if (so->shader->compiler->gpu_id >= 600)
+   if (so->shader->compiler->gen >= 6)
       progress |= OPT(s, nir_lower_ubo_vec4);
 
    OPT_V(s, ir3_nir_lower_io_offsets, so->shader->compiler->gpu_id);
@@ -820,7 +820,7 @@ ir3_setup_const_state(nir_shader *nir, struct ir3_shader_variant *v,
 
    ir3_nir_scan_driver_consts(nir, const_state);
 
-   if ((compiler->gpu_id < 500) && (v->shader->stream_output.num_outputs > 0)) {
+   if ((compiler->gen < 5) && (v->shader->stream_output.num_outputs > 0)) {
       const_state->num_driver_params =
          MAX2(const_state->num_driver_params, IR3_DP_VTXCNT_MAX + 1);
    }
@@ -853,13 +853,13 @@ ir3_setup_const_state(nir_shader *nir, struct ir3_shader_variant *v,
 
    if (const_state->num_driver_params > 0) {
       /* offset cannot be 0 for vs params loaded by CP_DRAW_INDIRECT_MULTI */
-      if (v->type == MESA_SHADER_VERTEX && compiler->gpu_id >= 600)
+      if (v->type == MESA_SHADER_VERTEX && compiler->gen >= 6)
          constoff = MAX2(constoff, 1);
       const_state->offsets.driver_param = constoff;
    }
    constoff += const_state->num_driver_params / 4;
 
-   if ((v->type == MESA_SHADER_VERTEX) && (compiler->gpu_id < 500) &&
+   if ((v->type == MESA_SHADER_VERTEX) && (compiler->gen < 5) &&
        v->shader->stream_output.num_outputs > 0) {
       const_state->offsets.tfbo = constoff;
       constoff += align(IR3_MAX_SO_BUFFERS * ptrsz, 4) / 4;
diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c
index 67ad1c721ca..2f4f33c738a 100644
--- a/src/freedreno/ir3/ir3_shader.c
+++ b/src/freedreno/ir3/ir3_shader.c
@@ -175,14 +175,14 @@ ir3_shader_assemble(struct ir3_shader_variant *v)
     * uploads are in units of 4 dwords. Round it up here to make calculations
     * regarding the shared constlen simpler.
     */
-   if (compiler->gpu_id >= 400)
+   if (compiler->gen >= 4)
       v->constlen = align(v->constlen, 4);
 
    /* Use the per-wave layout by default on a6xx for compute shaders. It
     * should result in better performance when loads/stores are to a uniform
     * index.
     */
-   v->pvtmem_per_wave = compiler->gpu_id >= 600 && !info->multi_dword_ldp_stp &&
+   v->pvtmem_per_wave = compiler->gen >= 6 && !info->multi_dword_ldp_stp &&
                         v->type == MESA_SHADER_COMPUTE;
 
    fixup_regfootprint(v);
@@ -332,7 +332,7 @@ alloc_variant(struct ir3_shader *shader, const struct ir3_shader_key *key,
    v->nonbinning = nonbinning;
    v->key = *key;
    v->type = shader->type;
-   v->mergedregs = shader->compiler->gpu_id >= 600;
+   v->mergedregs = shader->compiler->gen >= 6;
 
    if (!v->binning_pass)
       v->const_state = rzalloc_size(v, sizeof(*v->const_state));
@@ -494,7 +494,7 @@ ir3_setup_used_key(struct ir3_shader *shader)
        * on older HW.
        */
       key->msaa = info->fs.uses_sample_qualifier ||
-                  (shader->compiler->gpu_id < 600 &&
+                  (shader->compiler->gen < 6 &&
                    (BITSET_TEST(info->system_values_read,
                                 SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID) ||
                     BITSET_TEST(info->system_values_read,
@@ -568,7 +568,7 @@ ir3_trim_constlen(struct ir3_shader_variant **variants,
     * a6xx and the total limit. The frag limit on a6xx only matters for a
     * single stage, so it's always satisfied with the first variant.
     */
-   if (compiler->gpu_id >= 600) {
+   if (compiler->gen >= 6) {
       trimmed |=
          trim_constlens(constlens, MESA_SHADER_VERTEX, MESA_SHADER_GEOMETRY,
                         compiler->max_const_geom, compiler->max_const_safe);
diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h
index 8f6f2cfdd74..26335302c92 100644
--- a/src/freedreno/ir3/ir3_shader.h
+++ b/src/freedreno/ir3/ir3_shader.h
@@ -1034,7 +1034,7 @@ ir3_shader_branchstack_hw(const struct ir3_shader_variant *v)
    if (!v->shader)
       return 0;
 
-   if (v->shader->compiler->gpu_id < 500)
+   if (v->shader->compiler->gen < 5)
       return v->branchstack;
 
    if (v->branchstack > 0) {
diff --git a/src/freedreno/isa/encode.c b/src/freedreno/isa/encode.c
index 3dd0f6ab2fd..fb4e851f662 100644
--- a/src/freedreno/isa/encode.c
+++ b/src/freedreno/isa/encode.c
@@ -113,10 +113,10 @@ __instruction_case(struct encode_state *s, struct ir3_instruction *instr)
 		}
 	} else if (instr->opc == OPC_DEMOTE) {
 		return OPC_KILL;
-	} else if ((instr->block->shader->compiler->gpu_id > 600) &&
+	} else if ((instr->block->shader->compiler->gen >= 6) &&
 			is_atomic(instr->opc) && (instr->flags & IR3_INSTR_G)) {
 		return instr->opc - OPC_ATOMIC_ADD + OPC_ATOMIC_B_ADD;
-	} else if (s->compiler->gpu_id >= 600) {
+	} else if (s->compiler->gen >= 6) {
 		if (instr->opc == OPC_RESINFO) {
 			return OPC_RESINFO_B;
 		} else if (instr->opc == OPC_LDIB) {



More information about the mesa-commit mailing list