radeonsi: add si_shader::wave_size because it will vary

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13878>
This commit is contained in:
Marek Olšák 2021-11-19 03:46:29 -05:00 committed by Marge Bot
parent 41523773f5
commit bc57488936
6 changed files with 15 additions and 0 deletions

View file

@ -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;

View file

@ -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,

View file

@ -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 =

View file

@ -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;

View file

@ -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,

View file

@ -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);