Module: Mesa Branch: main Commit: 9594a579b2b667afa5aa6a51e8f365ae56e50e6a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9594a579b2b667afa5aa6a51e8f365ae56e50e6a
Author: Qiang Yu <[email protected]> Date: Mon Aug 7 14:25:14 2023 +0800 radeonsi: extract si_prolog_get_internal_binding_slot To be shared with ps prolog. Reviewed-by: Marek Olšák <[email protected]> Signed-off-by: Qiang Yu <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24989> --- src/gallium/drivers/radeonsi/si_shader_internal.h | 1 + src/gallium/drivers/radeonsi/si_shader_llvm.c | 12 ++++++++++++ src/gallium/drivers/radeonsi/si_shader_llvm_vs.c | 14 +++----------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 8f5a9422341..d5bf2915fbd 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -200,6 +200,7 @@ LLVMValueRef si_insert_input_ret_float(struct si_shader_context *ctx, LLVMValueR LLVMValueRef si_insert_input_ptr(struct si_shader_context *ctx, LLVMValueRef ret, struct ac_arg param, unsigned return_index); LLVMValueRef si_prolog_get_internal_bindings(struct si_shader_context *ctx); +LLVMValueRef si_prolog_get_internal_binding_slot(struct si_shader_context *ctx, unsigned slot); LLVMValueRef si_unpack_param(struct si_shader_context *ctx, struct ac_arg param, unsigned rshift, unsigned bitwidth); bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compiler, diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index d6b72a066ce..2e8f389a66e 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -301,6 +301,18 @@ LLVMValueRef si_prolog_get_internal_bindings(struct si_shader_context *ctx) return list; } +LLVMValueRef si_prolog_get_internal_binding_slot(struct si_shader_context *ctx, unsigned slot) +{ + LLVMValueRef list = LLVMBuildIntToPtr( + ctx->ac.builder, ac_get_arg(&ctx->ac, ctx->args->internal_bindings), + ac_array_in_const32_addr_space(ctx->ac.v4i32), ""); + LLVMValueRef index = LLVMConstInt(ctx->ac.i32, slot, 0); + + return ac_build_load_to_sgpr(&ctx->ac, + (struct ac_llvm_pointer) { .t = ctx->ac.v4i32, .v = list }, + index); +} + /* Ensure that the esgs ring is declared. * * We declare it with 64KB alignment as a hint that the diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c index 6023d78c435..8550e2449fa 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c @@ -141,17 +141,9 @@ void si_llvm_build_vs_prolog(struct si_shader_context *ctx, union si_shader_part } /* Compute vertex load indices from instance divisors. */ - LLVMValueRef instance_divisor_constbuf = NULL; - - if (key->vs_prolog.states.instance_divisor_is_fetched) { - LLVMValueRef list = ac_get_arg(&ctx->ac, args->internal_bindings); - list = LLVMBuildIntToPtr(ctx->ac.builder, list, - ac_array_in_const32_addr_space(ctx->ac.v4i32), ""); - - LLVMValueRef buf_index = LLVMConstInt(ctx->ac.i32, SI_VS_CONST_INSTANCE_DIVISORS, 0); - instance_divisor_constbuf = ac_build_load_to_sgpr(&ctx->ac, - (struct ac_llvm_pointer) { .v = list, .t = ctx->ac.v4i32 }, buf_index); - } + LLVMValueRef instance_divisor_constbuf = + key->vs_prolog.states.instance_divisor_is_fetched ? + si_prolog_get_internal_binding_slot(ctx, SI_VS_CONST_INSTANCE_DIVISORS) : NULL; for (int i = 0; i < key->vs_prolog.num_inputs; i++) { LLVMValueRef index = get_vertex_index(ctx, &key->vs_prolog.states, i,
