draw/gs: fix extracting of the clip
authorZack Rusin <zackr@vmware.com>
Tue, 14 May 2013 07:47:36 +0000 (03:47 -0400)
committerZack Rusin <zackr@vmware.com>
Tue, 14 May 2013 08:04:08 +0000 (04:04 -0400)
The indices are not consecutive when using the geometry shader,
which means we were extracting non existing values. Create
an array of linear indices and always use it instead of the passed
indices. Found by Jose.

Signed-off-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/draw/draw_llvm.c

index 017d72941000f1c6eeaec6899fa76780307b1fdd..4a71955f56abf5518ab668b55a25c3d0a2d0004f 100644 (file)
@@ -871,6 +871,7 @@ store_aos_array(struct gallivm_state *gallivm,
    LLVMBuilderRef builder = gallivm->builder;
    LLVMValueRef attr_index = lp_build_const_int32(gallivm, attrib);
    LLVMValueRef inds[LP_MAX_VECTOR_WIDTH / 32];
+   LLVMValueRef linear_inds[LP_MAX_VECTOR_WIDTH / 32];
    LLVMValueRef io_ptrs[LP_MAX_VECTOR_WIDTH / 32];
    int vector_length = soa_type.length;
    int i;
@@ -878,10 +879,11 @@ store_aos_array(struct gallivm_state *gallivm,
    debug_assert(TGSI_NUM_CHANNELS == 4);
 
    for (i = 0; i < vector_length; i++) {
+      linear_inds[i] = lp_build_const_int32(gallivm, i);
       if (indices) {
          inds[i] = indices[i];
       } else {
-         inds[i] = lp_build_const_int32(gallivm, i);
+         inds[i] = linear_inds[i];
       }
       io_ptrs[i] = LLVMBuildGEP(builder, io_ptr, &inds[i], 1, "");
    }
@@ -904,7 +906,7 @@ store_aos_array(struct gallivm_state *gallivm,
       cliptmp = LLVMBuildOr(builder, val, clipmask, "");
       for (i = 0; i < vector_length; i++) {
          LLVMValueRef id_ptr = draw_jit_header_id(gallivm, io_ptrs[i]);
-         val = LLVMBuildExtractElement(builder, cliptmp, inds[i], "");
+         val = LLVMBuildExtractElement(builder, cliptmp, linear_inds[i], "");
          val = adjust_mask(gallivm, val);
          LLVMBuildStore(builder, val, id_ptr);
 #if DEBUG_STORE