diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 619b06a00d4..fb9be22a1b5 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -839,6 +839,23 @@ static unsigned si_get_shader_binary_size(struct si_screen *screen, struct si_sh } } +unsigned si_get_shader_prefetch_size(struct si_shader *shader) +{ + struct si_screen *sscreen = shader->selector->screen; + /* This excludes arrays of constants after instructions. */ + unsigned exec_size = + ac_align_shader_binary_for_prefetch(&sscreen->info, + si_get_shader_binary_size(sscreen, shader)); + + /* INST_PREF_SIZE uses 128B granularity. + * - GFX11: max 128 * 63 = 8064 + */ + unsigned max_pref_size = 63; + unsigned exec_size_gran128 = DIV_ROUND_UP(exec_size, 128); + + return MIN2(max_pref_size, exec_size_gran128); +} + bool si_get_external_symbol(enum amd_gfx_level gfx_level, void *data, const char *name, uint64_t *value) { diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index cd1844a8015..a5cdc37fd8f 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -1004,6 +1004,7 @@ bool si_shader_binary_open(struct si_screen *screen, struct si_shader *shader, struct ac_rtld_binary *rtld); bool si_get_external_symbol(enum amd_gfx_level gfx_level, void *data, const char *name, uint64_t *value); +unsigned si_get_shader_prefetch_size(struct si_shader *shader); /* si_shader_info.c */ void si_nir_scan_shader(struct si_screen *sscreen, const struct nir_shader *nir, diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index c55215e943c..1984336d8ec 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -673,7 +673,6 @@ void si_ps_key_update_framebuffer_rasterizer_sample_shading(struct si_context *s void si_init_tess_factor_ring(struct si_context *sctx); bool si_update_gs_ring_buffers(struct si_context *sctx); bool si_update_spi_tmpring_size(struct si_context *sctx, unsigned bytes); -unsigned si_get_shader_prefetch_size(struct si_shader *shader); bool si_set_tcs_to_fixed_func_shader(struct si_context *sctx); void si_update_tess_io_layout_state(struct si_context *sctx); diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index 497439d290d..806386147a4 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -662,13 +662,6 @@ static unsigned si_get_vs_vgpr_comp_cnt(struct si_screen *sscreen, struct si_sha return max; } -unsigned si_get_shader_prefetch_size(struct si_shader *shader) -{ - /* inst_pref_size is calculated in cache line size granularity */ - assert(!(shader->bo->b.b.width0 & 0x7f)); - return MIN2(shader->bo->b.b.width0, 8064) / 128; -} - static void si_shader_ls(struct si_screen *sscreen, struct si_shader *shader) { struct si_pm4_state *pm4;