From f9f57312de863dd058a595c69ef3f42a5d90bce5 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Fri, 26 Apr 2013 22:53:07 -0400 Subject: [PATCH] gallivm: fix indirect addressing of temps in soa mode MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit we weren't adding the soa offsets when constructing the indices for the gather functions. That meant that we were always returning the data in the first vertex/primitive/pixel in the SoA structure and not correctly fetching from all structures. Signed-off-by: Zack Rusin Reviewed-by: José Fonseca --- src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index b3e39150f86..733f0ed1cae 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c @@ -1110,6 +1110,7 @@ emit_fetch_temporary( struct gallivm_state *gallivm = bld->bld_base.base.gallivm; LLVMBuilderRef builder = gallivm->builder; struct lp_build_context *uint_bld = &bld_base->uint_bld; + struct lp_build_context *float_bld = &bld_base->base; LLVMValueRef indirect_index = NULL; LLVMValueRef res; @@ -1128,12 +1129,22 @@ emit_fetch_temporary( bld->bld_base.base.type.length); LLVMValueRef index_vec; /* index into the const buffer */ LLVMValueRef temps_array; + LLVMValueRef pixel_offsets; + LLVMValueRef offsets[LP_MAX_VECTOR_LENGTH]; LLVMTypeRef float4_ptr_type; + int i; + + /* build pixel offset vector: {0, 1, 2, 3, ...} */ + for (i = 0; i < float_bld->type.length; i++) { + offsets[i] = lp_build_const_int32(gallivm, i); + } + pixel_offsets = LLVMConstVector(offsets, float_bld->type.length); /* index_vec = (indirect_index * 4 + swizzle) * length */ index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec); index_vec = lp_build_mul(uint_bld, index_vec, length_vec); + index_vec = lp_build_add(uint_bld, index_vec, pixel_offsets); /* cast temps_array pointer to float* */ float4_ptr_type = LLVMPointerType(LLVMFloatTypeInContext(bld->bld_base.base.gallivm->context), 0); -- 2.30.2