From: Zack Rusin Date: Sat, 27 Apr 2013 02:53:07 +0000 (-0400) Subject: gallivm: fix indirect addressing of temps in soa mode X-Git-Tag: android-x86-4.4-r1~121 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=f9f57312de863dd058a595c69ef3f42a5d90bce5;p=android-x86%2Fexternal-mesa.git gallivm: fix indirect addressing of temps in soa mode 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 --- 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);