From 185ed2105829d6f5eb19edb9abbf0d7977e157c3 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 25 May 2012 09:44:53 -0600 Subject: [PATCH] draw: simplify index buffer specification Replace draw_set_index_buffer() and draw_set_mapped_index_buffer() with draw_set_indexes() which simply takes a pointer and an index size. --- src/gallium/auxiliary/draw/draw_context.c | 30 +++++++++---------- src/gallium/auxiliary/draw/draw_context.h | 7 ++--- src/gallium/auxiliary/draw/draw_private.h | 2 -- src/gallium/auxiliary/draw/draw_pt.c | 22 ++++---------- .../auxiliary/draw/draw_pt_vsplit_tmp.h | 6 ++-- src/gallium/drivers/i915/i915_context.c | 6 ++-- src/gallium/drivers/i915/i915_state.c | 3 -- src/gallium/drivers/llvmpipe/lp_draw_arrays.c | 8 +++-- .../drivers/llvmpipe/lp_state_vertex.c | 2 -- src/gallium/drivers/nv30/nv30_draw.c | 7 +++-- src/gallium/drivers/r300/r300_state.c | 12 ++++---- src/gallium/drivers/softpipe/sp_draw_arrays.c | 7 +++-- .../drivers/softpipe/sp_state_vertex.c | 2 -- src/gallium/drivers/svga/svga_swtnl_draw.c | 9 +++--- src/mesa/state_tracker/st_draw_feedback.c | 9 +++--- 15 files changed, 56 insertions(+), 76 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index ad49ce733ac..2eae204ff2c 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -627,25 +627,23 @@ void draw_set_render( struct draw_context *draw, } -void -draw_set_index_buffer(struct draw_context *draw, - const struct pipe_index_buffer *ib) -{ - if (ib) - memcpy(&draw->pt.index_buffer, ib, sizeof(draw->pt.index_buffer)); - else - memset(&draw->pt.index_buffer, 0, sizeof(draw->pt.index_buffer)); -} - - /** - * Tell drawing context where to find mapped index/element buffer. + * Tell the draw module where vertex indexes/elements are located, and + * their size (in bytes). + * + * Note: the caller must apply the pipe_index_buffer::offset value to + * the address. The draw module doesn't do that. */ void -draw_set_mapped_index_buffer(struct draw_context *draw, - const void *elements) -{ - draw->pt.user.elts = elements; +draw_set_indexes(struct draw_context *draw, + const void *elements, unsigned elem_size) +{ + assert(elem_size == 0 || + elem_size == 1 || + elem_size == 2 || + elem_size == 4); + draw->pt.user.elts = elements; + draw->pt.user.eltSize = elem_size; } diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h index f3a3f232322..4cd0caf3296 100644 --- a/src/gallium/auxiliary/draw/draw_context.h +++ b/src/gallium/auxiliary/draw/draw_context.h @@ -208,11 +208,8 @@ void draw_set_vertex_elements(struct draw_context *draw, unsigned count, const struct pipe_vertex_element *elements); -void draw_set_index_buffer(struct draw_context *draw, - const struct pipe_index_buffer *ib); - -void draw_set_mapped_index_buffer(struct draw_context *draw, - const void *elements); +void draw_set_indexes(struct draw_context *draw, + const void *elements, unsigned elem_size); void draw_set_mapped_vertex_buffer(struct draw_context *draw, unsigned attr, const void *buffer); diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h index 9e6380341da..d85deeea7f5 100644 --- a/src/gallium/auxiliary/draw/draw_private.h +++ b/src/gallium/auxiliary/draw/draw_private.h @@ -169,8 +169,6 @@ struct draw_context struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS]; unsigned nr_vertex_elements; - struct pipe_index_buffer index_buffer; - /* user-space vertex data, buffers */ struct { /** vertex element/index buffer (ex: glDrawElements) */ diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c index 2c4edc0f946..5b6eaa739d0 100644 --- a/src/gallium/auxiliary/draw/draw_pt.c +++ b/src/gallium/auxiliary/draw/draw_pt.c @@ -232,28 +232,24 @@ draw_print_arrays(struct draw_context *draw, uint prim, int start, uint count) uint j; if (draw->pt.user.eltSize) { - const char *elts; - /* indexed arrays */ - elts = (const char *) draw->pt.user.elts; - elts += draw->pt.index_buffer.offset; switch (draw->pt.user.eltSize) { case 1: { - const ubyte *elem = (const ubyte *) elts; + const ubyte *elem = (const ubyte *) draw->pt.user.elts; ii = elem[start + i]; } break; case 2: { - const ushort *elem = (const ushort *) elts; + const ushort *elem = (const ushort *) draw->pt.user.elts; ii = elem[start + i]; } break; case 4: { - const uint *elem = (const uint *) elts; + const uint *elem = (const uint *) draw->pt.user.elts; ii = elem[start + i]; } break; @@ -368,28 +364,25 @@ draw_pt_arrays_restart(struct draw_context *draw, if (draw->pt.user.elts) { /* indexed prims (draw_elements) */ - const char *elts = - (const char *) draw->pt.user.elts + draw->pt.index_buffer.offset; - cur_start = start; cur_count = 0; switch (draw->pt.user.eltSize) { case 1: { - const ubyte *elt_ub = (const ubyte *) elts; + const ubyte *elt_ub = (const ubyte *) draw->pt.user.elts; PRIM_RESTART_LOOP(elt_ub); } break; case 2: { - const ushort *elt_us = (const ushort *) elts; + const ushort *elt_us = (const ushort *) draw->pt.user.elts; PRIM_RESTART_LOOP(elt_us); } break; case 4: { - const uint *elt_ui = (const uint *) elts; + const uint *elt_ui = (const uint *) draw->pt.user.elts; PRIM_RESTART_LOOP(elt_ui); } break; @@ -469,9 +462,6 @@ draw_vbo(struct draw_context *draw, if (info->indexed) assert(draw->pt.user.elts); - draw->pt.user.eltSize = - (info->indexed) ? draw->pt.index_buffer.index_size : 0; - draw->pt.user.eltBias = info->index_bias; draw->pt.user.min_index = info->min_index; draw->pt.user.max_index = info->max_index; diff --git a/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h b/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h index bb3cbf80ad7..98a4668efb7 100644 --- a/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h +++ b/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h @@ -38,8 +38,7 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit, unsigned istart, unsigned icount) { struct draw_context *draw = vsplit->draw; - const ELT_TYPE *ib = (const ELT_TYPE *) - ((const char *) draw->pt.user.elts + draw->pt.index_buffer.offset); + const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts; const unsigned min_index = draw->pt.user.min_index; const unsigned max_index = draw->pt.user.max_index; const int elt_bias = draw->pt.user.eltBias; @@ -128,8 +127,7 @@ CONCAT(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit, boolean close, unsigned iclose) { struct draw_context *draw = vsplit->draw; - const ELT_TYPE *ib = (const ELT_TYPE *) - ((const char *) draw->pt.user.elts + draw->pt.index_buffer.offset); + const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts; const int ibias = draw->pt.user.eltBias; unsigned i; diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c index f3c7b30527c..988d6591519 100644 --- a/src/gallium/drivers/i915/i915_context.c +++ b/src/gallium/drivers/i915/i915_context.c @@ -71,8 +71,10 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) mapped_indices = i915->index_buffer.user_buffer; if (!mapped_indices) mapped_indices = i915_buffer(i915->index_buffer.buffer)->data; + draw_set_indexes(draw, + (ubyte *) mapped_indices + i915->index_buffer.offset, + i915->index_buffer.index_size); } - draw_set_mapped_index_buffer(draw, mapped_indices); if (i915->constants[PIPE_SHADER_VERTEX]) draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, @@ -91,7 +93,7 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) draw_vbo(i915->draw, info); if (mapped_indices) - draw_set_mapped_index_buffer(draw, NULL); + draw_set_indexes(draw, NULL, 0); if (i915->num_vertex_sampler_views > 0) i915_cleanup_vertex_sampling(i915); diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c index 1ff53884ada..f4b5d6f37b7 100644 --- a/src/gallium/drivers/i915/i915_state.c +++ b/src/gallium/drivers/i915/i915_state.c @@ -1048,9 +1048,6 @@ static void i915_set_index_buffer(struct pipe_context *pipe, memcpy(&i915->index_buffer, ib, sizeof(i915->index_buffer)); else memset(&i915->index_buffer, 0, sizeof(i915->index_buffer)); - - /* pass-through to draw module */ - draw_set_index_buffer(i915->draw, ib); } static void diff --git a/src/gallium/drivers/llvmpipe/lp_draw_arrays.c b/src/gallium/drivers/llvmpipe/lp_draw_arrays.c index 225b80e3dfb..96259d7144f 100644 --- a/src/gallium/drivers/llvmpipe/lp_draw_arrays.c +++ b/src/gallium/drivers/llvmpipe/lp_draw_arrays.c @@ -78,9 +78,11 @@ llvmpipe_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) mapped_indices = lp->index_buffer.user_buffer; if (!mapped_indices) mapped_indices = llvmpipe_resource_data(lp->index_buffer.buffer); - } - draw_set_mapped_index_buffer(draw, mapped_indices); + draw_set_indexes(draw, + (ubyte *) mapped_indices + lp->index_buffer.offset, + lp->index_buffer.index_size); + } llvmpipe_prepare_vertex_sampling(lp, lp->num_vertex_sampler_views, @@ -96,7 +98,7 @@ llvmpipe_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) draw_set_mapped_vertex_buffer(draw, i, NULL); } if (mapped_indices) { - draw_set_mapped_index_buffer(draw, NULL); + draw_set_indexes(draw, NULL, 0); } llvmpipe_cleanup_vertex_sampling(lp); diff --git a/src/gallium/drivers/llvmpipe/lp_state_vertex.c b/src/gallium/drivers/llvmpipe/lp_state_vertex.c index a62cfd55334..4a74cd7c9d4 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_vertex.c +++ b/src/gallium/drivers/llvmpipe/lp_state_vertex.c @@ -102,8 +102,6 @@ llvmpipe_set_index_buffer(struct pipe_context *pipe, memcpy(&llvmpipe->index_buffer, ib, sizeof(llvmpipe->index_buffer)); else memset(&llvmpipe->index_buffer, 0, sizeof(llvmpipe->index_buffer)); - - draw_set_index_buffer(llvmpipe->draw, ib); } void diff --git a/src/gallium/drivers/nv30/nv30_draw.c b/src/gallium/drivers/nv30/nv30_draw.c index 29e63953838..46e85362815 100644 --- a/src/gallium/drivers/nv30/nv30_draw.c +++ b/src/gallium/drivers/nv30/nv30_draw.c @@ -417,10 +417,11 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) pipe_buffer_map(pipe, nv30->idxbuf.buffer, PIPE_TRANSFER_UNSYNCHRONIZED | PIPE_TRANSFER_READ, &transferi); - draw_set_index_buffer(draw, &nv30->idxbuf); - draw_set_mapped_index_buffer(draw, map); + draw_set_indexes(draw, + (ubyte *) map + nv30->idxbuf.offset, + nv30->idxbuf.index_size); } else { - draw_set_mapped_index_buffer(draw, NULL); + draw_set_indexes(draw, NULL, 0); } draw_vbo(draw, info); diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index e025c2fcd1e..6f9feb10564 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -1649,16 +1649,16 @@ static void r300_set_index_buffer_swtcl(struct pipe_context* pipe, { struct r300_context* r300 = r300_context(pipe); - draw_set_index_buffer(r300->draw, ib); - if (ib) { + const void *buf = NULL; if (ib->user_buffer) { - draw_set_mapped_index_buffer(r300->draw, - ib->user_buffer); + buf = ib->user_buffer; } else if (ib->buffer) { - draw_set_mapped_index_buffer(r300->draw, - r300_resource(ib->buffer)->malloced_buffer); + buf = r300_resource(ib->buffer)->malloced_buffer; } + draw_set_indexes(r300->draw, + (const ubyte *) buf + ib->offset, + ib->index_size); } } diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c b/src/gallium/drivers/softpipe/sp_draw_arrays.c index 7a2274565d5..f9fc923a184 100644 --- a/src/gallium/drivers/softpipe/sp_draw_arrays.c +++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c @@ -88,9 +88,12 @@ softpipe_draw_vbo(struct pipe_context *pipe, mapped_indices = sp->index_buffer.user_buffer; if (!mapped_indices) mapped_indices = softpipe_resource(sp->index_buffer.buffer)->data; + + draw_set_indexes(draw, + (ubyte *) mapped_indices + sp->index_buffer.offset, + sp->index_buffer.index_size); } - draw_set_mapped_index_buffer(draw, mapped_indices); for (i = 0; i < sp->num_so_targets; i++) { void *buf = softpipe_resource(sp->so_targets[i]->target.buffer)->data; @@ -108,7 +111,7 @@ softpipe_draw_vbo(struct pipe_context *pipe, draw_set_mapped_vertex_buffer(draw, i, NULL); } if (mapped_indices) { - draw_set_mapped_index_buffer(draw, NULL); + draw_set_indexes(draw, NULL, 0); } draw_set_mapped_so_targets(draw, 0, NULL); diff --git a/src/gallium/drivers/softpipe/sp_state_vertex.c b/src/gallium/drivers/softpipe/sp_state_vertex.c index 1dbd79807d0..95acecd3be4 100644 --- a/src/gallium/drivers/softpipe/sp_state_vertex.c +++ b/src/gallium/drivers/softpipe/sp_state_vertex.c @@ -106,8 +106,6 @@ softpipe_set_index_buffer(struct pipe_context *pipe, memcpy(&softpipe->index_buffer, ib, sizeof(softpipe->index_buffer)); else memset(&softpipe->index_buffer, 0, sizeof(softpipe->index_buffer)); - - draw_set_index_buffer(softpipe->draw, ib); } diff --git a/src/gallium/drivers/svga/svga_swtnl_draw.c b/src/gallium/drivers/svga/svga_swtnl_draw.c index bb6870f6572..212f11a8230 100644 --- a/src/gallium/drivers/svga/svga_swtnl_draw.c +++ b/src/gallium/drivers/svga/svga_swtnl_draw.c @@ -76,17 +76,16 @@ svga_swtnl_draw_vbo(struct svga_context *svga, } } - /* TODO move this to update_swtnl_draw */ - draw_set_index_buffer(draw, &svga->curr.ib); - /* Map index buffer, if present */ map = NULL; if (info->indexed && svga->curr.ib.buffer) { map = pipe_buffer_map(&svga->pipe, svga->curr.ib.buffer, PIPE_TRANSFER_READ, &ib_transfer); + draw_set_indexes(draw, + (const ubyte *) map + svga->curr.ib.offset, + svga->curr.ib.index_size); } - draw_set_mapped_index_buffer(draw, map); if (svga->curr.cb[PIPE_SHADER_VERTEX]) { map = pipe_buffer_map(&svga->pipe, @@ -119,7 +118,7 @@ svga_swtnl_draw_vbo(struct svga_context *svga, if (ib_transfer) { pipe_buffer_unmap(&svga->pipe, ib_transfer); - draw_set_mapped_index_buffer(draw, NULL); + draw_set_indexes(draw, NULL, 0); } if (svga->curr.cb[PIPE_SHADER_VERTEX]) { diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c index 4209fb214f8..820918e51e3 100644 --- a/src/mesa/state_tracker/st_draw_feedback.c +++ b/src/mesa/state_tracker/st_draw_feedback.c @@ -232,8 +232,9 @@ st_feedback_draw_vbo(struct gl_context *ctx, mapped_indices = ib->ptr; } - draw_set_index_buffer(draw, &ibuffer); - draw_set_mapped_index_buffer(draw, mapped_indices); + draw_set_indexes(draw, + (ubyte *) mapped_indices + ibuffer.offset, + ibuffer.index_size); } /* set the constant buffer */ @@ -252,9 +253,7 @@ st_feedback_draw_vbo(struct gl_context *ctx, * unmap vertex/index buffers */ if (ib) { - draw_set_mapped_index_buffer(draw, NULL); - draw_set_index_buffer(draw, NULL); - + draw_set_indexes(draw, NULL, 0); if (ib_transfer) pipe_buffer_unmap(pipe, ib_transfer); pipe_resource_reference(&ibuffer.buffer, NULL); -- 2.30.2