From 1a92637c68b84fa30e90f442e8a3d32c450cafcc Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Tue, 8 Apr 2014 13:01:20 +0200 Subject: [PATCH] tnl: Merge _tnl_vbo_draw_prims() into _tnl_draw_prims(). This should help prevent situations where we render without proper index bounds. For example: https://bugs.freedesktop.org/show_bug.cgi?id=59455 Reviewed-by: Ian Romanick Reviewed-by: Kenneth Graunke Reviewed-by: Eric Anholt --- 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 ef0f2737ca1..0c131be806a 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 dff947aa028..c85acec1268 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 134f699be5f..eb5bae41da2 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 2755ae62d49..be3f059bb56 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, @@ -420,33 +424,17 @@ void _tnl_vbo_draw_prims(struct gl_context *ctx, GLuint max_index, 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 59a0ac38084..8c59ff9e58f 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, -- 2.30.2