gallivm: fix indirect addressing of temps in soa mode
authorZack Rusin <zackr@vmware.com>
Sat, 27 Apr 2013 02:53:07 +0000 (22:53 -0400)
committerZack Rusin <zackr@vmware.com>
Sat, 27 Apr 2013 05:18:51 +0000 (01:18 -0400)
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 <zackr@vmware.com>
Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c

index b3e39150f86947650a71e34fe67d6caabb4388a0..733f0ed1cae1373066fff9bb846fa0e5f56179bb 100644 (file)
@@ -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);