From d49dd4d0248270d7966eb766448e8ff7d0e3a34d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 25 Sep 2025 18:57:58 +0200 Subject: [PATCH] radeonsi: pass calculated LDS size to ACO Part-of: --- src/gallium/drivers/radeonsi/si_shader.c | 19 ++++++++++--------- src/gallium/drivers/radeonsi/si_shader_aco.c | 1 + .../drivers/radeonsi/si_shader_internal.h | 1 + 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index a90ec512183..c64ea4b553a 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -421,12 +421,13 @@ static int upload_binary_elf(struct si_screen *sscreen, struct si_shader *shader return size; } -static void calculate_needed_lds_size(struct si_screen *sscreen, struct si_shader *shader) +unsigned si_calculate_needed_lds_size(enum amd_gfx_level gfx_level, struct si_shader *shader) { mesa_shader_stage stage = shader->is_gs_copy_shader ? MESA_SHADER_VERTEX : shader->selector->stage; + unsigned lds_size = 0; - if (sscreen->info.gfx_level >= GFX9 && stage <= MESA_SHADER_GEOMETRY && + if (gfx_level >= GFX9 && stage <= MESA_SHADER_GEOMETRY && (stage == MESA_SHADER_GEOMETRY || shader->key.ge.as_ngg)) { unsigned size_in_dw = shader->key.ge.as_ngg ? shader->ngg.info.esgs_lds_size : shader->gs_info.esgs_lds_size; @@ -434,18 +435,16 @@ static void calculate_needed_lds_size(struct si_screen *sscreen, struct si_shade if (stage == MESA_SHADER_GEOMETRY && shader->key.ge.as_ngg) size_in_dw += shader->ngg.info.ngg_out_lds_size; - shader->config.lds_size = - ALIGN(size_in_dw * 4, get_lds_granularity(sscreen, stage)); + lds_size = size_in_dw * 4; } if (stage == MESA_SHADER_COMPUTE) { - shader->config.lds_size = ALIGN(shader->selector->info.base.shared_size, - sscreen->info.lds_alloc_granularity); + lds_size = shader->selector->info.base.shared_size; } /* Check that the LDS size is within hw limits. */ - assert(shader->config.lds_size % sscreen->info.lds_alloc_granularity == 0); - assert(shader->config.lds_size <= (sscreen->info.gfx_level == GFX6 ? 32 : 64) * 1024); + assert(lds_size <= (gfx_level == GFX6 ? 32 : 64) * 1024); + return lds_size; } static int upload_binary_raw(struct si_screen *sscreen, struct si_shader *shader, @@ -518,7 +517,9 @@ int si_shader_binary_upload_at(struct si_screen *sscreen, struct si_shader *shad r = upload_binary_raw(sscreen, shader, scratch_va, dma_upload, bo_offset); } - calculate_needed_lds_size(sscreen, shader); + unsigned lds_size = si_calculate_needed_lds_size(sscreen->info.gfx_level, shader); + shader->config.lds_size = ALIGN(lds_size, sscreen->info.lds_alloc_granularity); + return r; } diff --git a/src/gallium/drivers/radeonsi/si_shader_aco.c b/src/gallium/drivers/radeonsi/si_shader_aco.c index 3a8fd30fa45..3b4ed2c604f 100644 --- a/src/gallium/drivers/radeonsi/si_shader_aco.c +++ b/src/gallium/drivers/radeonsi/si_shader_aco.c @@ -77,6 +77,7 @@ si_fill_aco_shader_info(struct si_shader *shader, struct aco_shader_info *info, info->image_2d_view_of_3d = gfx_level == GFX9; info->hw_stage = si_select_hw_stage(stage, key, gfx_level); + info->lds_size = si_calculate_needed_lds_size(gfx_level, shader); if (stage <= MESA_SHADER_GEOMETRY && key->ge.as_ngg && !key->ge.as_es) { info->schedule_ngg_pos_exports = sel->screen->info.gfx_level < GFX11 && diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 3e29e8cda2d..056c0d32678 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -96,6 +96,7 @@ unsigned si_get_max_workgroup_size(const struct si_shader *shader); enum ac_hw_stage si_select_hw_stage(const mesa_shader_stage stage, const union si_shader_key *const key, const enum amd_gfx_level gfx_level); bool gfx10_ngg_export_prim_early(struct si_shader *shader); +unsigned si_calculate_needed_lds_size(enum amd_gfx_level gfx_level, struct si_shader *shader); /* si_shader_args.c */ void si_init_shader_args(struct si_shader *shader, struct si_shader_args *args,