When PrimitiveRestartInSoftware is set, the VBO module will handle primitive restart scenarios before calling the vbo_draw_func drawing function.
Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> --- src/mesa/vbo/vbo_exec_array.c | 50 ++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index cc94e76..e584cef 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -542,6 +542,30 @@ vbo_bind_arrays(struct gl_context *ctx) } +static void vbo_exec_array_draw_prims(struct gl_context *ctx, + const struct _mesa_prim *prim, + GLuint nr_prims, + const struct _mesa_index_buffer *ib, + GLboolean index_bounds_valid, + GLuint min_index, + GLuint max_index, + struct gl_transform_feedback_object *tfb_vertcount) +{ + struct vbo_context *vbo = vbo_context(ctx); + + if ((ib != NULL) && + ctx->Const.PrimitiveRestartInSoftware && + ctx->Array.PrimitiveRestart) { + /* Handle primitive restart in software */ + vbo_sw_primitive_restart(ctx, prim, nr_prims, ib, tfb_vertcount); + } else { + /* Call driver directly for draw_prims */ + vbo->draw_prims(ctx, prim, nr_prims, ib, + index_bounds_valid, min_index, max_index, tfb_vertcount); + } +} + + /** * Helper function called by the other DrawArrays() functions below. * This is where we handle primitive restart for drawing non-indexed @@ -600,8 +624,8 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, if (primCount > 0) { /* draw one or two prims */ check_buffers_are_unmapped(exec->array.inputs); - vbo->draw_prims(ctx, prim, primCount, NULL, - GL_TRUE, start, start + count - 1, NULL); + vbo_exec_array_draw_prims(ctx, prim, primCount, NULL, + GL_TRUE, start, start + count - 1, NULL); } } else { @@ -610,9 +634,9 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, prim[0].count = count; check_buffers_are_unmapped(exec->array.inputs); - vbo->draw_prims(ctx, prim, 1, NULL, - GL_TRUE, start, start + count - 1, - NULL); + vbo_exec_array_draw_prims(ctx, prim, 1, NULL, + GL_TRUE, start, start + count - 1, + NULL); } } @@ -801,8 +825,8 @@ vbo_validated_drawrangeelements(struct gl_context *ctx, GLenum mode, */ check_buffers_are_unmapped(exec->array.inputs); - vbo->draw_prims( ctx, prim, 1, &ib, - index_bounds_valid, start, end, NULL ); + vbo_exec_array_draw_prims(ctx, prim, 1, &ib, + index_bounds_valid, start, end, NULL ); } @@ -1096,8 +1120,8 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode, } check_buffers_are_unmapped(exec->array.inputs); - vbo->draw_prims(ctx, prim, primcount, &ib, - GL_FALSE, ~0, ~0, NULL); + vbo_exec_array_draw_prims(ctx, prim, primcount, &ib, + GL_FALSE, ~0, ~0, NULL); } else { /* render one prim at a time */ for (i = 0; i < primcount; i++) { @@ -1121,8 +1145,8 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode, prim[0].basevertex = 0; check_buffers_are_unmapped(exec->array.inputs); - vbo->draw_prims(ctx, prim, 1, &ib, - GL_FALSE, ~0, ~0, NULL); + vbo_exec_array_draw_prims(ctx, prim, 1, &ib, + GL_FALSE, ~0, ~0, NULL); } } @@ -1199,8 +1223,8 @@ vbo_draw_transform_feedback(struct gl_context *ctx, GLenum mode, * will be rendered. */ check_buffers_are_unmapped(exec->array.inputs); - vbo->draw_prims(ctx, prim, 1, NULL, - GL_TRUE, 0, 0, obj); + vbo_exec_array_draw_prims(ctx, prim, 1, NULL, + GL_TRUE, 0, 0, obj); } /** -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev