void
cso_draw_vbo(struct cso_context *cso,
- const struct pipe_draw_info *info,
+ struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
- const struct pipe_draw_start_count_bias draw)
+ const struct pipe_draw_start_count_bias *draws,
+ unsigned num_draws)
{
/* We can't have both indirect drawing and SO-vertex-count drawing */
assert(!indirect ||
!indirect ||
indirect->count_from_stream_output == NULL);
- struct pipe_context *pipe = cso->pipe;
-
- if (cso->vbuf_current) {
- u_vbuf_draw_vbo(pipe, info, drawid_offset, indirect, &draw, 1);
- } else {
- pipe->draw_vbo(pipe, info, drawid_offset, indirect, &draw, 1);
- }
-}
+ /* Indirect only uses indirect->draw_count, not num_draws. */
+ assert(!indirect || num_draws == 1);
-/* info->draw_id can be changed by the callee if increment_draw_id is true. */
-void
-cso_multi_draw(struct cso_context *cso,
- struct pipe_draw_info *info,
- unsigned drawid_offset,
- const struct pipe_draw_start_count_bias *draws,
- unsigned num_draws)
-{
struct pipe_context *pipe = cso->pipe;
if (cso->vbuf_current) {
- u_vbuf_draw_vbo(pipe, info, drawid_offset, NULL, draws, num_draws);
+ u_vbuf_draw_vbo(pipe, info, drawid_offset, indirect, draws, num_draws);
} else {
- pipe->draw_vbo(pipe, info, drawid_offset, NULL, draws, num_draws);
+ pipe->draw_vbo(pipe, info, drawid_offset, indirect, draws, num_draws);
}
}
draw.count = count;
draw.index_bias = 0;
- cso_draw_vbo(cso, &info, 0, NULL, draw);
+ cso_draw_vbo(cso, &info, 0, NULL, &draw, 1);
}
draw.count = count;
draw.index_bias = 0;
- cso_draw_vbo(cso, &info, 0, NULL, draw);
+ cso_draw_vbo(cso, &info, 0, NULL, &draw, 1);
}
void
cso_draw_vbo(struct cso_context *cso,
- const struct pipe_draw_info *info,
+ struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
- const struct pipe_draw_start_count_bias draw);
-
-/* info->draw_id can be changed by the callee if increment_draw_id is true. */
-void
-cso_multi_draw(struct cso_context *cso,
- struct pipe_draw_info *info,
- unsigned drawid_offset,
- const struct pipe_draw_start_count_bias *draws,
- unsigned num_draws);
+ const struct pipe_draw_start_count_bias *draws,
+ unsigned num_draws);
void
cso_draw_arrays_instanced(struct cso_context *cso, uint mode,
if (!prepare_indexed_draw(st, ctx, info, draws, num_draws))
return;
- cso_multi_draw(st->cso_context, info, drawid_offset, draws, num_draws);
+ cso_draw_vbo(st->cso_context, info, drawid_offset, NULL, draws, num_draws);
}
static void
for (i = 0, first = 0; i <= num_draws; i++) {
if (i == num_draws || mode[i] != mode[first]) {
info->mode = mode[first];
- cso_multi_draw(cso, info, 0, &draws[first], i - first);
+ cso_draw_vbo(cso, info, 0, NULL, &draws[first], i - first);
first = i;
/* We can pass the reference only once. st_buffer_object keeps
if (!new_draws)
return;
for (unsigned i = 0; i < draw_count; i++)
- cso_draw_vbo(st->cso_context, &new_draws[i].info, i, NULL, new_draws[i].draw);
+ cso_draw_vbo(st->cso_context, &new_draws[i].info, i, NULL, &new_draws[i].draw, 1);
free(new_draws);
}
assert(!indirect_draw_count);
indirect.draw_count = 1;
for (i = 0; i < draw_count; i++) {
- cso_draw_vbo(st->cso_context, &info, i, &indirect, draw);
+ cso_draw_vbo(st->cso_context, &info, i, &indirect, &draw, 1);
indirect.offset += stride;
}
} else {
indirect_draw_count->buffer;
indirect.indirect_draw_count_offset = indirect_draw_count_offset;
}
- cso_draw_vbo(st->cso_context, &info, 0, &indirect, draw);
+ cso_draw_vbo(st->cso_context, &info, 0, &indirect, &draw, 1);
}
if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
if (indirect.count_from_stream_output == NULL)
return;
- cso_draw_vbo(st->cso_context, &info, 0, &indirect, draw);
+ cso_draw_vbo(st->cso_context, &info, 0, &indirect, &draw, 1);
}
static void
!st_draw_hw_select_prepare_mode(ctx, info))
return;
- cso_multi_draw(st->cso_context, info, drawid_offset, draws, num_draws);
+ cso_draw_vbo(st->cso_context, info, drawid_offset, NULL, draws, num_draws);
}
static void
info->mode = mode[first];
if (st_draw_hw_select_prepare_mode(ctx, info))
- cso_multi_draw(cso, info, 0, &draws[first], i - first);
+ cso_draw_vbo(cso, info, 0, NULL, &draws[first], i - first);
first = i;