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). Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev