[Mesa-dev] tnl: Merge _tnl_vbo_draw_prims() into _tnl_draw_prims().

Submitted by Iago Toral Quiroga on April 8, 2014, 11:01 a.m.

Details

Message ID 1396954880-10619-1-git-send-email-itoral@igalia.com
State Accepted
Commit 1a92637c68b84fa30e90f442e8a3d32c450cafcc
Headers show

Not browsing as part of any series.

Commit Message

Iago Toral Quiroga April 8, 2014, 11:01 a.m.
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(-)

Patch hide | download patch | download mbox

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,

Comments

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@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,
>
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(-)

Nice!

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>