diff options
author | Brian Paul <[email protected]> | 2018-01-23 10:48:51 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2018-01-24 10:12:49 -0700 |
commit | 365a48abddcabf6596c2e34a784d91c8ab929918 (patch) | |
tree | eca45ef69529abb1446c3ef04f366545851b51f0 | |
parent | 2123bd2805c3c3dc23afd5322084fa0dd209dedb (diff) |
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 <[email protected]>
Fixes: 8e4efdc895ea ("vbo: optimize some display list drawing")
Reviewed-by: Emil Velikov <[email protected]>
-rw-r--r-- | src/mesa/vbo/vbo_save.h | 3 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_save_api.c | 3 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_save_draw.c | 5 |
3 files changed, 8 insertions, 3 deletions
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); } } |