Mesa (master): radeonsi: implement indirect adressing of constants

Christian König deathsimple at kemper.freedesktop.org
Tue Mar 19 14:16:34 UTC 2013


Module: Mesa
Branch: master
Commit: 5e616cf2c5acb5b35d9b665527b265dec1ae5d11
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5e616cf2c5acb5b35d9b665527b265dec1ae5d11

Author: Christian König <christian.koenig at amd.com>
Date:   Thu Mar  7 11:58:56 2013 +0100

radeonsi: implement indirect adressing of constants

Signed-off-by: Christian König <christian.koenig at amd.com>
Reviewed-by: Tom Stellard <thomas.stellard at amd.com>

---

 src/gallium/drivers/radeonsi/radeonsi_shader.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index c407953..589bd82 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 = &reg->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);




More information about the mesa-commit mailing list