summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-08-05 11:29:07 -0700
committerEric Anholt <[email protected]>2014-08-08 18:59:47 -0700
commit961715eab2117772e0145229d6f934d351b9b27b (patch)
tree092d1343f153d8764ad4c246ca3e768469c27bed /src
parent1d03692f7888929c44446633809fe7bbc9da5d73 (diff)
u_primconvert: Copy min/max_index from the original primitive.
These values are supposed to be the minimum/maximum index values used to read from the vertex buffers. This code either copies index values out of the old IB (so, same min/max as the original draw call), or generates a new IB (using index values between the start and the start + count of the old array draw info, which just happens to be what min/max_index are set to by st_draw.c). We were incorrectly setting the max_index in the converting-from-glDrawArrays case to the start vertex plus the number of vertices generated in the new IB, which broke QUADS primitive conversion on VC4 (where max_index really has to be correct, or the kernel might reject your draw call due to buffer overflow). Reviewed-by: Rob Clark <[email protected]> (from verbal description of the patch)
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/indices/u_primconvert.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/src/gallium/auxiliary/indices/u_primconvert.c b/src/gallium/auxiliary/indices/u_primconvert.c
index f2a77ceb2cb..abcf0d710d7 100644
--- a/src/gallium/auxiliary/indices/u_primconvert.c
+++ b/src/gallium/auxiliary/indices/u_primconvert.c
@@ -121,6 +121,8 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
memset(&new_ib, 0, sizeof(new_ib));
util_draw_init_info(&new_info);
new_info.indexed = true;
+ new_info.min_index = info->min_index;
+ new_info.max_index = info->max_index;
if (info->indexed) {
u_index_translator(pc->primtypes_mask,
@@ -152,13 +154,9 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
&dst_transfer);
if (info->indexed) {
- new_info.min_index = 0;
- new_info.max_index = ~0;
trans_func(src, info->start, new_info.count, dst);
}
else {
- new_info.min_index = info->start;
- new_info.max_index = info->start + new_info.count;
gen_func(info->start, new_info.count, dst);
}