Mesa (main): radeonsi: add si_shader::wave_size because it will vary

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 26 11:57:31 UTC 2021


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri Nov 19 03:46:29 2021 -0500

radeonsi: add si_shader::wave_size because it will vary

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13878>

---

 src/gallium/drivers/radeonsi/si_compute.c         | 1 +
 src/gallium/drivers/radeonsi/si_pipe.h            | 3 +++
 src/gallium/drivers/radeonsi/si_shader.c          | 3 +++
 src/gallium/drivers/radeonsi/si_shader.h          | 1 +
 src/gallium/drivers/radeonsi/si_shader_llvm_gs.c  | 1 +
 src/gallium/drivers/radeonsi/si_state_shaders.cpp | 6 ++++++
 6 files changed, 15 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
index 4db988bc56b..864732385e4 100644
--- a/src/gallium/drivers/radeonsi/si_compute.c
+++ b/src/gallium/drivers/radeonsi/si_compute.c
@@ -239,6 +239,7 @@ static void *si_create_compute_state(struct pipe_context *ctx, const struct pipe
       si_sampler_and_image_descriptors_idx(PIPE_SHADER_COMPUTE);
    sel->info.base.shared_size = cso->req_local_mem;
    program->shader.selector = &program->sel;
+   program->shader.wave_size = si_get_shader_wave_size(&program->shader);
    program->ir_type = cso->ir_type;
    program->private_size = cso->req_private_mem;
    program->input_size = cso->req_input_mem;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index e695b2a8d2b..793d74c7b2a 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -1997,6 +1997,9 @@ static inline unsigned si_get_wave_size(struct si_screen *sscreen,
 
 static inline unsigned si_get_shader_wave_size(struct si_shader *shader)
 {
+   if (shader->is_gs_copy_shader)
+      return shader->selector->screen->ge_wave_size;
+
    if (shader->selector->info.stage <= MESA_SHADER_GEOMETRY) {
       return si_get_wave_size(shader->selector->screen, shader->selector->info.stage,
                               shader->key.ge.as_ngg,
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 46583f06c05..80b3d6144a7 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -2100,6 +2100,9 @@ bool si_create_shader_variant(struct si_screen *sscreen, struct ac_llvm_compiler
       default:;
       }
 
+      assert(shader->wave_size == mainp->wave_size);
+      assert(!shader->previous_stage || shader->wave_size == shader->previous_stage->wave_size);
+
       /* Update SGPR and VGPR counts. */
       if (shader->prolog) {
          shader->config.num_sgprs =
diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
index 31796e8152a..335c4dda83c 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -813,6 +813,7 @@ struct si_shader {
    bool is_optimized;
    bool is_binary_shared;
    bool is_gs_copy_shader;
+   uint8_t wave_size;
 
    /* The following data is all that's needed for binary shaders. */
    struct si_shader_binary binary;
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c
index 3ca42259116..27041f9125d 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c
@@ -425,6 +425,7 @@ struct si_shader *si_generate_gs_copy_shader(struct si_screen *sscreen,
 
    shader->selector = gs_selector;
    shader->is_gs_copy_shader = true;
+   shader->wave_size = si_get_shader_wave_size(shader);
 
    si_llvm_context_init(&ctx, sscreen, compiler,
                         si_get_wave_size(sscreen, MESA_SHADER_VERTEX,
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp
index 81be1e07bd6..3a6ae910327 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp
@@ -1748,6 +1748,8 @@ static void si_shader_ps(struct si_screen *sscreen, struct si_shader *shader)
 
 static void si_shader_init_pm4_state(struct si_screen *sscreen, struct si_shader *shader)
 {
+   assert(shader->wave_size);
+
    switch (shader->selector->info.stage) {
    case MESA_SHADER_VERTEX:
       if (shader->key.ge.as_ls)
@@ -2268,6 +2270,7 @@ static bool si_check_missing_main_part(struct si_screen *sscreen, struct si_shad
          main_part->key.ge.as_ngg = key->ge.as_ngg;
       }
       main_part->is_monolithic = false;
+      main_part->wave_size = si_get_shader_wave_size(main_part);
 
       if (!si_compile_shader(sscreen, compiler_state->compiler, main_part,
                              &compiler_state->debug)) {
@@ -2444,6 +2447,7 @@ current_not_ready:
 
    shader->selector = sel;
    *((SHADER_KEY_TYPE*)&shader->key) = *key;
+   shader->wave_size = si_get_shader_wave_size(shader);
    shader->compiler_ctx_state.compiler = &sctx->compiler;
    shader->compiler_ctx_state.debug = sctx->debug;
    shader->compiler_ctx_state.is_debug_context = sctx->is_debug;
@@ -2710,6 +2714,8 @@ static void si_init_shader_selector_async(void *job, void *gdata, int thread_ind
            sel->info.stage == MESA_SHADER_TESS_EVAL || sel->info.stage == MESA_SHADER_GEOMETRY))
          shader->key.ge.as_ngg = 1;
 
+      shader->wave_size = si_get_shader_wave_size(shader);
+
       if (sel->nir) {
          if (sel->info.stage <= MESA_SHADER_GEOMETRY)
             si_get_ir_cache_key(sel, shader->key.ge.as_ngg, shader->key.ge.as_es, ir_sha1_cache_key);



More information about the mesa-commit mailing list