For the case that index data is stored in element array buffer object, and user called glMultiDrawElements, count the min/max_index before calling vbo->draw_prims. vbo_get_minmax_index() isn't friendly to this case. So do it while building the prim info.
Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com> --- src/mesa/vbo/vbo_exec_array.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index a6e41e9..70efd3f 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -1147,11 +1147,18 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode, fallback = GL_TRUE; if (!fallback) { + struct _mesa_index_buffer tmp_ib; + GLuint min_index = ~0; + GLuint max_index = 0; + GLuint tmp_min, tmp_max; + ib.count = (max_index_ptr - min_index_ptr) / index_type_size; ib.type = type; ib.obj = ctx->Array.ArrayObj->ElementArrayBufferObj; ib.ptr = (void *)min_index_ptr; + tmp_ib = ib; + for (i = 0; i < primcount; i++) { prim[i].begin = (i == 0); prim[i].end = (i == primcount - 1); @@ -1166,11 +1173,16 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode, prim[i].basevertex = basevertex[i]; else prim[i].basevertex = 0; + + tmp_ib.ptr = indices[i]; + vbo_get_minmax_index(ctx, &prim[i], &tmp_ib, &tmp_min, &tmp_max); + min_index = MIN2(min_index, tmp_min); + max_index = MAX2(max_index, tmp_max); } check_buffers_are_unmapped(exec->array.inputs); vbo->draw_prims(ctx, exec->array.inputs, prim, primcount, &ib, - GL_FALSE, ~0, ~0, NULL); + GL_TRUE, min_index, max_index, NULL); } else { /* render one prim at a time */ for (i = 0; i < primcount; i++) { -- 1.7.4.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev