diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index cfeaccdafee..7e486240ede 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -176,7 +176,6 @@ static void *si_create_compute_state(struct pipe_context *ctx, const struct pipe si_const_and_shader_buffer_descriptors_idx(MESA_SHADER_COMPUTE); sel->sampler_and_images_descriptors_index = si_sampler_and_image_descriptors_idx(MESA_SHADER_COMPUTE); - sel->info.base.shared_size = cso->static_shared_mem; program->shader.selector = &program->sel; if (cso->ir_type == PIPE_SHADER_IR_TGSI) { @@ -352,7 +351,7 @@ static bool si_switch_compute_shader(struct si_context *sctx, struct si_compute /* only do this for OpenCL */ if (variable_shared_size) { - unsigned shared_size = program->sel.info.base.shared_size + variable_shared_size; + unsigned shared_size = shader->info.shared_size + variable_shared_size; unsigned lds_blocks = 0; if (sctx->gfx_level <= GFX6) { diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 77f4a498f45..0cec4939fce 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -205,8 +205,10 @@ unsigned si_calculate_needed_lds_size(enum amd_gfx_level gfx_level, struct si_sh lds_size = size_in_dw * 4; } - if (stage == MESA_SHADER_COMPUTE) { - lds_size = shader->selector->info.base.shared_size; + if (stage == MESA_SHADER_COMPUTE || + stage == MESA_SHADER_TASK || + stage == MESA_SHADER_MESH) { + lds_size = shader->info.shared_size; } /* Check that the LDS size is within hw limits. */ diff --git a/src/gallium/drivers/radeonsi/si_shader_info.c b/src/gallium/drivers/radeonsi/si_shader_info.c index e4312023add..1c8f13f51ee 100644 --- a/src/gallium/drivers/radeonsi/si_shader_info.c +++ b/src/gallium/drivers/radeonsi/si_shader_info.c @@ -428,7 +428,6 @@ void si_nir_scan_shader(struct si_screen *sscreen, struct nir_shader *nir, info->base.image_buffers = nir->info.image_buffers[0]; info->base.msaa_images = nir->info.msaa_images[0]; - info->base.shared_size = nir->info.shared_size; info->base.task_payload_size = nir->info.task_payload_size; memcpy(info->base.workgroup_size, nir->info.workgroup_size, sizeof(nir->info.workgroup_size)); info->base.workgroup_size_variable = nir->info.workgroup_size_variable; diff --git a/src/gallium/drivers/radeonsi/si_shader_info.h b/src/gallium/drivers/radeonsi/si_shader_info.h index f1586bc8c1c..b1d464e3eaa 100644 --- a/src/gallium/drivers/radeonsi/si_shader_info.h +++ b/src/gallium/drivers/radeonsi/si_shader_info.h @@ -32,7 +32,6 @@ struct si_shader_info { uint32_t image_buffers; uint32_t msaa_images; - unsigned shared_size; unsigned task_payload_size; uint16_t workgroup_size[3]; bool workgroup_size_variable:1; @@ -233,6 +232,7 @@ struct si_shader_variant_info { uint8_t ngg_lds_scratch_size; uint16_t private_mem_vgprs; uint32_t ngg_lds_vertex_size; /* VS,TES: Cull+XFB, GS: GSVS size */ + uint32_t shared_size; ac_nir_legacy_gs_info legacy_gs; }; diff --git a/src/gallium/drivers/radeonsi/si_shader_variant_info.c b/src/gallium/drivers/radeonsi/si_shader_variant_info.c index 6985b9d15a0..96a8c85ff27 100644 --- a/src/gallium/drivers/radeonsi/si_shader_variant_info.c +++ b/src/gallium/drivers/radeonsi/si_shader_variant_info.c @@ -300,6 +300,9 @@ void si_get_shader_variant_info(struct si_shader *shader, void si_get_late_shader_variant_info(struct si_shader *shader, struct si_shader_args *args, nir_shader *nir) { + /* mesh shader know this after ac_nir_lower_ngg_mesh() */ + shader->info.shared_size = nir->info.shared_size; + nir_foreach_block(block, nir_shader_get_entrypoint(nir)) { nir_foreach_instr(instr, block) { if (instr->type != nir_instr_type_intrinsic)