diff options
author | Qiang Yu <yuq825@gmail.com> | 2023-04-26 14:58:58 +0800 |
---|---|---|
committer | Qiang Yu <yuq825@gmail.com> | 2023-04-28 11:33:28 +0800 |
commit | 3c59df73185852516c6ebcd9f62ee2cad07d0eb4 (patch) | |
tree | 4a572b9a3fd9cd861c6c405022cee50c470f4849 /src/amd/compiler/aco_instruction_selection.cpp | |
parent | 360176b671fc7ec30a75eb45557bd2c1fc019fec (diff) | |
download | mesa-3c59df73185852516c6ebcd9f62ee2cad07d0eb4.tar.gz |
aco: get scratch addr from symbol for radeonsi
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22727>
Diffstat (limited to 'src/amd/compiler/aco_instruction_selection.cpp')
-rw-r--r-- | src/amd/compiler/aco_instruction_selection.cpp | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 4e3990e4fb6..c9b78c520d6 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -7519,9 +7519,16 @@ get_scratch_resource(isel_context* ctx) { Builder bld(ctx->program, ctx->block); Temp scratch_addr = ctx->program->private_segment_buffer; - if (ctx->stage.hw != HWStage::CS) + if (!scratch_addr.bytes()) { + Temp addr_lo = bld.sop1(aco_opcode::p_load_symbol, bld.def(s1), + Operand::c32(aco_symbol_scratch_addr_lo)); + Temp addr_hi = bld.sop1(aco_opcode::p_load_symbol, bld.def(s1), + Operand::c32(aco_symbol_scratch_addr_hi)); + scratch_addr = bld.pseudo(aco_opcode::p_create_vector, bld.def(s2), addr_lo, addr_hi); + } else if (ctx->stage.hw != HWStage::CS) { scratch_addr = bld.smem(aco_opcode::s_load_dwordx2, bld.def(s2), scratch_addr, Operand::zero()); + } uint32_t rsrc_conf = S_008F0C_ADD_TID_ENABLE(1) | S_008F0C_INDEX_STRIDE(ctx->program->wave_size == 64 ? 3 : 2); @@ -11138,22 +11145,25 @@ add_startpgm(struct isel_context* ctx) } } - if (ctx->args->ring_offsets.used) { - if (ctx->program->gfx_level < GFX9) { - /* Stash these in the program so that they can be accessed later when - * handling spilling. - */ + if (ctx->program->gfx_level < GFX9) { + /* Stash these in the program so that they can be accessed later when + * handling spilling. + */ + if (ctx->args->ring_offsets.used) ctx->program->private_segment_buffer = get_arg(ctx, ctx->args->ring_offsets); - ctx->program->scratch_offset = get_arg(ctx, ctx->args->scratch_offset); - } else if (ctx->program->gfx_level <= GFX10_3 && ctx->program->stage != raytracing_cs) { - /* Manually initialize scratch. For RT stages scratch initialization is done in the prolog. */ - Operand scratch_offset = Operand(get_arg(ctx, ctx->args->scratch_offset)); - scratch_offset.setLateKill(true); - Builder bld(ctx->program, ctx->block); - bld.pseudo(aco_opcode::p_init_scratch, bld.def(s2), bld.def(s1, scc), - get_arg(ctx, ctx->args->ring_offsets), scratch_offset); - } + ctx->program->scratch_offset = get_arg(ctx, ctx->args->scratch_offset); + } else if (ctx->program->gfx_level <= GFX10_3 && ctx->program->stage != raytracing_cs) { + /* Manually initialize scratch. For RT stages scratch initialization is done in the prolog. */ + Operand scratch_offset = Operand(get_arg(ctx, ctx->args->scratch_offset)); + scratch_offset.setLateKill(true); + + Operand scratch_addr = ctx->args->ring_offsets.used ? + Operand(get_arg(ctx, ctx->args->ring_offsets)) : Operand(s2); + + Builder bld(ctx->program, ctx->block); + bld.pseudo(aco_opcode::p_init_scratch, bld.def(s2), bld.def(s1, scc), + scratch_addr, scratch_offset); } return startpgm; |