[Mesa-dev] [PATCH] tnl: Merge _tnl_vbo_draw_prims() into _tnl_draw_prims().
Ian Romanick
idr at freedesktop.org
Tue Apr 8 07:46:48 PDT 2014
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.romanick at 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,
>
More information about the mesa-dev
mailing list