From 4dd1a568404dcf068cb111db04bb6e904b91d7bd Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Sun, 25 Apr 2010 21:43:49 +0100 Subject: draw: Respect pipe_vertex_buffer::max_index in llvm generated code. Everybody should respect max_index, specially llvm generated code, which likes to eat vertices 4 at a time, so it may end up chew a bit a bit more than actually exists. --- src/gallium/auxiliary/draw/draw_llvm.c | 12 +++++++++--- src/gallium/auxiliary/draw/draw_llvm.h | 5 ++++- 2 files changed, 13 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index 936753f66b..703b46b518 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -286,10 +286,16 @@ generate_fetch(LLVMBuilderRef builder, LLVMValueRef vbuffer_ptr = LLVMBuildGEP(builder, vbuffers_ptr, &indices, 1, ""); LLVMValueRef vb_stride = draw_jit_vbuffer_stride(builder, vbuf); + LLVMValueRef vb_max_index = draw_jit_vbuffer_max_index(builder, vbuf); LLVMValueRef vb_buffer_offset = draw_jit_vbuffer_offset(builder, vbuf); - LLVMValueRef stride = LLVMBuildMul(builder, - vb_stride, - index, ""); + LLVMValueRef cond; + LLVMValueRef stride; + + cond = LLVMBuildICmp(builder, LLVMIntULE, index, vb_max_index, ""); + + index = LLVMBuildSelect(builder, cond, index, vb_max_index, ""); + + stride = LLVMBuildMul(builder, vb_stride, index, ""); vbuffer_ptr = LLVMBuildLoad(builder, vbuffer_ptr, "vbuffer"); diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h index 28b9044a81..20f4f3da5f 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.h +++ b/src/gallium/auxiliary/draw/draw_llvm.h @@ -78,7 +78,10 @@ struct draw_jit_context #define draw_jit_vbuffer_stride(_builder, _ptr) \ lp_build_struct_get(_builder, _ptr, 0, "stride") -#define draw_jit_vbuffer_offset(_builder, _ptr) \ +#define draw_jit_vbuffer_max_index(_builder, _ptr) \ + lp_build_struct_get(_builder, _ptr, 1, "max_index") + +#define draw_jit_vbuffer_offset(_builder, _ptr) \ lp_build_struct_get(_builder, _ptr, 2, "buffer_offset") -- cgit v1.2.3