[Mesa-dev] [PATCH V3 01/13] mesa: add indirect drawing buffer parameter to draw functions

Ian Romanick idr at freedesktop.org
Tue Nov 19 11:28:11 PST 2013


Patches 1, 3, and 4 are

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

I sent a separate reply to patch 2.

On 11/09/2013 01:02 AM, Chris Forbes wrote:
> From: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
> 
> Split from patch implementing ARB_draw_indirect.
> 
> v2: Const-qualify the struct gl_buffer_object *indirect argument.
> v3: Fix up some more draw calls for new argument.
> v4: Fix up rebase conflicts in i965.
> v5: Undo const-qualification
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c              |  3 ++-
>  src/mesa/drivers/dri/i965/brw_draw.h              |  3 ++-
>  src/mesa/drivers/dri/i965/brw_primitive_restart.c |  2 +-
>  src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c      | 13 ++++++++-----
>  src/mesa/state_tracker/st_cb_rasterpos.c          |  2 +-
>  src/mesa/state_tracker/st_draw.c                  |  3 ++-
>  src/mesa/state_tracker/st_draw.h                  |  6 ++++--
>  src/mesa/state_tracker/st_draw_feedback.c         |  3 ++-
>  src/mesa/tnl/t_draw.c                             |  3 ++-
>  src/mesa/tnl/tnl.h                                |  3 ++-
>  src/mesa/vbo/vbo.h                                |  5 ++++-
>  src/mesa/vbo/vbo_exec_array.c                     |  8 ++++----
>  src/mesa/vbo/vbo_exec_draw.c                      |  2 +-
>  src/mesa/vbo/vbo_primitive_restart.c              |  4 ++--
>  src/mesa/vbo/vbo_rebase.c                         |  2 +-
>  src/mesa/vbo/vbo_save_draw.c                      |  2 +-
>  src/mesa/vbo/vbo_split_copy.c                     |  2 +-
>  src/mesa/vbo/vbo_split_inplace.c                  |  2 +-
>  18 files changed, 41 insertions(+), 27 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
> index 7b33b76..0893b6d 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -463,7 +463,8 @@ void brw_draw_prims( struct gl_context *ctx,
>  		     GLboolean index_bounds_valid,
>  		     GLuint min_index,
>  		     GLuint max_index,
> -		     struct gl_transform_feedback_object *unused_tfb_object)
> +		     struct gl_transform_feedback_object *unused_tfb_object,
> +		     struct gl_buffer_object *indirect )
>  {
>     struct brw_context *brw = brw_context(ctx);
>     const struct gl_client_array **arrays = ctx->Array._DrawArrays;
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.h b/src/mesa/drivers/dri/i965/brw_draw.h
> index fb96813..119d6f1 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.h
> +++ b/src/mesa/drivers/dri/i965/brw_draw.h
> @@ -41,7 +41,8 @@ void brw_draw_prims( struct gl_context *ctx,
>  		     GLboolean index_bounds_valid,
>  		     GLuint min_index,
>  		     GLuint max_index,
> -		     struct gl_transform_feedback_object *unused_tfb_object);
> +		     struct gl_transform_feedback_object *unused_tfb_object,
> +		     struct gl_buffer_object *indirect );
>  
>  void brw_draw_init( struct brw_context *brw );
>  void brw_draw_destroy( struct brw_context *brw );
> diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c b/src/mesa/drivers/dri/i965/brw_primitive_restart.c
> index 2ee6055..a131151 100644
> --- a/src/mesa/drivers/dri/i965/brw_primitive_restart.c
> +++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c
> @@ -169,7 +169,7 @@ brw_handle_primitive_restart(struct gl_context *ctx,
>        /* Cut index should work for primitive restart, so use it
>         */
>        brw->prim_restart.enable_cut_index = true;
> -      brw_draw_prims(ctx, prims, nr_prims, ib, GL_FALSE, -1, -1, NULL);
> +      brw_draw_prims(ctx, prims, nr_prims, ib, GL_FALSE, -1, -1, NULL, NULL);
>        brw->prim_restart.enable_cut_index = false;
>     } else {
>        /* Not all the primitive draw modes are supported by the cut index,
> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
> index 436db32..dff947a 100644
> --- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
> +++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
> @@ -222,7 +222,8 @@ TAG(vbo_render_prims)(struct gl_context *ctx,
>  		      const struct _mesa_index_buffer *ib,
>  		      GLboolean index_bounds_valid,
>  		      GLuint min_index, GLuint max_index,
> -		      struct gl_transform_feedback_object *tfb_vertcount);
> +		      struct gl_transform_feedback_object *tfb_vertcount,
> +		      struct gl_buffer_object *indirect);
>  
>  static GLboolean
>  vbo_maybe_split(struct gl_context *ctx, const struct gl_client_array **arrays,
> @@ -453,7 +454,8 @@ TAG(vbo_render_prims)(struct gl_context *ctx,
>  		      const struct _mesa_index_buffer *ib,
>  		      GLboolean index_bounds_valid,
>  		      GLuint min_index, GLuint max_index,
> -		      struct gl_transform_feedback_object *tfb_vertcount)
> +		      struct gl_transform_feedback_object *tfb_vertcount,
> +		      struct gl_buffer_object *indirect)
>  {
>  	struct nouveau_render_state *render = to_render_state(ctx);
>  	const struct gl_client_array **arrays = ctx->Array._DrawArrays;
> @@ -489,7 +491,8 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx,
>  			    const struct _mesa_index_buffer *ib,
>  			    GLboolean index_bounds_valid,
>  			    GLuint min_index, GLuint max_index,
> -			    struct gl_transform_feedback_object *tfb_vertcount)
> +			    struct gl_transform_feedback_object *tfb_vertcount,
> +			    struct gl_buffer_object *indirect)
>  {
>  	struct nouveau_context *nctx = to_nouveau_context(ctx);
>  
> @@ -498,12 +501,12 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx,
>  	if (nctx->fallback == HWTNL)
>  		TAG(vbo_render_prims)(ctx, prims, nr_prims, ib,
>  				      index_bounds_valid, min_index, max_index,
> -				      tfb_vertcount);
> +				      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);
> +				    tfb_vertcount, indirect);
>  }
>  
>  void
> diff --git a/src/mesa/state_tracker/st_cb_rasterpos.c b/src/mesa/state_tracker/st_cb_rasterpos.c
> index 26a5590..420dc5f 100644
> --- a/src/mesa/state_tracker/st_cb_rasterpos.c
> +++ b/src/mesa/state_tracker/st_cb_rasterpos.c
> @@ -254,7 +254,7 @@ st_RasterPos(struct gl_context *ctx, const GLfloat v[4])
>      * st_feedback_draw_vbo doesn't check for that flag. */
>     ctx->Array._DrawArrays = rs->arrays;
>     st_feedback_draw_vbo(ctx, &rs->prim, 1, NULL, GL_TRUE, 0, 1,
> -                        NULL);
> +                        NULL, NULL);
>     ctx->Array._DrawArrays = saved_arrays;
>  
>     /* restore draw's rasterization stage depending on rendermode */
> diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
> index 51bb238..ef0a607 100644
> --- a/src/mesa/state_tracker/st_draw.c
> +++ b/src/mesa/state_tracker/st_draw.c
> @@ -195,7 +195,8 @@ st_draw_vbo(struct gl_context *ctx,
>  	    GLboolean index_bounds_valid,
>              GLuint min_index,
>              GLuint max_index,
> -            struct gl_transform_feedback_object *tfb_vertcount)
> +            struct gl_transform_feedback_object *tfb_vertcount,
> +            struct gl_buffer_object *indirect)
>  {
>     struct st_context *st = st_context(ctx);
>     struct pipe_index_buffer ibuffer = {0};
> diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h
> index 394473b..9c4d6cb 100644
> --- a/src/mesa/state_tracker/st_draw.h
> +++ b/src/mesa/state_tracker/st_draw.h
> @@ -55,7 +55,8 @@ st_draw_vbo(struct gl_context *ctx,
>  	    GLboolean index_bounds_valid,
>              GLuint min_index,
>              GLuint max_index,
> -            struct gl_transform_feedback_object *tfb_vertcount);
> +            struct gl_transform_feedback_object *tfb_vertcount,
> +            struct gl_buffer_object *indirect);
>  
>  extern void
>  st_feedback_draw_vbo(struct gl_context *ctx,
> @@ -65,7 +66,8 @@ st_feedback_draw_vbo(struct gl_context *ctx,
>  		     GLboolean index_bounds_valid,
>                       GLuint min_index,
>                       GLuint max_index,
> -                     struct gl_transform_feedback_object *tfb_vertcount);
> +                     struct gl_transform_feedback_object *tfb_vertcount,
> +                     struct gl_buffer_object *indirect);
>  
>  /**
>   * When drawing with VBOs, the addresses specified with
> diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c
> index 1ac9585..f556644 100644
> --- a/src/mesa/state_tracker/st_draw_feedback.c
> +++ b/src/mesa/state_tracker/st_draw_feedback.c
> @@ -116,7 +116,8 @@ st_feedback_draw_vbo(struct gl_context *ctx,
>  		     GLboolean index_bounds_valid,
>                       GLuint min_index,
>                       GLuint max_index,
> -                     struct gl_transform_feedback_object *tfb_vertcount)
> +                     struct gl_transform_feedback_object *tfb_vertcount,
> +                     struct gl_buffer_object *indirect)
>  {
>     struct st_context *st = st_context(ctx);
>     struct pipe_context *pipe = st->pipe;
> diff --git a/src/mesa/tnl/t_draw.c b/src/mesa/tnl/t_draw.c
> index 637ac6f..d6b0900 100644
> --- a/src/mesa/tnl/t_draw.c
> +++ b/src/mesa/tnl/t_draw.c
> @@ -415,7 +415,8 @@ void _tnl_vbo_draw_prims(struct gl_context *ctx,
>  			 GLboolean index_bounds_valid,
>  			 GLuint min_index,
>  			 GLuint max_index,
> -			 struct gl_transform_feedback_object *tfb_vertcount)
> +			 struct gl_transform_feedback_object *tfb_vertcount,
> +			 struct gl_buffer_object *indirect)
>  {
>     const struct gl_client_array **arrays = ctx->Array._DrawArrays;
>  
> diff --git a/src/mesa/tnl/tnl.h b/src/mesa/tnl/tnl.h
> index 162b7ab..86ef505 100644
> --- a/src/mesa/tnl/tnl.h
> +++ b/src/mesa/tnl/tnl.h
> @@ -92,7 +92,8 @@ _tnl_vbo_draw_prims( struct gl_context *ctx,
>  		     GLboolean index_bounds_valid,
>  		     GLuint min_index,
>  		     GLuint max_index,
> -		     struct gl_transform_feedback_object *tfb_vertcount );
> +		     struct gl_transform_feedback_object *tfb_vertcount,
> +		     struct gl_buffer_object *indirect );
>  
>  extern void
>  _tnl_RasterPos(struct gl_context *ctx, const GLfloat vObj[4]);
> diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h
> index c4472e9..e1914c8 100644
> --- a/src/mesa/vbo/vbo.h
> +++ b/src/mesa/vbo/vbo.h
> @@ -53,6 +53,8 @@ struct _mesa_prim {
>     GLint basevertex;
>     GLuint num_instances;
>     GLuint base_instance;
> +
> +   GLsizeiptr indirect_offset;
>  };
>  
>  /* Would like to call this a "vbo_index_buffer", but this would be
> @@ -89,7 +91,8 @@ typedef void (*vbo_draw_func)( struct gl_context *ctx,
>  			       GLboolean index_bounds_valid,
>  			       GLuint min_index,
>  			       GLuint max_index,
> -			       struct gl_transform_feedback_object *tfb_vertcount );
> +			       struct gl_transform_feedback_object *tfb_vertcount,
> +			       struct gl_buffer_object *indirect );
>  
>  
>  
> diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
> index d723823..a2c0c7d 100644
> --- a/src/mesa/vbo/vbo_exec_array.c
> +++ b/src/mesa/vbo/vbo_exec_array.c
> @@ -583,7 +583,7 @@ vbo_handle_primitive_restart(struct gl_context *ctx,
>     } else {
>        /* Call driver directly for draw_prims */
>        vbo->draw_prims(ctx, prim, nr_prims, ib,
> -                      index_bounds_valid, min_index, max_index, NULL);
> +                      index_bounds_valid, min_index, max_index, NULL, NULL);
>     }
>  }
>  
> @@ -648,7 +648,7 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
>           /* 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);
> +                         GL_TRUE, start, start + count - 1, NULL, NULL);
>        }
>     }
>     else {
> @@ -659,7 +659,7 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
>        check_buffers_are_unmapped(exec->array.inputs);
>        vbo->draw_prims(ctx, prim, 1, NULL,
>                        GL_TRUE, start, start + count - 1,
> -                      NULL);
> +                      NULL, NULL);
>     }
>  
>     if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
> @@ -1490,7 +1490,7 @@ vbo_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
>  
>     check_buffers_are_unmapped(exec->array.inputs);
>     vbo->draw_prims(ctx, prim, 1, NULL,
> -                   GL_TRUE, 0, 0, obj);
> +                   GL_TRUE, 0, 0, obj, NULL);
>  
>     if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
>        _mesa_flush(ctx);
> diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
> index 1075bd5..a96502f 100644
> --- a/src/mesa/vbo/vbo_exec_draw.c
> +++ b/src/mesa/vbo/vbo_exec_draw.c
> @@ -403,7 +403,7 @@ vbo_exec_vtx_flush(struct vbo_exec_context *exec, GLboolean keepUnmapped)
>  				       GL_TRUE,
>  				       0,
>  				       exec->vtx.vert_count - 1,
> -				       NULL);
> +				       NULL, NULL);
>  
>  	 /* If using a real VBO, get new storage -- unless asked not to.
>            */
> diff --git a/src/mesa/vbo/vbo_primitive_restart.c b/src/mesa/vbo/vbo_primitive_restart.c
> index 418f882..e5c93ac 100644
> --- a/src/mesa/vbo/vbo_primitive_restart.c
> +++ b/src/mesa/vbo/vbo_primitive_restart.c
> @@ -214,11 +214,11 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
>                  (temp_prim.count == sub_prim->count)) {
>                 draw_prims_func(ctx, &temp_prim, 1, ib,
>                                 GL_TRUE, sub_prim->min_index, sub_prim->max_index,
> -                               NULL);
> +                               NULL, NULL);
>              } else {
>                 draw_prims_func(ctx, &temp_prim, 1, ib,
>                                 GL_FALSE, -1, -1,
> -                               NULL);
> +                               NULL, NULL);
>              }
>           }
>           if (sub_end_index >= end_index) {
> diff --git a/src/mesa/vbo/vbo_rebase.c b/src/mesa/vbo/vbo_rebase.c
> index e825872..f63c473 100644
> --- a/src/mesa/vbo/vbo_rebase.c
> +++ b/src/mesa/vbo/vbo_rebase.c
> @@ -237,7 +237,7 @@ void vbo_rebase_prims( struct gl_context *ctx,
>  	 GL_TRUE,
>  	 0, 
>  	 max_index - min_index,
> -	 NULL );
> +	 NULL, NULL );
>  
>     ctx->Array._DrawArrays = saved_arrays;
>     ctx->NewDriverState |= ctx->DriverFlags.NewArray;
> diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c
> index b4c9176..e961c1d 100644
> --- a/src/mesa/vbo/vbo_save_draw.c
> +++ b/src/mesa/vbo/vbo_save_draw.c
> @@ -313,7 +313,7 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
>                                        GL_TRUE,
>                                        0,    /* Node is a VBO, so this is ok */
>                                        node->count - 1,
> -                                      NULL);
> +                                      NULL, NULL);
>        }
>     }
>  
> diff --git a/src/mesa/vbo/vbo_split_copy.c b/src/mesa/vbo/vbo_split_copy.c
> index 2175c8a..9e391a3 100644
> --- a/src/mesa/vbo/vbo_split_copy.c
> +++ b/src/mesa/vbo/vbo_split_copy.c
> @@ -201,7 +201,7 @@ flush( struct copy_context *copy )
>  	       GL_TRUE,
>  	       0,
>  	       copy->dstbuf_nr - 1,
> -	       NULL );
> +	       NULL, NULL );
>  
>     ctx->Array._DrawArrays = saved_arrays;
>     ctx->NewDriverState |= ctx->DriverFlags.NewArray;
> diff --git a/src/mesa/vbo/vbo_split_inplace.c b/src/mesa/vbo/vbo_split_inplace.c
> index d044297..de00fc8 100644
> --- a/src/mesa/vbo/vbo_split_inplace.c
> +++ b/src/mesa/vbo/vbo_split_inplace.c
> @@ -94,7 +94,7 @@ static void flush_vertex( struct split_context *split )
>  	       !split->ib,
>  	       split->min_index,
>  	       split->max_index,
> -	       NULL);
> +	       NULL, NULL);
>  
>     ctx->Array._DrawArrays = saved_arrays;
>     ctx->NewDriverState |= ctx->DriverFlags.NewArray;
> 



More information about the mesa-dev mailing list