From 474ddeffe67ed23b4065731013f99b3de5cc346e Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Wed, 26 Apr 2023 16:31:44 +0800 Subject: [PATCH] radeonsi: resolve aco scratch addr symbols MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Used for scratch buffer operation and reg spill when aco. Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- src/gallium/drivers/radeonsi/si_shader.c | 2 ++ src/gallium/drivers/radeonsi/si_shader_aco.c | 29 +++++++++++++++++++ .../drivers/radeonsi/si_shader_internal.h | 1 + 3 files changed, 32 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 9d548a360cf..81339de24a8 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -967,6 +967,8 @@ static bool upload_binary_raw(struct si_screen *sscreen, struct si_shader *shade memcpy(rx_ptr, shader->binary.code_buffer, shader->binary.code_size); + si_aco_resolve_symbols(shader, rx_ptr, scratch_va); + sscreen->ws->buffer_unmap(sscreen->ws, shader->bo->buf); shader->gpu_address = shader->bo->gpu_address; return true; diff --git a/src/gallium/drivers/radeonsi/si_shader_aco.c b/src/gallium/drivers/radeonsi/si_shader_aco.c index 5a0bc0554ed..54fd4d87173 100644 --- a/src/gallium/drivers/radeonsi/si_shader_aco.c +++ b/src/gallium/drivers/radeonsi/si_shader_aco.c @@ -135,3 +135,32 @@ si_aco_compile_shader(struct si_shader *shader, return true; } + +void +si_aco_resolve_symbols(struct si_shader *shader, uint32_t *code, uint64_t scratch_va) +{ + const struct aco_symbol *symbols = (struct aco_symbol *)shader->binary.symbols; + + for (int i = 0; i < shader->binary.num_symbols; i++) { + uint32_t value = 0; + + switch (symbols[i].id) { + case aco_symbol_scratch_addr_lo: + value = scratch_va; + break; + case aco_symbol_scratch_addr_hi: + value = S_008F04_BASE_ADDRESS_HI(scratch_va >> 32); + + if (shader->selector->screen->info.gfx_level >= GFX11) + value |= S_008F04_SWIZZLE_ENABLE_GFX11(1); + else + value |= S_008F04_SWIZZLE_ENABLE_GFX6(1); + break; + default: + unreachable("invalid aco symbol"); + break; + } + + code[symbols[i].offset] = value; + } +} diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 5690983925c..2546d7c69d8 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -244,5 +244,6 @@ bool si_aco_compile_shader(struct si_shader *shader, struct si_shader_args *args, struct nir_shader *nir, struct util_debug_callback *debug); +void si_aco_resolve_symbols(struct si_shader *shader, uint32_t *code, uint64_t scratch_va); #endif