From: Brian Paul Date: Tue, 23 Jan 2018 17:48:51 +0000 (-0700) Subject: vbo: fix incorrect min/max_index values in display list draw call X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=365a48abddcabf6596c2e34a784d91c8ab929918;p=mesa.git vbo: fix incorrect min/max_index values in display list draw call This fixes another regression from commit 8e4efdc895ea ("vbo: optimize some display list drawing"). The problem was the min_index, max_index values passed to the vbo drawing function were not computed to compensate for the biased prim::start values. https://bugs.freedesktop.org/show_bug.cgi?id=104746 https://bugs.freedesktop.org/show_bug.cgi?id=104742 https://bugs.freedesktop.org/show_bug.cgi?id=104690 Tested-by: Clayton Craft Fixes: 8e4efdc895ea ("vbo: optimize some display list drawing") Reviewed-by: Emil Velikov --- diff --git a/src/mesa/vbo/vbo_save.h b/src/mesa/vbo/vbo_save.h index 04b9e388f41..51ea9ccb3d0 100644 --- a/src/mesa/vbo/vbo_save.h +++ b/src/mesa/vbo/vbo_save.h @@ -74,7 +74,8 @@ struct vbo_save_vertex_list { GLuint current_size; GLuint buffer_offset; /**< in bytes */ - GLuint vertex_count; + GLuint start_vertex; /**< first vertex used by any primitive */ + GLuint vertex_count; /**< number of vertices in this list */ GLuint wrap_count; /* number of copied vertices at start */ GLboolean dangling_attr_ref; /* current attr implicitly referenced outside the list */ diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index e0fe5fd9ac9..11c40a26429 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -563,6 +563,9 @@ compile_vertex_list(struct gl_context *ctx) for (unsigned i = 0; i < save->prim_count; i++) { save->prims[i].start += start_offset; } + node->start_vertex = start_offset; + } else { + node->start_vertex = 0; } /* Reset our structures for the next run of vertices: diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index 3a6083fdf45..8cfe10bdc55 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -325,13 +325,14 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data) _mesa_update_state(ctx); if (node->vertex_count > 0) { + GLuint min_index = node->start_vertex; + GLuint max_index = min_index + node->vertex_count - 1; vbo_context(ctx)->draw_prims(ctx, node->prims, node->prim_count, NULL, GL_TRUE, - 0, /* Node is a VBO, so this is ok */ - node->vertex_count - 1, + min_index, max_index, NULL, 0, NULL); } }