radeonsi: pass calculated LDS size to ACO
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37577>
This commit is contained in:
parent
11db02d5d9
commit
d49dd4d024
3 changed files with 12 additions and 9 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 &&
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue