From: Christian König Date: Thu, 7 Mar 2013 10:58:56 +0000 (+0100) Subject: radeonsi: implement indirect adressing of constants X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5e616cf2c5acb5b35d9b665527b265dec1ae5d11;p=mesa.git radeonsi: implement indirect adressing of constants Signed-off-by: Christian König Reviewed-by: Tom Stellard --- diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index c40795349c7..589bd826a39 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -33,6 +33,7 @@ #include "gallivm/lp_bld_intr.h" #include "gallivm/lp_bld_logic.h" #include "gallivm/lp_bld_tgsi.h" +#include "gallivm/lp_bld_arit.h" #include "radeon_llvm.h" #include "radeon_llvm_emit.h" #include "tgsi/tgsi_info.h" @@ -372,13 +373,14 @@ static LLVMValueRef fetch_constant( ptr = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, SI_PARAM_CONST); args[0] = build_indexed_load(base->gallivm, ptr, bld_base->uint_bld.zero); - /* currently not supported */ + args[1] = lp_build_const_int32(base->gallivm, (reg->Register.Index * 4 + swizzle) * 4); if (reg->Register.Indirect) { - assert(0); - result = lp_build_const_int32(base->gallivm, 0); - return bitcast(bld_base, type, result); - } else - args[1] = lp_build_const_int32(base->gallivm, (reg->Register.Index * 4 + swizzle) * 4); + const struct tgsi_ind_register *ireg = ®->Indirect; + LLVMValueRef addr = si_shader_ctx->radeon_bld.soa.addr[ireg->Index][ireg->Swizzle]; + LLVMValueRef idx = LLVMBuildLoad(base->gallivm->builder, addr, "load addr reg"); + idx = lp_build_mul_imm(&bld_base->uint_bld, idx, 16); + args[1] = lp_build_add(&bld_base->uint_bld, idx, args[1]); + } result = build_intrinsic(base->gallivm->builder, "llvm.SI.load.const", base->elem_type, args, 2, LLVMReadOnlyAttribute | LLVMNoUnwindAttribute);