From 013424678e2604a45c420ec403e6f12b82446b24 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Tue, 14 May 2013 03:47:36 -0400 Subject: [PATCH] draw/gs: fix extracting of the clip MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: José Fonseca --- src/gallium/auxiliary/draw/draw_llvm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index 017d729..4a71955 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -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 -- 2.7.4