Skip to content

Commit 8f72f13

Browse files
author
Marek Olšák
committed
radeonsi/gfx10: add as_ngg variant for TES as ES to select Wave32/64
Legacy GS has to use Wave64, so TES before GS has to use Wave64 too. Acked-by: Pierre-Eric Pelloux-Prayer <[email protected]> Reviewed-by: Samuel Pitoiset <[email protected]>
1 parent 88efb63 commit 8f72f13

File tree

4 files changed

+32
-15
lines changed

4 files changed

+32
-15
lines changed

src/gallium/drivers/radeonsi/si_pipe.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1895,13 +1895,14 @@ static inline bool si_compute_prim_discard_enabled(struct si_context *sctx)
18951895

18961896
static inline unsigned si_get_wave_size(struct si_screen *sscreen,
18971897
enum pipe_shader_type shader_type,
1898-
bool ngg)
1898+
bool ngg, bool es)
18991899
{
19001900
if (shader_type == PIPE_SHADER_COMPUTE)
19011901
return sscreen->compute_wave_size;
19021902
else if (shader_type == PIPE_SHADER_FRAGMENT)
19031903
return sscreen->ps_wave_size;
1904-
else if (shader_type == PIPE_SHADER_GEOMETRY && !ngg) /* legacy GS only supports Wave64 */
1904+
else if ((shader_type == PIPE_SHADER_TESS_EVAL && es && !ngg) ||
1905+
(shader_type == PIPE_SHADER_GEOMETRY && !ngg)) /* legacy GS only supports Wave64 */
19051906
return 64;
19061907
else
19071908
return sscreen->ge_wave_size;
@@ -1910,7 +1911,7 @@ static inline unsigned si_get_wave_size(struct si_screen *sscreen,
19101911
static inline unsigned si_get_shader_wave_size(struct si_shader *shader)
19111912
{
19121913
return si_get_wave_size(shader->selector->screen, shader->selector->type,
1913-
shader->key.as_ngg);
1914+
shader->key.as_ngg, shader->key.as_es);
19141915
}
19151916

19161917
#define PRINT_ERR(fmt, args...) \

src/gallium/drivers/radeonsi/si_shader.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5727,7 +5727,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
57275727
shader->is_gs_copy_shader = true;
57285728

57295729
si_init_shader_ctx(&ctx, sscreen, compiler,
5730-
si_get_wave_size(sscreen, PIPE_SHADER_VERTEX, false));
5730+
si_get_wave_size(sscreen, PIPE_SHADER_VERTEX, false, false));
57315731
ctx.shader = shader;
57325732
ctx.type = PIPE_SHADER_VERTEX;
57335733

@@ -6172,7 +6172,8 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
61726172
}
61736173
}
61746174

6175-
if (shader->key.as_ngg && ctx->type != PIPE_SHADER_GEOMETRY) {
6175+
if (ctx->type != PIPE_SHADER_GEOMETRY &&
6176+
(shader->key.as_ngg && !shader->key.as_es)) {
61766177
/* Unconditionally declare scratch space base for streamout and
61776178
* vertex compaction. Whether space is actually allocated is
61786179
* determined during linking / PM4 creation.
@@ -6219,13 +6220,13 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
62196220
ctx->param_merged_wave_info, 0);
62206221
} else if (ctx->type == PIPE_SHADER_TESS_CTRL ||
62216222
ctx->type == PIPE_SHADER_GEOMETRY ||
6222-
shader->key.as_ngg) {
6223+
(shader->key.as_ngg && !shader->key.as_es)) {
62236224
LLVMValueRef num_threads;
62246225
bool nested_barrier;
62256226

62266227
if (!shader->is_monolithic ||
62276228
(ctx->type == PIPE_SHADER_TESS_EVAL &&
6228-
shader->key.as_ngg))
6229+
(shader->key.as_ngg && !shader->key.as_es)))
62296230
ac_init_exec_full_mask(&ctx->ac);
62306231

62316232
if (ctx->type == PIPE_SHADER_TESS_CTRL ||
@@ -7048,6 +7049,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
70487049
struct si_shader shader_es = {};
70497050
shader_es.selector = es;
70507051
shader_es.key.as_es = 1;
7052+
shader_es.key.as_ngg = shader->key.as_ngg;
70517053
shader_es.key.mono = shader->key.mono;
70527054
shader_es.key.opt = shader->key.opt;
70537055
shader_es.is_monolithic = true;
@@ -7305,7 +7307,8 @@ si_get_shader_part(struct si_screen *sscreen,
73057307

73067308
struct si_shader_context ctx;
73077309
si_init_shader_ctx(&ctx, sscreen, compiler,
7308-
si_get_wave_size(sscreen, type, shader.key.as_ngg));
7310+
si_get_wave_size(sscreen, type, shader.key.as_ngg,
7311+
shader.key.as_es));
73097312
ctx.shader = &shader;
73107313
ctx.type = type;
73117314

@@ -7703,10 +7706,15 @@ static bool si_shader_select_gs_parts(struct si_screen *sscreen,
77037706
struct pipe_debug_callback *debug)
77047707
{
77057708
if (sscreen->info.chip_class >= GFX9) {
7706-
struct si_shader *es_main_part =
7707-
shader->key.part.gs.es->main_shader_part_es;
7709+
struct si_shader *es_main_part;
7710+
enum pipe_shader_type es_type = shader->key.part.gs.es->type;
77087711

7709-
if (shader->key.part.gs.es->type == PIPE_SHADER_VERTEX &&
7712+
if (es_type == PIPE_SHADER_TESS_EVAL && shader->key.as_ngg)
7713+
es_main_part = shader->key.part.gs.es->main_shader_part_ngg_es;
7714+
else
7715+
es_main_part = shader->key.part.gs.es->main_shader_part_es;
7716+
7717+
if (es_type == PIPE_SHADER_VERTEX &&
77107718
!si_get_vs_prolog(sscreen, compiler, shader, debug, es_main_part,
77117719
&shader->key.part.gs.vs_prolog))
77127720
return false;

src/gallium/drivers/radeonsi/si_shader.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ struct si_shader_selector {
337337
struct si_shader *main_shader_part_ls; /* as_ls is set in the key */
338338
struct si_shader *main_shader_part_es; /* as_es is set in the key */
339339
struct si_shader *main_shader_part_ngg; /* as_ngg is set in the key */
340+
struct si_shader *main_shader_part_ngg_es; /* for Wave32 TES before legacy GS */
340341

341342
struct si_shader *gs_copy_shader;
342343

@@ -789,6 +790,8 @@ si_get_main_shader_part(struct si_shader_selector *sel,
789790
{
790791
if (key->as_ls)
791792
return &sel->main_shader_part_ls;
793+
if (key->as_es && key->as_ngg)
794+
return &sel->main_shader_part_ngg_es;
792795
if (key->as_es)
793796
return &sel->main_shader_part_es;
794797
if (key->as_ngg)

src/gallium/drivers/radeonsi/si_state_shaders.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1852,10 +1852,11 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
18521852
key->mono.u.ff_tcs_inputs_to_copy = sctx->vs_shader.cso->outputs_written;
18531853
break;
18541854
case PIPE_SHADER_TESS_EVAL:
1855+
key->as_ngg = stages_key.u.ngg;
1856+
18551857
if (sctx->gs_shader.cso)
18561858
key->as_es = 1;
18571859
else {
1858-
key->as_ngg = stages_key.u.ngg;
18591860
si_shader_selector_key_hw_vs(sctx, sel, key);
18601861

18611862
if (sctx->ps_shader.cso && sctx->ps_shader.cso->info.uses_primid)
@@ -2269,6 +2270,10 @@ int si_shader_select_with_key(struct si_screen *sscreen,
22692270
else
22702271
assert(0);
22712272

2273+
if (sel->type == PIPE_SHADER_GEOMETRY &&
2274+
previous_stage_sel->type == PIPE_SHADER_TESS_EVAL)
2275+
shader1_key.as_ngg = key->as_ngg;
2276+
22722277
mtx_lock(&previous_stage_sel->mutex);
22732278
ok = si_check_missing_main_part(sscreen,
22742279
previous_stage_sel,
@@ -2429,7 +2434,7 @@ static void si_init_shader_selector_async(void *job, int thread_index)
24292434
if (sel->nir) {
24302435
/* TODO: GS always sets wave size = default. Legacy GS will have
24312436
* incorrect subgroup_size and ballot_bit_size. */
2432-
si_lower_nir(sel, si_get_wave_size(sscreen, sel->type, true));
2437+
si_lower_nir(sel, si_get_wave_size(sscreen, sel->type, true, false));
24332438
}
24342439

24352440
/* Compile the main shader part for use with a prolog and/or epilog.
@@ -2455,9 +2460,9 @@ static void si_init_shader_selector_async(void *job, int thread_index)
24552460
sel->so.num_outputs != 0,
24562461
&shader->key);
24572462
if (sscreen->info.chip_class >= GFX10 &&
2458-
(((sel->type == PIPE_SHADER_VERTEX ||
2459-
sel->type == PIPE_SHADER_TESS_EVAL) &&
2463+
((sel->type == PIPE_SHADER_VERTEX &&
24602464
!shader->key.as_ls && !shader->key.as_es) ||
2465+
sel->type == PIPE_SHADER_TESS_EVAL ||
24612466
sel->type == PIPE_SHADER_GEOMETRY))
24622467
shader->key.as_ngg = 1;
24632468

0 commit comments

Comments
 (0)