Mesa (main): radeonsi: add wave32 flag into prolog/epilog keys

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


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Thu Nov 18 18:19:45 2021 -0500

radeonsi: add wave32 flag into prolog/epilog keys

It will vary between shaders.

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_shader.c | 23 +++++++++++++----------
 src/gallium/drivers/radeonsi/si_shader.h |  4 ++++
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 705ea44b08b..46583f06c05 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -1330,6 +1330,7 @@ void si_get_vs_prolog_key(const struct si_shader_info *info, unsigned num_input_
 {
    memset(key, 0, sizeof(*key));
    key->vs_prolog.states = *prolog_key;
+   key->vs_prolog.wave32 = si_get_shader_wave_size(shader_out) == 32;
    key->vs_prolog.num_input_sgprs = num_input_sgprs;
    key->vs_prolog.num_inputs = info->num_inputs;
    key->vs_prolog.as_ls = shader_out->key.ge.as_ls;
@@ -1605,36 +1606,35 @@ si_get_shader_part(struct si_screen *sscreen, struct si_shader_part **list,
 
    struct si_shader shader = {};
    shader.selector = &sel;
+   bool wave32 = false;
 
    switch (stage) {
    case MESA_SHADER_VERTEX:
       shader.key.ge.as_ls = key->vs_prolog.as_ls;
       shader.key.ge.as_es = key->vs_prolog.as_es;
       shader.key.ge.as_ngg = key->vs_prolog.as_ngg;
+      wave32 = key->vs_prolog.wave32;
       break;
    case MESA_SHADER_TESS_CTRL:
       assert(!prolog);
       shader.key.ge.part.tcs.epilog = key->tcs_epilog.states;
+      wave32 = key->tcs_epilog.wave32;
       break;
    case MESA_SHADER_FRAGMENT:
-      if (prolog)
+      if (prolog) {
          shader.key.ps.part.prolog = key->ps_prolog.states;
-      else
+         wave32 = key->ps_prolog.wave32;
+      } else {
          shader.key.ps.part.epilog = key->ps_epilog.states;
+         wave32 = key->ps_epilog.wave32;
+      }
       break;
    default:
       unreachable("bad shader part");
    }
 
-   unsigned wave_size;
-   if (stage <= MESA_SHADER_GEOMETRY) {
-      wave_size = si_get_wave_size(sscreen, stage, shader.key.ge.as_ngg, shader.key.ge.as_es);
-   } else {
-      wave_size = si_get_wave_size(sscreen, stage, false, false);
-   }
-
    struct si_shader_context ctx;
-   si_llvm_context_init(&ctx, sscreen, compiler, wave_size);
+   si_llvm_context_init(&ctx, sscreen, compiler, wave32 ? 32 : 64);
 
    ctx.shader = &shader;
    ctx.stage = stage;
@@ -1709,6 +1709,7 @@ static bool si_shader_select_tcs_parts(struct si_screen *sscreen, struct ac_llvm
    /* Get the epilog. */
    union si_shader_part_key epilog_key;
    memset(&epilog_key, 0, sizeof(epilog_key));
+   epilog_key.tcs_epilog.wave32 = si_get_shader_wave_size(shader) == 32;
    epilog_key.tcs_epilog.states = shader->key.ge.part.tcs.epilog;
 
    shader->epilog = si_get_shader_part(sscreen, &sscreen->tcs_epilogs, MESA_SHADER_TESS_CTRL, false,
@@ -1753,6 +1754,7 @@ void si_get_ps_prolog_key(struct si_shader *shader, union si_shader_part_key *ke
 
    memset(key, 0, sizeof(*key));
    key->ps_prolog.states = shader->key.ps.part.prolog;
+   key->ps_prolog.wave32 = si_get_shader_wave_size(shader) == 32;
    key->ps_prolog.colors_read = info->colors_read;
    key->ps_prolog.num_input_sgprs = shader->info.num_input_sgprs;
    key->ps_prolog.num_input_vgprs = shader->info.num_input_vgprs;
@@ -1886,6 +1888,7 @@ void si_get_ps_epilog_key(struct si_shader *shader, union si_shader_part_key *ke
 {
    struct si_shader_info *info = &shader->selector->info;
    memset(key, 0, sizeof(*key));
+   key->ps_epilog.wave32 = si_get_shader_wave_size(shader) == 32;
    key->ps_epilog.colors_written = info->colors_written;
    key->ps_epilog.color_types = info->output_color_types;
    key->ps_epilog.writes_z = info->writes_z;
diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
index d6e1720278a..31796e8152a 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -577,6 +577,7 @@ struct si_ps_epilog_bits {
 union si_shader_part_key {
    struct {
       struct si_vs_prolog_bits states;
+      unsigned wave32 : 1;
       unsigned num_input_sgprs : 6;
       /* For merged stages such as LS-HS, HS input VGPRs are first. */
       unsigned num_merged_next_stage_vgprs : 3;
@@ -590,9 +591,11 @@ union si_shader_part_key {
    } vs_prolog;
    struct {
       struct si_tcs_epilog_bits states;
+      unsigned wave32 : 1;
    } tcs_epilog;
    struct {
       struct si_ps_prolog_bits states;
+      unsigned wave32 : 1;
       unsigned num_input_sgprs : 6;
       unsigned num_input_vgprs : 5;
       /* Color interpolation and two-side color selection. */
@@ -606,6 +609,7 @@ union si_shader_part_key {
    } ps_prolog;
    struct {
       struct si_ps_epilog_bits states;
+      unsigned wave32 : 1;
       unsigned colors_written : 8;
       unsigned color_types : 16;
       unsigned writes_z : 1;



More information about the mesa-commit mailing list