From 41523773f5b67d0e3df7eb0115e3eb8e8886ac4b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 18 Nov 2021 18:19:45 -0500 Subject: [PATCH] radeonsi: add wave32 flag into prolog/epilog keys It will vary between shaders. Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- 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 705ea44..46583f0 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 d6e1720..31796e8 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; -- 2.7.4