On Fri, May 11, 2012 at 9:48 AM, Marek Olšák <mar...@gmail.com> wrote: > On Fri, May 11, 2012 at 5:15 PM, Jordan Justen > <jordan.l.jus...@intel.com> wrote: >> 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 { > > The hunk above can be discarded (and I would prefer if it were), because the > draw call is non-indexed. > >> @@ -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); >> } >> } >> > > Same as above. > >> @@ -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); >> } > > glDrawTransformFeedback is non-indexed too and obviously you can't do > any primitive splitting in it anyway, because the vertex count is > inaccessible to a CPU (and _mesa_prim::count is always 0).
Ok, I'll exclude these these cases, and rename vbo_exec_array_draw_prims to something like vbo_handle_primitive_restart. -Jordan _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev