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.
This commit is contained in:
Brian Paul 2012-05-25 09:44:53 -06:00
parent 151bf6e6cf
commit 185ed21058
15 changed files with 55 additions and 75 deletions

View file

@ -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_set_indexes(struct draw_context *draw,
const void *elements, unsigned elem_size)
{
draw->pt.user.elts = elements;
assert(elem_size == 0 ||
elem_size == 1 ||
elem_size == 2 ||
elem_size == 4);
draw->pt.user.elts = elements;
draw->pt.user.eltSize = elem_size;
}

View file

@ -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);

View file

@ -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) */

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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]) {

View file

@ -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);