Patches 1, 3, and 4 are Reviewed-by: Ian Romanick <ian.d.roman...@intel.com>
I sent a separate reply to patch 2. On 11/09/2013 01:02 AM, Chris Forbes wrote: > From: Christoph Bumiller <e0425...@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; > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev