radeonsi: resolve aco scratch addr symbols

Used for scratch buffer operation and reg spill when aco.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22573>
This commit is contained in:
Qiang Yu 2023-04-26 16:31:44 +08:00 committed by Marge Bot
parent 7aac3508dc
commit 474ddeffe6
3 changed files with 32 additions and 0 deletions

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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