Mesa (master): draw: Respect pipe_vertex_buffer:: max_index in llvm generated code.
Jose Fonseca
jrfonseca at kemper.freedesktop.org
Sun Apr 25 22:41:54 UTC 2010
Module: Mesa
Branch: master
Commit: 4dd1a568404dcf068cb111db04bb6e904b91d7bd
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4dd1a568404dcf068cb111db04bb6e904b91d7bd
Author: José Fonseca <jfonseca at vmware.com>
Date: Sun Apr 25 21:43:49 2010 +0100
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(-)
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
index 936753f..703b46b 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 28b9044..20f4f3d 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")
More information about the mesa-commit
mailing list