diff --git a/src/amd/common/ac_binary.c b/src/amd/common/ac_binary.c index c45d503bb9b..0046109ca95 100644 --- a/src/amd/common/ac_binary.c +++ b/src/amd/common/ac_binary.c @@ -113,7 +113,9 @@ void ac_parse_shader_binary_config(const char *data, size_t nbytes, unsigned wav conf->float_mode |= V_00B028_FP_16_64_DENORMS; } -unsigned ac_align_shader_binary_for_prefetch(const struct radeon_info *info, unsigned size) +unsigned ac_align_shader_binary_for_prefetch(enum amd_gfx_level gfx_level, + unsigned prefetch_distance, + unsigned size) { /* The SQ fetches up to N cache lines of 16 dwords * ahead of the PC, configurable by SH_MEM_CONFIG and @@ -130,10 +132,8 @@ unsigned ac_align_shader_binary_for_prefetch(const struct radeon_info *info, uns * boundaries, but (1) needs to be addressed. Due to buffer * suballocation, we just play it safe. */ - unsigned prefetch_distance = info->instr_prefetch_distance; - if (prefetch_distance) { - if (info->gfx_level >= GFX11) + if (gfx_level >= GFX11) size = align(size + prefetch_distance * 64, 128); else size = align(size + prefetch_distance * 64, 64); diff --git a/src/amd/common/ac_binary.h b/src/amd/common/ac_binary.h index 46eb3f6d412..ad384a710ae 100644 --- a/src/amd/common/ac_binary.h +++ b/src/amd/common/ac_binary.h @@ -10,11 +10,12 @@ #include #include +#include "amd_family.h" + #ifdef __cplusplus extern "C" { #endif -struct radeon_info; struct ac_compiler_info; struct ac_shader_config { @@ -38,7 +39,9 @@ void ac_parse_shader_binary_config(const char *data, size_t nbytes, unsigned wav const struct ac_compiler_info *compiler_info, struct ac_shader_config *conf); -unsigned ac_align_shader_binary_for_prefetch(const struct radeon_info *info, unsigned size); +unsigned ac_align_shader_binary_for_prefetch(enum amd_gfx_level gfx_level, + unsigned prefetch_distance, + unsigned size); #ifdef __cplusplus } diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index bfb67525ebd..2ef4d1c5c37 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -1238,7 +1238,7 @@ radv_alloc_shader_memory(struct radv_device *device, uint32_t size, bool replaya { const struct radv_physical_device *pdev = radv_device_physical(device); - size = ac_align_shader_binary_for_prefetch(&pdev->info, size); + size = ac_align_shader_binary_for_prefetch(pdev->info.gfx_level, pdev->info.instr_prefetch_distance, size); size = align(size, RADV_SHADER_ALLOC_ALIGNMENT); mtx_lock(&device->shader_arena_mutex); diff --git a/src/gallium/drivers/radeonsi/gfx/si_shader.c b/src/gallium/drivers/radeonsi/gfx/si_shader.c index 71c01692638..0a82a493d06 100644 --- a/src/gallium/drivers/radeonsi/gfx/si_shader.c +++ b/src/gallium/drivers/radeonsi/gfx/si_shader.c @@ -180,7 +180,8 @@ 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, + ac_align_shader_binary_for_prefetch(sscreen->info.gfx_level, + sscreen->info.instr_prefetch_distance, shader->complete_shader_binary_size); /* INST_PREF_SIZE uses 128B granularity. diff --git a/src/gallium/drivers/radeonsi/gfx/si_shader_binary.c b/src/gallium/drivers/radeonsi/gfx/si_shader_binary.c index 4c54c7f2033..a6ec343a21e 100644 --- a/src/gallium/drivers/radeonsi/gfx/si_shader_binary.c +++ b/src/gallium/drivers/radeonsi/gfx/si_shader_binary.c @@ -126,7 +126,9 @@ static void *pre_upload_binary(struct si_screen *sscreen, struct si_shader *shad unsigned *staging_offset, int64_t bo_offset) { - unsigned aligned_size = ac_align_shader_binary_for_prefetch(&sscreen->info, binary_size); + unsigned aligned_size = ac_align_shader_binary_for_prefetch(sscreen->info.gfx_level, + sscreen->info.instr_prefetch_distance, + binary_size); if (bo_offset >= 0) { /* sqtt needs to upload shaders as a pipeline, where all shaders