It looks like i965 was the only thing directly calling _tnl_draw_prims without going through _tnl_vbo_draw_prims. That was a good suggestion, Eric.
Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> On 04/08/2014 04:01 AM, Iago Toral Quiroga wrote: > This should help prevent situations where we render without proper index > bounds. For example: https://bugs.freedesktop.org/show_bug.cgi?id=59455 > --- > src/mesa/drivers/dri/i965/brw_draw.c | 24 ++++++++++---------- > src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c | 6 ++--- > src/mesa/tnl/t_context.c | 2 +- > src/mesa/tnl/t_draw.c | 34 > +++++++++------------------- > src/mesa/tnl/tnl.h | 9 -------- > 5 files changed, 27 insertions(+), 48 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_draw.c > b/src/mesa/drivers/dri/i965/brw_draw.c > index ef0f273..0c131be 100644 > --- a/src/mesa/drivers/dri/i965/brw_draw.c > +++ b/src/mesa/drivers/dri/i965/brw_draw.c > @@ -550,17 +550,6 @@ void brw_draw_prims( struct gl_context *ctx, > return; > } > > - /* If we're going to have to upload any of the user's vertex arrays, then > - * get the minimum and maximum of their index buffer so we know what range > - * to upload. > - */ > - if (!index_bounds_valid && > - (ctx->RenderMode != GL_RENDER || !vbo_all_varyings_in_vbos(arrays))) { > - perf_debug("Scanning index buffer to compute index buffer bounds. " > - "Use glDrawRangeElements() to avoid this.\n"); > - vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, > nr_prims); > - } > - > /* Do GL_SELECT and GL_FEEDBACK rendering using swrast, even though it > * won't support all the extensions we support. > */ > @@ -569,10 +558,21 @@ void brw_draw_prims( struct gl_context *ctx, > _mesa_lookup_enum_by_nr(ctx->RenderMode)); > _swsetup_Wakeup(ctx); > _tnl_wakeup(ctx); > - _tnl_draw_prims(ctx, arrays, prims, nr_prims, ib, min_index, > max_index); > + _tnl_draw_prims(ctx, prims, nr_prims, ib, > + index_bounds_valid, min_index, max_index, NULL, NULL); > return; > } > > + /* If we're going to have to upload any of the user's vertex arrays, then > + * get the minimum and maximum of their index buffer so we know what range > + * to upload. > + */ > + if (!index_bounds_valid && !vbo_all_varyings_in_vbos(arrays)) { > + perf_debug("Scanning index buffer to compute index buffer bounds. " > + "Use glDrawRangeElements() to avoid this.\n"); > + vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, > nr_prims); > + } > + > /* Try drawing with the hardware, but don't do anything else if we can't > * manage it. swrast doesn't support our featureset, so we can't fall > back > * to it. > diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c > b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c > index dff947a..c85acec 100644 > --- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c > +++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c > @@ -504,9 +504,9 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx, > tfb_vertcount, indirect); > > if (nctx->fallback == SWTNL) > - _tnl_vbo_draw_prims(ctx, prims, nr_prims, ib, > - index_bounds_valid, min_index, max_index, > - tfb_vertcount, indirect); > + _tnl_draw_prims(ctx, prims, nr_prims, ib, > + index_bounds_valid, min_index, max_index, > + tfb_vertcount, indirect); > } > > void > diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c > index 134f699..eb5bae4 100644 > --- a/src/mesa/tnl/t_context.c > +++ b/src/mesa/tnl/t_context.c > @@ -93,7 +93,7 @@ _tnl_CreateContext( struct gl_context *ctx ) > } > > /* plug in the VBO drawing function */ > - vbo_set_draw_func(ctx, _tnl_vbo_draw_prims); > + vbo_set_draw_func(ctx, _tnl_draw_prims); > > _math_init_transformation(); > _math_init_translate(); > diff --git a/src/mesa/tnl/t_draw.c b/src/mesa/tnl/t_draw.c > index 2755ae6..be3f059 100644 > --- a/src/mesa/tnl/t_draw.c > +++ b/src/mesa/tnl/t_draw.c > @@ -411,7 +411,11 @@ static void unmap_vbos( struct gl_context *ctx, > } > > > -void _tnl_vbo_draw_prims(struct gl_context *ctx, > +/* This is the main entrypoint into the slimmed-down software tnl > + * module. In a regular swtnl driver, this can be plugged straight > + * into the vbo->Driver.DrawPrims() callback. > + */ > +void _tnl_draw_prims(struct gl_context *ctx, > const struct _mesa_prim *prim, > GLuint nr_prims, > const struct _mesa_index_buffer *ib, > @@ -421,32 +425,16 @@ void _tnl_vbo_draw_prims(struct gl_context *ctx, > struct gl_transform_feedback_object *tfb_vertcount, > struct gl_buffer_object *indirect) > { > - const struct gl_client_array **arrays = ctx->Array._DrawArrays; > - > - if (!index_bounds_valid) > - vbo_get_minmax_indices(ctx, prim, ib, &min_index, &max_index, > nr_prims); > - > - _tnl_draw_prims(ctx, arrays, prim, nr_prims, ib, min_index, max_index); > -} > - > -/* This is the main entrypoint into the slimmed-down software tnl > - * module. In a regular swtnl driver, this can be plugged straight > - * into the vbo->Driver.DrawPrims() callback. > - */ > -void _tnl_draw_prims( struct gl_context *ctx, > - const struct gl_client_array *arrays[], > - const struct _mesa_prim *prim, > - GLuint nr_prims, > - const struct _mesa_index_buffer *ib, > - GLuint min_index, > - GLuint max_index) > -{ > TNLcontext *tnl = TNL_CONTEXT(ctx); > + const struct gl_client_array **arrays = ctx->Array._DrawArrays; > const GLuint TEST_SPLIT = 0; > const GLint max = TEST_SPLIT ? 8 : tnl->vb.Size - MAX_CLIPPED_VERTICES; > GLint max_basevertex = prim->basevertex; > GLuint i; > > + if (!index_bounds_valid) > + vbo_get_minmax_indices(ctx, prim, ib, &min_index, &max_index, > nr_prims); > + > /* Mesa core state should have been validated already */ > assert(ctx->NewState == 0x0); > > @@ -471,7 +459,7 @@ void _tnl_draw_prims( struct gl_context *ctx, > */ > vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib, > min_index, max_index, > - _tnl_vbo_draw_prims ); > + _tnl_draw_prims ); > return; > } > else if ((GLint)max_index + max_basevertex > max) { > @@ -489,7 +477,7 @@ void _tnl_draw_prims( struct gl_context *ctx, > */ > vbo_split_prims( ctx, arrays, prim, nr_prims, ib, > 0, max_index + prim->basevertex, > - _tnl_vbo_draw_prims, > + _tnl_draw_prims, > &limits ); > } > else { > diff --git a/src/mesa/tnl/tnl.h b/src/mesa/tnl/tnl.h > index 59a0ac3..8c59ff9 100644 > --- a/src/mesa/tnl/tnl.h > +++ b/src/mesa/tnl/tnl.h > @@ -77,15 +77,6 @@ struct _mesa_index_buffer; > > void > _tnl_draw_prims( struct gl_context *ctx, > - const struct gl_client_array *arrays[], > - const struct _mesa_prim *prim, > - GLuint nr_prims, > - const struct _mesa_index_buffer *ib, > - GLuint min_index, > - GLuint max_index); > - > -void > -_tnl_vbo_draw_prims( struct gl_context *ctx, > const struct _mesa_prim *prim, > GLuint nr_prims, > const struct _mesa_index_buffer *ib, > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev