gallium: split drawid out of pipe_draw_info and as a separate draw_vbo param

the only case in which this is nonzero is if a multidraw gets split by the frontend,
i.e., mesa core, and in all other cases it can be ignored. the value can also be ignored
for all indirect draws, though it seems many (most?) gallium drivers are not aware of this

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10166>
This commit is contained in:
Mike Blumenkrantz 2021-04-11 13:35:38 -04:00 committed by Marge Bot
parent 7ed8e5db3a
commit dae3113c3d
84 changed files with 257 additions and 156 deletions

View File

@ -1402,6 +1402,7 @@ cso_restore_state(struct cso_context *cso)
void
cso_draw_vbo(struct cso_context *cso,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias draw)
{
@ -1418,10 +1419,10 @@ cso_draw_vbo(struct cso_context *cso,
indirect->count_from_stream_output == NULL);
if (vbuf) {
u_vbuf_draw_vbo(vbuf, info, indirect, draw);
u_vbuf_draw_vbo(vbuf, info, drawid_offset, indirect, draw);
} else {
struct pipe_context *pipe = cso->pipe;
pipe->draw_vbo(pipe, info, indirect, &draw, 1);
pipe->draw_vbo(pipe, info, drawid_offset, indirect, &draw, 1);
}
}
@ -1429,6 +1430,7 @@ cso_draw_vbo(struct cso_context *cso,
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)
{
@ -1441,16 +1443,17 @@ cso_multi_draw(struct cso_context *cso,
if (num_draws > 1 && info->take_index_buffer_ownership)
p_atomic_add(&info->index.resource->reference.count, num_draws - 1);
unsigned drawid = drawid_offset;
for (unsigned i = 0; i < num_draws; i++) {
u_vbuf_draw_vbo(vbuf, info, NULL, draws[i]);
u_vbuf_draw_vbo(vbuf, info, drawid, NULL, draws[i]);
if (info->increment_draw_id)
info->drawid++;
drawid++;
}
} else {
struct pipe_context *pipe = cso->pipe;
pipe->draw_vbo(pipe, info, NULL, draws, num_draws);
pipe->draw_vbo(pipe, info, drawid_offset, NULL, draws, num_draws);
}
}
@ -1471,7 +1474,7 @@ cso_draw_arrays(struct cso_context *cso, uint mode, uint start, uint count)
draw.count = count;
draw.index_bias = 0;
cso_draw_vbo(cso, &info, NULL, draw);
cso_draw_vbo(cso, &info, 0, NULL, draw);
}
void
@ -1495,5 +1498,5 @@ cso_draw_arrays_instanced(struct cso_context *cso, uint mode,
draw.count = count;
draw.index_bias = 0;
cso_draw_vbo(cso, &info, NULL, draw);
cso_draw_vbo(cso, &info, 0, NULL, draw);
}

View File

@ -178,6 +178,7 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
void
cso_draw_vbo(struct cso_context *cso,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias draw);
@ -185,6 +186,7 @@ cso_draw_vbo(struct cso_context *cso,
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);

View File

@ -325,6 +325,7 @@ draw_set_mapped_so_targets(struct draw_context *draw,
void draw_vbo(struct draw_context *draw,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -505,6 +505,7 @@ draw_instances(struct draw_context *draw,
void
draw_vbo(struct draw_context *draw,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -538,7 +539,7 @@ draw_vbo(struct draw_context *draw,
draw->pt.user.min_index = use_info->index_bounds_valid ? use_info->min_index : 0;
draw->pt.user.max_index = use_info->index_bounds_valid ? use_info->max_index : ~0;
draw->pt.user.eltSize = use_info->index_size ? draw->pt.user.eltSizeIB : 0;
draw->pt.user.drawid = use_info->drawid;
draw->pt.user.drawid = drawid_offset;
draw->pt.user.increment_draw_id = use_info->increment_draw_id;
draw->pt.user.viewid = 0;
draw->pt.vertices_per_patch = use_info->vertices_per_patch;

View File

@ -352,12 +352,14 @@ dd_dump_flush(struct dd_draw_state *dstate, struct call_flush *info, FILE *f)
static void
dd_dump_draw_vbo(struct dd_draw_state *dstate, struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw, FILE *f)
{
int sh, i;
DUMP(draw_info, info);
PRINT_NAMED(int, "drawid offset", drawid_offset);
DUMP(draw_start_count_bias, draw);
if (indirect) {
if (indirect->buffer)
@ -636,6 +638,7 @@ dd_dump_call(FILE *f, struct dd_draw_state *state, struct dd_call *call)
break;
case CALL_DRAW_VBO:
dd_dump_draw_vbo(state, &call->info.draw_vbo.info,
call->info.draw_vbo.drawid_offset,
&call->info.draw_vbo.indirect,
&call->info.draw_vbo.draw, f);
break;
@ -1303,6 +1306,7 @@ dd_context_flush(struct pipe_context *_pipe,
static void
dd_context_draw_vbo(struct pipe_context *_pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -1313,6 +1317,7 @@ dd_context_draw_vbo(struct pipe_context *_pipe,
record->call.type = CALL_DRAW_VBO;
record->call.info.draw_vbo.info = *info;
record->call.info.draw_vbo.drawid_offset = drawid_offset;
record->call.info.draw_vbo.draw = draws[0];
if (info->index_size && !info->has_user_indices) {
record->call.info.draw_vbo.info.index.resource = NULL;
@ -1336,7 +1341,7 @@ dd_context_draw_vbo(struct pipe_context *_pipe,
}
dd_before_draw(dctx, record);
pipe->draw_vbo(pipe, info, indirect, draws, num_draws);
pipe->draw_vbo(pipe, info, drawid_offset, indirect, draws, num_draws);
dd_after_draw(dctx, record);
}

View File

@ -123,6 +123,7 @@ struct call_flush {
struct call_draw_info {
struct pipe_draw_info info;
unsigned drawid_offset;
struct pipe_draw_indirect_info indirect;
struct pipe_draw_start_count_bias draw;
};

View File

@ -31,6 +31,7 @@
#include "util/u_transfer.h"
static void noop_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)

View File

@ -115,6 +115,7 @@ rbug_draw_block_locked(struct rbug_context *rb_pipe, int flag)
static void
rbug_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *_info,
unsigned _drawid_offset,
const struct pipe_draw_indirect_info *_indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -135,7 +136,7 @@ rbug_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *_info,
if (!(rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT] && rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT]->disabled) &&
!(rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY] && rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY]->disabled) &&
!(rb_pipe->curr.shader[PIPE_SHADER_VERTEX] && rb_pipe->curr.shader[PIPE_SHADER_VERTEX]->disabled))
pipe->draw_vbo(pipe, &info, _indirect, draws, num_draws);
pipe->draw_vbo(pipe, &info, _drawid_offset, _indirect, draws, num_draws);
mtx_unlock(&rb_pipe->call_mutex);
rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_AFTER);

View File

@ -110,6 +110,7 @@ dump_fb_state(struct trace_context *tr_ctx,
static void
trace_context_draw_vbo(struct pipe_context *_pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -124,6 +125,7 @@ trace_context_draw_vbo(struct pipe_context *_pipe,
trace_dump_arg(ptr, pipe);
trace_dump_arg(draw_info, info);
trace_dump_arg(int, drawid_offset);
trace_dump_arg(draw_indirect_info, indirect);
trace_dump_arg_begin("draws");
trace_dump_struct_array(draw_start_count, draws, num_draws);
@ -132,7 +134,7 @@ trace_context_draw_vbo(struct pipe_context *_pipe,
trace_dump_trace_flush();
pipe->draw_vbo(pipe, info, indirect, draws, num_draws);
pipe->draw_vbo(pipe, info, drawid_offset, indirect, draws, num_draws);
trace_dump_call_end();
}

View File

@ -99,6 +99,7 @@ util_primconvert_save_rasterizer_state(struct primconvert_context *pc,
void
util_primconvert_draw_vbo(struct primconvert_context *pc,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -124,7 +125,7 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
}
if (num_draws > 1) {
util_draw_multi(pc->pipe, info, indirect, draws, num_draws);
util_draw_multi(pc->pipe, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -203,7 +204,7 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
u_upload_unmap(pc->pipe->stream_uploader);
/* to the translated draw: */
pc->pipe->draw_vbo(pc->pipe, &new_info, NULL, &new_draw, 1);
pc->pipe->draw_vbo(pc->pipe, &new_info, drawid_offset, NULL, &new_draw, 1);
pipe_resource_reference(&new_info.index.resource, NULL);
}

View File

@ -47,6 +47,7 @@ void util_primconvert_save_rasterizer_state(struct primconvert_context *pc,
*rast);
void util_primconvert_draw_vbo(struct primconvert_context *pc,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -183,9 +183,8 @@ util_draw_indirect(struct pipe_context *pipe,
draw.start = params[2];
draw.index_bias = info_in->index_size ? params[3] : 0;
info.start_instance = info_in->index_size ? params[4] : params[3];
info.drawid = i;
pipe->draw_vbo(pipe, &info, NULL, &draw, 1);
pipe->draw_vbo(pipe, &info, i, NULL, &draw, 1);
params += indirect->stride / 4;
}
@ -194,11 +193,13 @@ util_draw_indirect(struct pipe_context *pipe,
void
util_draw_multi(struct pipe_context *pctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
struct pipe_draw_info tmp_info = *info;
unsigned drawid = drawid_offset;
/* If you call this with num_draws==1, that is probably going to be
* an infinite loop
@ -207,8 +208,8 @@ util_draw_multi(struct pipe_context *pctx, const struct pipe_draw_info *info,
for (unsigned i = 0; i < num_draws; i++) {
if (indirect || (draws[i].count && info->instance_count))
pctx->draw_vbo(pctx, &tmp_info, indirect, &draws[i], 1);
pctx->draw_vbo(pctx, &tmp_info, drawid, indirect, &draws[i], 1);
if (tmp_info.increment_draw_id)
tmp_info.drawid++;
drawid++;
}
}

View File

@ -66,7 +66,7 @@ util_draw_arrays(struct pipe_context *pipe,
draw.count = count;
draw.index_bias = 0;
pipe->draw_vbo(pipe, &info, NULL, &draw, 1);
pipe->draw_vbo(pipe, &info, 0, NULL, &draw, 1);
}
static inline void
@ -90,7 +90,7 @@ util_draw_elements(struct pipe_context *pipe,
draw.start = start;
draw.count = count;
pipe->draw_vbo(pipe, &info, NULL, &draw, 1);
pipe->draw_vbo(pipe, &info, 0, NULL, &draw, 1);
}
static inline void
@ -116,7 +116,7 @@ util_draw_arrays_instanced(struct pipe_context *pipe,
draw.count = count;
draw.index_bias = 0;
pipe->draw_vbo(pipe, &info, NULL, &draw, 1);
pipe->draw_vbo(pipe, &info, 0, NULL, &draw, 1);
}
static inline void
@ -145,7 +145,7 @@ util_draw_elements_instanced(struct pipe_context *pipe,
draw.start = start;
draw.count = count;
pipe->draw_vbo(pipe, &info, NULL, &draw, 1);
pipe->draw_vbo(pipe, &info, 0, NULL, &draw, 1);
}
@ -162,6 +162,7 @@ util_draw_indirect(struct pipe_context *pipe,
*/
void
util_draw_multi(struct pipe_context *pctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -913,8 +913,6 @@ util_dump_draw_info(FILE *stream, const struct pipe_draw_info *state)
util_dump_member(stream, uint, state, start_instance);
util_dump_member(stream, uint, state, instance_count);
util_dump_member(stream, uint, state, drawid);
util_dump_member(stream, uint, state, vertices_per_patch);
util_dump_member(stream, uint, state, min_index);

View File

@ -223,6 +223,7 @@ add_range(struct range_info *info, unsigned start, unsigned count)
enum pipe_error
util_draw_vbo_without_prim_restart(struct pipe_context *context,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect_info,
const struct pipe_draw_start_count_bias *draw)
{
@ -318,7 +319,7 @@ util_draw_vbo_without_prim_restart(struct pipe_context *context,
for (i = 0; i < ranges.count; i++) {
new_draw.start = ranges.ranges[i].start;
new_draw.count = ranges.ranges[i].count;
context->draw_vbo(context, &new_info, NULL, &new_draw, 1);
context->draw_vbo(context, &new_info, drawid_offset, NULL, &new_draw, 1);
}
FREE(ranges.ranges);

View File

@ -56,6 +56,7 @@ util_translate_prim_restart_ib(struct pipe_context *context,
enum pipe_error
util_draw_vbo_without_prim_restart(struct pipe_context *context,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw);

View File

@ -66,6 +66,7 @@ enum tc_call_id {
* not needed. */
struct tc_draw_single {
struct pipe_draw_info info;
unsigned drawid_offset;
};
typedef void (*tc_execute)(struct pipe_context *pipe, union tc_payload *payload);
@ -121,6 +122,7 @@ simplify_draw_info(struct pipe_draw_info *info)
info->take_index_buffer_ownership = false;
info->index_bias_varies = false;
info->_pad2 = 0;
info->_pad3 = 0;
/* This shouldn't be set when merging single draws. */
info->increment_draw_id = false;
@ -156,10 +158,10 @@ is_next_call_a_mergeable_draw(struct tc_draw_single *first_info,
sizeof(struct pipe_draw_info) - 8);
STATIC_ASSERT(offsetof(struct pipe_draw_info, max_index) ==
sizeof(struct pipe_draw_info) - 4);
/* All fields must be the same except start and count. */
/* u_threaded_context stores start/count in min/max_index for single draws. */
return memcmp((uint32_t*)&first_info->info,
return (*next_info)->drawid_offset == 0 &&
memcmp((uint32_t*)&first_info->info,
(uint32_t*)&(*next_info)->info,
DRAW_INFO_SIZE_WITHOUT_MIN_MAX_INDEX) == 0;
}
@ -194,7 +196,7 @@ tc_batch_execute(void *job, UNUSED int thread_index)
/* If at least 2 consecutive draw calls can be merged... */
if (next != last && next->call_id == TC_CALL_draw_single &&
first_info->info.drawid == 0 &&
first_info->drawid_offset == 0 &&
is_next_call_a_mergeable_draw(first_info, next, &next_info, &index_bias)) {
/* Merge up to 256 draw calls. */
struct pipe_draw_start_count_bias multi[256];
@ -228,7 +230,7 @@ tc_batch_execute(void *job, UNUSED int thread_index)
}
first_info->info.index_bias_varies = index_bias_varies;
pipe->draw_vbo(pipe, &first_info->info, NULL, multi, num_draws);
pipe->draw_vbo(pipe, &first_info->info, 0, NULL, multi, num_draws);
if (first_info->info.index_size)
pipe_resource_reference(&first_info->info.index.resource, NULL);
iter = next;
@ -236,7 +238,7 @@ tc_batch_execute(void *job, UNUSED int thread_index)
} else {
/* reset original index_bias from before simplify_draw_info() */
first_info->info._pad2 = first_index_bias;
if (next != last && next->call_id == TC_CALL_draw_single && first_info->info.drawid == 0 && next_info)
if (next != last && next->call_id == TC_CALL_draw_single && first_info->drawid == 0 && next_info)
/* in this case, simplify_draw_info() will have zeroed the data here as well */
next_info->info._pad2 = index_bias;
}
@ -2416,7 +2418,7 @@ tc_call_draw_single(struct pipe_context *pipe, union tc_payload *payload)
info->info.has_user_indices = false;
info->info.take_index_buffer_ownership = false;
pipe->draw_vbo(pipe, &info->info, NULL, &draw, 1);
pipe->draw_vbo(pipe, &info->info, info->drawid_offset, NULL, &draw, 1);
if (info->info.index_size)
pipe_resource_reference(&info->info.index.resource, NULL);
}
@ -2435,7 +2437,7 @@ tc_call_draw_indirect(struct pipe_context *pipe, union tc_payload *payload)
info->info.index_bounds_valid = false;
info->info.take_index_buffer_ownership = false;
pipe->draw_vbo(pipe, &info->info, &info->indirect, &info->draw, 1);
pipe->draw_vbo(pipe, &info->info, 0, &info->indirect, &info->draw, 1);
if (info->info.index_size)
pipe_resource_reference(&info->info.index.resource, NULL);
@ -2459,7 +2461,7 @@ tc_call_draw_multi(struct pipe_context *pipe, union tc_payload *payload)
info->info.index_bounds_valid = false;
info->info.take_index_buffer_ownership = false;
pipe->draw_vbo(pipe, &info->info, NULL, info->slot, info->num_draws);
pipe->draw_vbo(pipe, &info->info, 0, NULL, info->slot, info->num_draws);
if (info->info.index_size)
pipe_resource_reference(&info->info.index.resource, NULL);
}
@ -2469,6 +2471,7 @@ tc_call_draw_multi(struct pipe_context *pipe, union tc_payload *payload)
void
tc_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -2527,6 +2530,7 @@ tc_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info,
tc_add_struct_typed_call(tc, TC_CALL_draw_single, tc_draw_single);
memcpy(&p->info, info, DRAW_INFO_SIZE_WITHOUT_INDEXBUF_AND_MIN_MAX_INDEX);
p->info.index.resource = buffer;
p->drawid_offset = drawid_offset;
/* u_threaded_context stores start/count in min/max_index for single draws. */
p->info.min_index = offset >> util_logbase2(index_size);
p->info.max_index = draws[0].count;
@ -2539,6 +2543,7 @@ tc_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info,
tc_set_resource_reference(&p->info.index.resource,
info->index.resource);
}
p->drawid_offset = drawid_offset;
memcpy(&p->info, info, DRAW_INFO_SIZE_WITHOUT_MIN_MAX_INDEX);
/* u_threaded_context stores start/count in min/max_index for single draws. */
p->info.min_index = draws[0].start;

View File

@ -410,6 +410,7 @@ threaded_context_flush(struct pipe_context *_pipe,
void
tc_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -1275,6 +1275,7 @@ static void u_vbuf_set_driver_vertex_buffers(struct u_vbuf *mgr)
static void
u_vbuf_split_indexed_multidraw(struct u_vbuf *mgr, struct pipe_draw_info *info,
unsigned drawid_offset,
unsigned *indirect_data, unsigned stride,
unsigned draw_count)
{
@ -1296,11 +1297,12 @@ u_vbuf_split_indexed_multidraw(struct u_vbuf *mgr, struct pipe_draw_info *info,
draw.index_bias = indirect_data[offset + 3];
info->start_instance = indirect_data[offset + 4];
u_vbuf_draw_vbo(mgr, info, NULL, draw);
u_vbuf_draw_vbo(mgr, info, drawid_offset, NULL, draw);
}
}
void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias draw)
{
@ -1326,7 +1328,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
u_vbuf_set_driver_vertex_buffers(mgr);
}
pipe->draw_vbo(pipe, info, indirect, &draw, 1);
pipe->draw_vbo(pipe, info, drawid_offset, indirect, &draw, 1);
return;
}
@ -1369,7 +1371,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
/* If we invoke the translate path, we have to split the multidraw. */
if (incompatible_vb_mask ||
mgr->ve->incompatible_elem_mask) {
u_vbuf_split_indexed_multidraw(mgr, &new_info, data,
u_vbuf_split_indexed_multidraw(mgr, &new_info, drawid_offset, data,
indirect->stride, draw_count);
free(data);
return;
@ -1385,7 +1387,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
/* Split the multidraw if index_bias is different. */
if (!index_bias_same) {
u_vbuf_split_indexed_multidraw(mgr, &new_info, data,
u_vbuf_split_indexed_multidraw(mgr, &new_info, drawid_offset, data,
indirect->stride, draw_count);
free(data);
return;
@ -1597,7 +1599,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
u_upload_unmap(pipe->stream_uploader);
u_vbuf_set_driver_vertex_buffers(mgr);
pipe->draw_vbo(pipe, &new_info, indirect, &new_draw, 1);
pipe->draw_vbo(pipe, &new_info, drawid_offset, indirect, &new_draw, 1);
if (mgr->using_translate) {
u_vbuf_translate_end(mgr);

View File

@ -80,6 +80,7 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
bool take_ownership,
const struct pipe_vertex_buffer *bufs);
void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias draw);
void u_vbuf_get_minmax_index(struct pipe_context *pipe,

View File

@ -290,6 +290,7 @@ d3d12_apply_resource_states(struct d3d12_context* ctx);
void
d3d12_draw_vbo(struct pipe_context *pctx,
const struct pipe_draw_info *dinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -362,7 +362,7 @@ twoface_emulation(struct d3d12_context *ctx,
{
/* draw backfaces */
ctx->base.bind_rasterizer_state(&ctx->base, rast->twoface_back);
d3d12_draw_vbo(&ctx->base, dinfo, NULL, draw, 1);
d3d12_draw_vbo(&ctx->base, dinfo, 0, NULL, draw, 1);
/* restore real state */
ctx->base.bind_rasterizer_state(&ctx->base, rast);
@ -423,12 +423,13 @@ d3d12_last_vertex_stage(struct d3d12_context *ctx)
void
d3d12_draw_vbo(struct pipe_context *pctx,
const struct pipe_draw_info *dinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pctx, dinfo, indirect, draws, num_draws);
util_draw_multi(pctx, dinfo, drawid_offset, indirect, draws, num_draws);
return;
}
@ -453,7 +454,7 @@ d3d12_draw_vbo(struct pipe_context *pctx,
ctx->initial_api_prim = dinfo->mode;
util_primconvert_save_rasterizer_state(ctx->primconvert, &ctx->gfx_pipeline_state.rast->base);
util_primconvert_draw_vbo(ctx->primconvert, dinfo, indirect, draws, num_draws);
util_primconvert_draw_vbo(ctx->primconvert, dinfo, drawid_offset, indirect, draws, num_draws);
return;
}

View File

@ -225,12 +225,13 @@ etna_get_fs(struct etna_context *ctx, struct etna_shader_key key)
static void
etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
util_draw_multi(pctx, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -254,7 +255,7 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
if (!(ctx->prim_hwsupport & (1 << info->mode))) {
struct primconvert_context *primconvert = ctx->primconvert;
util_primconvert_save_rasterizer_state(primconvert, ctx->rasterizer);
util_primconvert_draw_vbo(primconvert, info, indirect, draws, num_draws);
util_primconvert_draw_vbo(primconvert, info, drawid_offset, indirect, draws, num_draws);
return;
}

View File

@ -153,6 +153,7 @@ draw_impl(struct fd_context *ctx, const struct pipe_draw_info *info,
static bool
fd2_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *pinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *pdraw,
unsigned index_offset) assert_dt

View File

@ -96,6 +96,7 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring,
static bool
fd3_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw,
unsigned index_offset) in_dt
@ -104,6 +105,7 @@ fd3_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.debug = &ctx->debug,
.vtx = &ctx->vtx,
.info = info,
.drawid_offset = drawid_offset,
.indirect = indirect,
.draw = draw,
.key = {

View File

@ -47,6 +47,7 @@ struct fd3_emit {
const struct fd_vertex_state *vtx;
const struct fd3_program_state *prog;
const struct pipe_draw_info *info;
unsigned drawid_offset;
const struct pipe_draw_indirect_info *indirect;
const struct pipe_draw_start_count_bias *draw;
bool binning_pass;

View File

@ -73,6 +73,7 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring,
static bool
fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw,
unsigned index_offset) in_dt
@ -82,6 +83,7 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.debug = &ctx->debug,
.vtx = &ctx->vtx,
.info = info,
.drawid_offset = drawid_offset,
.indirect = indirect,
.draw = draw,
.key = {

View File

@ -45,6 +45,7 @@ struct fd4_emit {
const struct fd_vertex_state *vtx;
const struct fd4_program_state *prog;
const struct pipe_draw_info *info;
unsigned drawid_offset;
const struct pipe_draw_indirect_info *indirect;
const struct pipe_draw_start_count_bias *draw;
bool binning_pass;

View File

@ -69,6 +69,7 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring,
static bool
fd5_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw,
unsigned index_offset) in_dt
@ -78,6 +79,7 @@ fd5_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.debug = &ctx->debug,
.vtx = &ctx->vtx,
.info = info,
.drawid_offset = drawid_offset,
.indirect = indirect,
.draw = draw,
.key = {

View File

@ -45,6 +45,7 @@ struct fd5_emit {
const struct fd_vertex_state *vtx;
const struct fd5_program_state *prog;
const struct pipe_draw_info *info;
unsigned drawid_offset;
const struct pipe_draw_indirect_info *indirect;
const struct pipe_draw_start_count_bias *draw;
bool binning_pass;

View File

@ -132,6 +132,7 @@ fixup_draw_state(struct fd_context *ctx, struct fd6_emit *emit) assert_dt
static bool
fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw,
unsigned index_offset) assert_dt
@ -142,6 +143,7 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.ctx = ctx,
.vtx = &ctx->vtx,
.info = info,
.drawid_offset = drawid_offset,
.indirect = indirect,
.draw = draw,
.key = {

View File

@ -89,6 +89,7 @@ struct fd6_emit {
struct fd_context *ctx;
const struct fd_vertex_state *vtx;
const struct pipe_draw_info *info;
unsigned drawid_offset;
const struct pipe_draw_indirect_info *indirect;
const struct pipe_draw_start_count_bias *draw;
struct ir3_cache_key key;

View File

@ -244,7 +244,7 @@ fd_blitter_clear(struct pipe_context *pctx, unsigned buffers,
struct pipe_draw_start_count_bias draw = {
.count = 2,
};
pctx->draw_vbo(pctx, &info, NULL, &draw, 1);
pctx->draw_vbo(pctx, &info, 0, NULL, &draw, 1);
/* We expect that this should not have triggered a change in pfb: */
assert(util_framebuffer_state_equal(pfb, &ctx->framebuffer));

View File

@ -463,6 +463,7 @@ struct fd_context {
/* draw: */
bool (*draw_vbo)(struct fd_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw,
unsigned index_offset) dt;

View File

@ -265,6 +265,7 @@ update_draw_stats(struct fd_context *ctx, const struct pipe_draw_info *info,
static void
fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws, unsigned num_draws) in_dt
{
@ -290,7 +291,7 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
if (ctx->streamout.num_targets > 0)
mesa_loge("stream-out with emulated prims");
util_primconvert_save_rasterizer_state(ctx->primconvert, ctx->rasterizer);
util_primconvert_draw_vbo(ctx->primconvert, info, indirect, draws,
util_primconvert_draw_vbo(ctx->primconvert, info, drawid_offset, indirect, draws,
num_draws);
return;
}
@ -302,7 +303,7 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
if (info->index_size) {
if (info->has_user_indices) {
if (num_draws > 1) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
util_draw_multi(pctx, info, drawid_offset, indirect, draws, num_draws);
return;
}
if (!util_upload_index_buffer(pctx, info, &draws[0], &indexbuf,
@ -318,7 +319,7 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
}
if ((ctx->streamout.num_targets > 0) && (num_draws > 1)) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
util_draw_multi(pctx, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -361,7 +362,7 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
batch->cost += ctx->draw_cost;
for (unsigned i = 0; i < num_draws; i++) {
if (ctx->draw_vbo(ctx, info, indirect, &draws[i], index_offset))
if (ctx->draw_vbo(ctx, info, drawid_offset, indirect, &draws[i], index_offset))
batch->needs_flush = true;
batch->num_vertices += draws[i].count * info->instance_count;

View File

@ -53,12 +53,13 @@ DEBUG_GET_ONCE_BOOL_OPTION(i915_no_vbuf, "I915_NO_VBUF", FALSE)
static void
i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pipe, info, indirect, draws, num_draws);
util_draw_multi(pipe, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -118,7 +119,7 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
/*
* Do the drawing
*/
draw_vbo(i915->draw, info, NULL, draws, num_draws);
draw_vbo(i915->draw, info, drawid_offset, NULL, draws, num_draws);
/*
* unmap vertex/index buffers

View File

@ -854,6 +854,7 @@ void iris_copy_region(struct blorp_context *blorp,
/* iris_draw.c */
void iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -116,6 +116,7 @@ iris_update_draw_info(struct iris_context *ice,
static void
iris_update_draw_parameters(struct iris_context *ice,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw)
{
@ -154,11 +155,11 @@ iris_update_draw_parameters(struct iris_context *ice,
struct iris_state_ref *derived_params = &ice->draw.derived_draw_params;
int is_indexed_draw = info->index_size ? -1 : 0;
if (ice->draw.derived_params.drawid != info->drawid ||
if (ice->draw.derived_params.drawid != drawid_offset ||
ice->draw.derived_params.is_indexed_draw != is_indexed_draw) {
changed = true;
ice->draw.derived_params.drawid = info->drawid;
ice->draw.derived_params.drawid = drawid_offset;
ice->draw.derived_params.is_indexed_draw = is_indexed_draw;
u_upload_data(ice->ctx.stream_uploader, 0,
@ -178,6 +179,7 @@ iris_update_draw_parameters(struct iris_context *ice,
static void
iris_indirect_draw_vbo(struct iris_context *ice,
const struct pipe_draw_info *dinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *dindirect,
const struct pipe_draw_start_count_bias *draw)
{
@ -195,13 +197,11 @@ iris_indirect_draw_vbo(struct iris_context *ice,
const uint64_t orig_stage_dirty = ice->state.stage_dirty;
for (int i = 0; i < indirect.draw_count; i++) {
info.drawid = i;
iris_batch_maybe_flush(batch, 1500);
iris_update_draw_parameters(ice, &info, &indirect, draw);
iris_update_draw_parameters(ice, &info, drawid_offset, &indirect, draw);
batch->screen->vtbl.upload_render_state(ice, batch, &info, &indirect, draw);
batch->screen->vtbl.upload_render_state(ice, batch, &info, drawid_offset + i, &indirect, draw);
ice->state.dirty &= ~IRIS_ALL_DIRTY_FOR_RENDER;
ice->state.stage_dirty &= ~IRIS_ALL_STAGE_DIRTY_FOR_RENDER;
@ -223,6 +223,7 @@ iris_indirect_draw_vbo(struct iris_context *ice,
static void
iris_simple_draw_vbo(struct iris_context *ice,
const struct pipe_draw_info *draw,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *sc)
{
@ -230,9 +231,9 @@ iris_simple_draw_vbo(struct iris_context *ice,
iris_batch_maybe_flush(batch, 1500);
iris_update_draw_parameters(ice, draw, indirect, sc);
iris_update_draw_parameters(ice, draw, drawid_offset, indirect, sc);
batch->screen->vtbl.upload_render_state(ice, batch, draw, indirect, sc);
batch->screen->vtbl.upload_render_state(ice, batch, draw, drawid_offset, indirect, sc);
}
/**
@ -240,12 +241,13 @@ iris_simple_draw_vbo(struct iris_context *ice,
*/
void
iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(ctx, info, indirect, draws, num_draws);
util_draw_multi(ctx, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -289,9 +291,9 @@ iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info,
iris_handle_always_flush_cache(batch);
if (indirect && indirect->buffer)
iris_indirect_draw_vbo(ice, info, indirect, &draws[0]);
iris_indirect_draw_vbo(ice, info, drawid_offset, indirect, &draws[0]);
else
iris_simple_draw_vbo(ice, info, indirect, &draws[0]);
iris_simple_draw_vbo(ice, info, drawid_offset, indirect, &draws[0]);
iris_handle_always_flush_cache(batch);

View File

@ -62,6 +62,7 @@ struct iris_vtable {
void (*upload_render_state)(struct iris_context *ice,
struct iris_batch *batch,
const struct pipe_draw_info *draw,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *sc);
void (*update_surface_base_address)(struct iris_batch *batch,

View File

@ -6569,6 +6569,7 @@ static void
iris_upload_render_state(struct iris_context *ice,
struct iris_batch *batch,
const struct pipe_draw_info *draw,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *sc)
{
@ -6687,7 +6688,7 @@ iris_upload_render_state(struct iris_context *ice,
/* comparison = draw id < draw count */
struct mi_value comparison =
mi_ult(&b, mi_imm(draw->drawid),
mi_ult(&b, mi_imm(drawid_offset),
mi_mem32(ro_bo(draw_count_bo, draw_count_offset)));
/* predicate = comparison & conditional rendering predicate */
@ -6697,7 +6698,7 @@ iris_upload_render_state(struct iris_context *ice,
uint32_t mi_predicate;
/* Upload the id of the current primitive to MI_PREDICATE_SRC1. */
iris_load_register_imm64(batch, MI_PREDICATE_SRC1, draw->drawid);
iris_load_register_imm64(batch, MI_PREDICATE_SRC1, drawid_offset);
/* Upload the current draw count from the draw parameters buffer
* to MI_PREDICATE_SRC0.
*/
@ -6706,7 +6707,7 @@ iris_upload_render_state(struct iris_context *ice,
/* Zero the top 32-bits of MI_PREDICATE_SRC0 */
iris_load_register_imm32(batch, MI_PREDICATE_SRC0 + 4, 0);
if (draw->drawid == 0) {
if (drawid_offset == 0) {
mi_predicate = MI_PREDICATE | MI_PREDICATE_LOADOP_LOADINV |
MI_PREDICATE_COMBINEOP_SET |
MI_PREDICATE_COMPAREOP_SRCS_EQUAL;

View File

@ -1135,12 +1135,13 @@ lima_draw_vbo_count(struct pipe_context *pctx,
static void
lima_draw_vbo(struct pipe_context *pctx,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
util_draw_multi(pctx, info, drawid_offset, indirect, draws, num_draws);
return;
}

View File

@ -52,6 +52,7 @@
*/
static void
llvmpipe_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -145,7 +146,7 @@ llvmpipe_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
!lp->queries_disabled);
/* draw! */
draw_vbo(draw, info, indirect, draws, num_draws);
draw_vbo(draw, info, drawid_offset, indirect, draws, num_draws);
/*
* unmap vertex/index buffers

View File

@ -203,6 +203,7 @@ nv30_draw_init(struct pipe_context *pipe);
void
nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draw);
bool

View File

@ -377,6 +377,7 @@ nv30_render_validate(struct nv30_context *nv30)
void
nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draw_one)
{
struct nv30_context *nv30 = nv30_context(pipe);
@ -444,7 +445,7 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
draw_set_indexes(draw, NULL, 0, 0);
}
draw_vbo(draw, info, NULL, draw_one, 1);
draw_vbo(draw, info, drawid_offset, NULL, draw_one, 1);
draw_flush(draw);
if (info->index_size && transferi)

View File

@ -546,12 +546,13 @@ nv30_draw_elements(struct nv30_context *nv30, bool shorten,
static void
nv30_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pipe, info, indirect, draws, num_draws);
util_draw_multi(pipe, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -591,7 +592,7 @@ nv30_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
nv30_state_validate(nv30, ~0, true);
if (nv30->draw_flags) {
nv30_render_vbo(pipe, info, &draws[0]);
nv30_render_vbo(pipe, info, drawid_offset, &draws[0]);
return;
} else
if (nv30->vbo_fifo) {

View File

@ -326,7 +326,7 @@ nv50_cb_push(struct nouveau_context *nv,
unsigned offset, unsigned words, const uint32_t *data);
/* nv50_vbo.c */
void nv50_draw_vbo(struct pipe_context *, const struct pipe_draw_info *,
void nv50_draw_vbo(struct pipe_context *, const struct pipe_draw_info *, unsigned,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -758,12 +758,13 @@ nv50_draw_vbo_kick_notify(struct nouveau_pushbuf *chan)
void
nv50_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pipe, info, indirect, draws, num_draws);
util_draw_multi(pipe, info, drawid_offset, indirect, draws, num_draws);
return;
}

View File

@ -412,7 +412,7 @@ nvc0_cb_bo_push(struct nouveau_context *,
unsigned offset, unsigned words, const uint32_t *data);
/* nvc0_vbo.c */
void nvc0_draw_vbo(struct pipe_context *, const struct pipe_draw_info *,
void nvc0_draw_vbo(struct pipe_context *, const struct pipe_draw_info *, unsigned,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);
@ -442,6 +442,7 @@ void nvc0_push_vbo(struct nvc0_context *, const struct pipe_draw_info *,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw);
void nvc0_push_vbo_indirect(struct nvc0_context *, const struct pipe_draw_info *,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw);

View File

@ -805,12 +805,13 @@ nvc0_draw_stream_output(struct nvc0_context *nvc0,
static void
nvc0_draw_indirect(struct nvc0_context *nvc0, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect)
{
struct nouveau_pushbuf *push = nvc0->base.pushbuf;
struct nv04_resource *buf = nv04_resource(indirect->buffer);
struct nv04_resource *buf_count = nv04_resource(indirect->indirect_draw_count);
unsigned size, macro, count = indirect->draw_count, drawid = info->drawid;
unsigned size, macro, count = indirect->draw_count, drawid = drawid_offset;
uint32_t offset = buf->offset + indirect->offset;
struct nvc0_screen *screen = nvc0->screen;
@ -924,12 +925,13 @@ nvc0_update_prim_restart(struct nvc0_context *nvc0, bool en, uint32_t index)
void
nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pipe, info, indirect, draws, num_draws);
util_draw_multi(pipe, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -1034,7 +1036,7 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
PUSH_DATA (push, NVC0_CB_AUX_DRAW_INFO);
PUSH_DATA (push, info->index_size ? draws->index_bias : 0);
PUSH_DATA (push, info->start_instance);
PUSH_DATA (push, info->drawid);
PUSH_DATA (push, drawid_offset);
}
if (nvc0->screen->base.class_3d < NVE4_3D_CLASS &&
@ -1077,7 +1079,7 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
if (nvc0->state.vbo_mode) {
if (indirect && indirect->buffer)
nvc0_push_vbo_indirect(nvc0, info, indirect, &draws[0]);
nvc0_push_vbo_indirect(nvc0, info, drawid_offset, indirect, &draws[0]);
else
nvc0_push_vbo(nvc0, info, indirect, &draws[0]);
goto cleanup;
@ -1108,7 +1110,7 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
}
if (unlikely(indirect && indirect->buffer)) {
nvc0_draw_indirect(nvc0, info, indirect);
nvc0_draw_indirect(nvc0, info, drawid_offset, indirect);
} else
if (unlikely(indirect && indirect->count_from_stream_output)) {
nvc0_draw_stream_output(nvc0, info, indirect);

View File

@ -492,6 +492,7 @@ typedef struct {
void
nvc0_push_vbo_indirect(struct nvc0_context *nvc0, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw)
{
@ -543,7 +544,7 @@ nvc0_push_vbo_indirect(struct nvc0_context *nvc0, const struct pipe_draw_info *i
PUSH_DATA (push, NVC0_CB_AUX_DRAW_INFO);
PUSH_DATA (push, sdraw.index_bias);
PUSH_DATA (push, single.start_instance);
PUSH_DATA (push, single.drawid + i);
PUSH_DATA (push, drawid_offset + i);
}
nvc0_push_vbo(nvc0, &single, NULL, &sdraw);

View File

@ -408,6 +408,7 @@ panfrost_draw_emit_tiler(struct panfrost_batch *batch,
static void
panfrost_direct_draw(struct panfrost_context *ctx,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draw)
{
if (!draw->count || !info->instance_count)
@ -431,7 +432,7 @@ panfrost_direct_draw(struct panfrost_context *ctx,
}
util_primconvert_save_rasterizer_state(ctx->primconvert, &ctx->rasterizer->base);
util_primconvert_draw_vbo(ctx->primconvert, info, NULL, draw, 1);
util_primconvert_draw_vbo(ctx->primconvert, info, drawid_offset, NULL, draw, 1);
return;
}
@ -535,6 +536,7 @@ panfrost_direct_draw(struct panfrost_context *ctx,
static void
panfrost_indirect_draw(struct panfrost_context *ctx,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw)
{
@ -545,7 +547,8 @@ panfrost_indirect_draw(struct panfrost_context *ctx,
tmp_draw.start = 0;
tmp_draw.count = so->offset;
panfrost_direct_draw(ctx, info, &tmp_draw);
tmp_draw.index_bias = 0;
panfrost_direct_draw(ctx, info, drawid_offset, &tmp_draw);
return;
}
@ -688,6 +691,7 @@ panfrost_indirect_draw(struct panfrost_context *ctx,
static void
panfrost_draw_vbo(struct pipe_context *pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -703,16 +707,17 @@ panfrost_draw_vbo(struct pipe_context *pipe,
if (indirect) {
assert(num_draws == 1);
panfrost_indirect_draw(ctx, info, indirect, &draws[0]);
panfrost_indirect_draw(ctx, info, drawid_offset, indirect, &draws[0]);
return;
}
struct pipe_draw_info tmp_info = *info;
unsigned drawid = drawid_offset;
for (unsigned i = 0; i < num_draws; i++) {
panfrost_direct_draw(ctx, &tmp_info, &draws[i]);
panfrost_direct_draw(ctx, &tmp_info, drawid, &draws[i]);
if (tmp_info.increment_draw_id)
tmp_info.drawid++;
drawid++;
}
}

View File

@ -788,12 +788,13 @@ static unsigned r300_max_vertex_count(struct r300_context *r300)
static void r300_draw_vbo(struct pipe_context* pipe,
const struct pipe_draw_info *dinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pipe, dinfo, indirect, draws, num_draws);
util_draw_multi(pipe, dinfo, drawid_offset, indirect, draws, num_draws);
return;
}
@ -855,12 +856,13 @@ static void r300_draw_vbo(struct pipe_context* pipe,
/* SW TCL elements, using Draw. */
static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pipe, info, indirect, draws, num_draws);
util_draw_multi(pipe, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -884,7 +886,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
r300_update_derived_state(r300);
draw_vbo(r300->draw, info, NULL, &draw, 1);
draw_vbo(r300->draw, info, drawid_offset, NULL, &draw, 1);
draw_flush(r300->draw);
}

View File

@ -36,6 +36,7 @@
struct r300_stencilref_context {
void (*draw_vbo)(struct pipe_context *pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);
@ -105,6 +106,7 @@ static void r300_stencilref_end(struct r300_context *r300)
static void r300_stencilref_draw_vbo(struct pipe_context *pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -113,12 +115,12 @@ static void r300_stencilref_draw_vbo(struct pipe_context *pipe,
struct r300_stencilref_context *sr = r300->stencilref_fallback;
if (!r300_stencilref_needed(r300)) {
sr->draw_vbo(pipe, info, NULL, draws, num_draws);
sr->draw_vbo(pipe, info, drawid_offset, NULL, draws, num_draws);
} else {
r300_stencilref_begin(r300);
sr->draw_vbo(pipe, info, NULL, draws, num_draws);
sr->draw_vbo(pipe, info, drawid_offset, NULL, draws, num_draws);
r300_stencilref_switch_side(r300);
sr->draw_vbo(pipe, info, NULL, draws, num_draws);
sr->draw_vbo(pipe, info, drawid_offset, NULL, draws, num_draws);
r300_stencilref_end(r300);
}
}

View File

@ -2074,12 +2074,13 @@ static inline void r600_emit_rasterizer_prim_state(struct r600_context *rctx)
}
static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(ctx, info, indirect, draws, num_draws);
util_draw_multi(ctx, info, drawid_offset, indirect, draws, num_draws);
return;
}

View File

@ -954,6 +954,7 @@ static bool si_check_ring_space(struct si_context *sctx, unsigned out_indexbuf_s
enum si_prim_discard_outcome
si_prepare_prim_discard_or_split_draw(struct si_context *sctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws, bool primitive_restart,
unsigned total_count)
@ -999,7 +1000,7 @@ si_prepare_prim_discard_or_split_draw(struct si_context *sctx, const struct pipe
for (unsigned i = 0; i < num_draws; i++) {
if (count && count + draws[i].count > vert_count_per_subdraw) {
/* Submit previous draws. */
sctx->b.draw_vbo(&sctx->b, info, NULL, draws + first_draw, num_draws_split);
sctx->b.draw_vbo(&sctx->b, info, drawid_offset, NULL, draws + first_draw, num_draws_split);
count = 0;
first_draw = i;
num_draws_split = 0;
@ -1007,7 +1008,7 @@ si_prepare_prim_discard_or_split_draw(struct si_context *sctx, const struct pipe
if (draws[i].count > vert_count_per_subdraw) {
/* Submit just 1 draw. It will be split. */
sctx->b.draw_vbo(&sctx->b, info, NULL, draws + i, 1);
sctx->b.draw_vbo(&sctx->b, info, drawid_offset, NULL, draws + i, 1);
assert(count == 0);
assert(first_draw == i);
assert(num_draws_split == 0);
@ -1035,7 +1036,7 @@ si_prepare_prim_discard_or_split_draw(struct si_context *sctx, const struct pipe
split_draw_range.start = base_start + start;
split_draw_range.count = MIN2(count - start, vert_count_per_subdraw);
sctx->b.draw_vbo(&sctx->b, &split_draw, NULL, &split_draw_range, 1);
sctx->b.draw_vbo(&sctx->b, &split_draw, drawid_offset, NULL, &split_draw_range, 1);
}
} else if (prim == PIPE_PRIM_TRIANGLE_STRIP) {
/* No primitive pair can be split, because strips reverse orientation
@ -1046,7 +1047,7 @@ si_prepare_prim_discard_or_split_draw(struct si_context *sctx, const struct pipe
split_draw_range.start = base_start + start;
split_draw_range.count = MIN2(count - start, vert_count_per_subdraw + 2);
sctx->b.draw_vbo(&sctx->b, &split_draw, NULL, &split_draw_range, 1);
sctx->b.draw_vbo(&sctx->b, &split_draw, drawid_offset, NULL, &split_draw_range, 1);
if (start == 0 && primitive_restart &&
sctx->cs_prim_discard_state.current->key.opt.cs_need_correct_orientation)

View File

@ -886,6 +886,7 @@ struct si_small_prim_cull_info {
typedef void (*pipe_draw_vbo_func)(struct pipe_context *pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);
@ -1481,6 +1482,7 @@ enum si_prim_discard_outcome
void si_build_prim_discard_compute_shader(struct si_shader_context *ctx);
enum si_prim_discard_outcome
si_prepare_prim_discard_or_split_draw(struct si_context *sctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws, bool primitive_restart,
unsigned total_count);

View File

@ -963,6 +963,7 @@ static void si_emit_draw_registers(struct si_context *sctx,
template <chip_class GFX_VERSION, si_has_ngg NGG, si_has_prim_discard_cs ALLOW_PRIM_DISCARD_CS>
static void si_emit_draw_packets(struct si_context *sctx, const struct pipe_draw_info *info,
unsigned drawid_base,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws,
@ -1056,7 +1057,6 @@ static void si_emit_draw_packets(struct si_context *sctx, const struct pipe_draw
unsigned sh_base_reg = sctx->shader_pointers.sh_base[PIPE_SHADER_VERTEX];
bool render_cond_bit = sctx->render_cond_enabled;
unsigned drawid_base = info->drawid;
if (indirect) {
assert(num_draws == 1);
@ -1734,6 +1734,7 @@ template <chip_class GFX_VERSION, si_has_tess HAS_TESS, si_has_gs HAS_GS, si_has
si_has_prim_discard_cs ALLOW_PRIM_DISCARD_CS>
static void si_draw_vbo(struct pipe_context *ctx,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -1951,7 +1952,7 @@ static void si_draw_vbo(struct pipe_context *ctx,
(instance_count == 1 ||
(instance_count <= USHRT_MAX && index_size && index_size <= 2) ||
pd_msg("instance_count too large or index_size == 4 or DrawArraysInstanced"))) &&
((info->drawid == 0 && (num_draws == 1 || !info->increment_draw_id)) ||
((drawid_offset == 0 && (num_draws == 1 || !info->increment_draw_id)) ||
!sctx->shader.vs.cso->info.uses_drawid || pd_msg("draw_id > 0")) &&
(!sctx->render_cond || pd_msg("render condition")) &&
/* Forced enablement ignores pipeline statistics queries. */
@ -1978,7 +1979,7 @@ static void si_draw_vbo(struct pipe_context *ctx,
* dispatches can run ahead. */
(si_all_vs_resources_read_only(sctx, index_size ? indexbuf : NULL) ||
pd_msg("write reference"))) {
switch (si_prepare_prim_discard_or_split_draw(sctx, info, draws, num_draws,
switch (si_prepare_prim_discard_or_split_draw(sctx, info, drawid_offset, draws, num_draws,
primitive_restart, total_direct_count)) {
case SI_PRIM_DISCARD_ENABLED:
original_index_size = index_size;
@ -2191,7 +2192,7 @@ static void si_draw_vbo(struct pipe_context *ctx,
si_emit_draw_packets<GFX_VERSION, NGG,
!HAS_TESS && !HAS_GS ? PRIM_DISCARD_CS_OFF : ALLOW_PRIM_DISCARD_CS>
(sctx, info, indirect, draws, num_draws, indexbuf, index_size,
(sctx, info, drawid_offset, indirect, draws, num_draws, indexbuf, index_size,
index_offset, instance_count, dispatch_prim_discard_cs,
original_index_size);
/* <-- CUs are busy here. */
@ -2231,7 +2232,7 @@ static void si_draw_vbo(struct pipe_context *ctx,
si_emit_draw_packets<GFX_VERSION, NGG,
!HAS_TESS && !HAS_GS ? PRIM_DISCARD_CS_OFF : ALLOW_PRIM_DISCARD_CS>
(sctx, info, indirect, draws, num_draws, indexbuf, index_size,
(sctx, info, drawid_offset, indirect, draws, num_draws, indexbuf, index_size,
index_offset, instance_count,
dispatch_prim_discard_cs, original_index_size);
@ -2312,7 +2313,7 @@ static void si_draw_rectangle(struct blitter_context *blitter, void *vertex_elem
sctx->vertex_buffer_pointer_dirty = false;
sctx->vertex_buffer_user_sgprs_dirty = false;
pipe->draw_vbo(pipe, &info, NULL, &draw, 1);
pipe->draw_vbo(pipe, &info, 0, NULL, &draw, 1);
}
extern "C"
@ -2377,6 +2378,7 @@ static void si_init_draw_vbo_all_families(struct si_context *sctx)
static void si_invalid_draw_vbo(struct pipe_context *pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)

View File

@ -60,12 +60,13 @@
void
softpipe_draw_vbo(struct pipe_context *pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pipe, info, indirect, draws, num_draws);
util_draw_multi(pipe, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -140,7 +141,7 @@ softpipe_draw_vbo(struct pipe_context *pipe,
sp->active_statistics_queries > 0);
/* draw! */
draw_vbo(draw, info, indirect, draws, num_draws);
draw_vbo(draw, info, drawid_offset, indirect, draws, num_draws);
/* unmap vertex/index buffers - will cause draw module to flush */
for (i = 0; i < sp->num_vertex_buffers; i++) {

View File

@ -182,6 +182,7 @@ softpipe_set_sampler_views(struct pipe_context *pipe,
void
softpipe_draw_vbo(struct pipe_context *pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -218,12 +218,13 @@ get_vcount_from_stream_output(struct svga_context *svga,
static void
svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pipe, info, indirect, draws, num_draws);
util_draw_multi(pipe, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -282,7 +283,7 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
if (need_fallback_prim_restart(svga, info)) {
enum pipe_error r;
r = util_draw_vbo_without_prim_restart(pipe, info, indirect, &draws[0]);
r = util_draw_vbo_without_prim_restart(pipe, info, drawid_offset, indirect, &draws[0]);
assert(r == PIPE_OK);
(void) r;
goto done;
@ -311,7 +312,7 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
/* Avoid leaking the previous hwtnl bias to swtnl */
svga_hwtnl_set_index_bias(svga->hwtnl, 0);
ret = svga_swtnl_draw_vbo(svga, info, indirect, &draws[0]);
ret = svga_swtnl_draw_vbo(svga, info, drawid_offset, indirect, &draws[0]);
}
else {
if (!svga_update_state_retry(svga, SVGA_STATE_HW_DRAW)) {

View File

@ -40,6 +40,7 @@ void svga_destroy_swtnl( struct svga_context *svga );
enum pipe_error
svga_swtnl_draw_vbo(struct svga_context *svga,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw);

View File

@ -39,6 +39,7 @@
enum pipe_error
svga_swtnl_draw_vbo(struct svga_context *svga,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw_one)
{
@ -114,7 +115,7 @@ svga_swtnl_draw_vbo(struct svga_context *svga,
svga->curr.constbufs[PIPE_SHADER_VERTEX][i].buffer->width0);
}
draw_vbo(draw, info, indirect, draw_one, 1);
draw_vbo(draw, info, drawid_offset, indirect, draw_one, 1);
draw_flush(svga->swtnl.draw);

View File

@ -38,17 +38,19 @@
*/
static void
swr_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
struct pipe_draw_info tmp_info = *info;
unsigned drawid = drawid_offset;
for (unsigned i = 0; i < num_draws; i++) {
swr_draw_vbo(pipe, &tmp_info, indirect, &draws[i], 1);
swr_draw_vbo(pipe, &tmp_info, drawid, indirect, &draws[i], 1);
if (tmp_info.increment_draw_id)
tmp_info.drawid++;
drawid++;
}
return;
}

View File

@ -48,12 +48,13 @@ tegra_destroy(struct pipe_context *pcontext)
static void
tegra_draw_vbo(struct pipe_context *pcontext,
const struct pipe_draw_info *pinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *pindirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pcontext, pinfo, pindirect, draws, num_draws);
util_draw_multi(pcontext, pinfo, drawid_offset, pindirect, draws, num_draws);
return;
}
@ -80,7 +81,7 @@ tegra_draw_vbo(struct pipe_context *pcontext,
pinfo = &info;
}
context->gpu->draw_vbo(context->gpu, pinfo, pindirect, draws, num_draws);
context->gpu->draw_vbo(context->gpu, pinfo, drawid_offset, pindirect, draws, num_draws);
}
static void

View File

@ -1105,12 +1105,13 @@ v3d_check_compiled_shaders(struct v3d_context *v3d)
static void
v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
util_draw_multi(pctx, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -1139,14 +1140,14 @@ v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
}
if (info->restart_index != mask) {
util_draw_vbo_without_prim_restart(pctx, info, indirect, &draws[0]);
util_draw_vbo_without_prim_restart(pctx, info, drawid_offset, indirect, &draws[0]);
return;
}
}
if (info->mode >= PIPE_PRIM_QUADS && info->mode <= PIPE_PRIM_POLYGON) {
util_primconvert_save_rasterizer_state(v3d->primconvert, &v3d->rasterizer->base);
util_primconvert_draw_vbo(v3d->primconvert, info, indirect, draws, num_draws);
util_primconvert_draw_vbo(v3d->primconvert, info, drawid_offset, indirect, draws, num_draws);
perf_debug("Fallback conversion for %d %s vertices\n",
draws[0].count, u_prim_name(info->mode));
return;

View File

@ -290,12 +290,13 @@ vc4_hw_2116_workaround(struct pipe_context *pctx, int vert_count)
static void
vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
util_draw_multi(pctx, info, drawid_offset, indirect, draws, num_draws);
return;
}
@ -319,7 +320,7 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
info = &local_info;
} else {
util_primconvert_save_rasterizer_state(vc4->primconvert, &vc4->rasterizer->base);
util_primconvert_draw_vbo(vc4->primconvert, info, indirect, draws, num_draws);
util_primconvert_draw_vbo(vc4->primconvert, info, drawid_offset, indirect, draws, num_draws);
perf_debug("Fallback conversion for %d %s vertices\n",
draws[0].count, u_prim_name(info->mode));
return;

View File

@ -860,12 +860,13 @@ static void virgl_clear_texture(struct pipe_context *ctx,
static void virgl_draw_vbo(struct pipe_context *ctx,
const struct pipe_draw_info *dinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
if (num_draws > 1) {
util_draw_multi(ctx, dinfo, indirect, draws, num_draws);
util_draw_multi(ctx, dinfo, drawid_offset, indirect, draws, num_draws);
return;
}
@ -884,7 +885,7 @@ static void virgl_draw_vbo(struct pipe_context *ctx,
if (!(rs->caps.caps.v1.prim_mask & (1 << dinfo->mode))) {
util_primconvert_save_rasterizer_state(vctx->primconvert, &vctx->rs_state.rs);
util_primconvert_draw_vbo(vctx->primconvert, dinfo, indirect, draws, num_draws);
util_primconvert_draw_vbo(vctx->primconvert, dinfo, drawid_offset, indirect, draws, num_draws);
return;
}
if (info.index_size) {
@ -912,7 +913,7 @@ static void virgl_draw_vbo(struct pipe_context *ctx,
if (info.index_size)
virgl_hw_set_index_buffer(vctx, &ib);
virgl_encoder_draw_vbo(vctx, &info, indirect, &draws[0]);
virgl_encoder_draw_vbo(vctx, &info, drawid_offset, indirect, &draws[0]);
pipe_resource_reference(&ib.buffer, NULL);

View File

@ -738,6 +738,7 @@ int virgl_encoder_set_index_buffer(struct virgl_context *ctx,
int virgl_encoder_draw_vbo(struct virgl_context *ctx,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw)
{
@ -764,7 +765,7 @@ int virgl_encoder_draw_vbo(struct virgl_context *ctx,
virgl_encoder_write_dword(ctx->cbuf, 0);
if (length >= VIRGL_DRAW_VBO_SIZE_TESS) {
virgl_encoder_write_dword(ctx->cbuf, info->vertices_per_patch); /* vertices per patch */
virgl_encoder_write_dword(ctx->cbuf, info->drawid); /* drawid */
virgl_encoder_write_dword(ctx->cbuf, drawid_offset); /* drawid */
}
if (length == VIRGL_DRAW_VBO_SIZE_INDIRECT) {
virgl_encoder_write_res(ctx, virgl_resource(indirect->buffer));

View File

@ -136,6 +136,7 @@ int virgl_encoder_set_viewport_states(struct virgl_context *ctx,
int virgl_encoder_draw_vbo(struct virgl_context *ctx,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw);

View File

@ -334,6 +334,7 @@ zink_rebind_framebuffer(struct zink_context *ctx, struct zink_resource *res);
void
zink_draw_vbo(struct pipe_context *pctx,
const struct pipe_draw_info *dinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -282,6 +282,7 @@ update_drawid(struct zink_context *ctx, unsigned draw_id)
void
zink_draw_vbo(struct pipe_context *pctx,
const struct pipe_draw_info *dinfo,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *dindirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
@ -304,7 +305,7 @@ zink_draw_vbo(struct pipe_context *pctx,
zink_maybe_flush_or_stall(ctx);
if (dinfo->primitive_restart && !restart_supported(dinfo->mode)) {
util_draw_vbo_without_prim_restart(pctx, dinfo, dindirect, &draws[0]);
util_draw_vbo_without_prim_restart(pctx, dinfo, drawid_offset, dindirect, &draws[0]);
return;
}
if (dinfo->mode == PIPE_PRIM_QUADS ||
@ -313,7 +314,7 @@ zink_draw_vbo(struct pipe_context *pctx,
(dinfo->mode == PIPE_PRIM_TRIANGLE_FAN && !screen->have_triangle_fans) ||
dinfo->mode == PIPE_PRIM_LINE_LOOP) {
util_primconvert_save_rasterizer_state(ctx->primconvert, &rast_state->base);
util_primconvert_draw_vbo(ctx->primconvert, dinfo, dindirect, draws, num_draws);
util_primconvert_draw_vbo(ctx->primconvert, dinfo, drawid_offset, dindirect, draws, num_draws);
return;
}
if (ctx->gfx_pipeline_state.vertices_per_patch != dinfo->vertices_per_patch)
@ -523,7 +524,7 @@ zink_draw_vbo(struct pipe_context *pctx,
screen->vk_CmdBeginTransformFeedbackEXT(batch->state->cmdbuf, 0, ctx->num_so_targets, counter_buffers, counter_buffer_offsets);
}
unsigned draw_id = dinfo->drawid;
unsigned draw_id = drawid_offset;
if (dinfo->index_size > 0) {
VkIndexType index_type;
unsigned index_size = dinfo->index_size;

View File

@ -1578,7 +1578,7 @@ static void handle_draw(struct lvp_cmd_buffer_entry *cmd,
state->info.instance_count = cmd->u.draw.instance_count;
state->info.view_mask = subpass->view_mask;
state->pctx->draw_vbo(state->pctx, &state->info, NULL, cmd->u.draw.draws, cmd->u.draw.draw_count);
state->pctx->draw_vbo(state->pctx, &state->info, 0, NULL, cmd->u.draw.draws, cmd->u.draw.draw_count);
}
static void handle_set_viewport(struct lvp_cmd_buffer_entry *cmd,
@ -2150,7 +2150,7 @@ static void handle_draw_indexed(struct lvp_cmd_buffer_entry *cmd,
cmd->u.draw_indexed.draws[i].start = (state->index_offset / state->index_size) + cmd->u.draw_indexed.draws[i].start;
cmd->u.draw_indexed.calc_start = false;
}
state->pctx->draw_vbo(state->pctx, &state->info, NULL, cmd->u.draw_indexed.draws, cmd->u.draw_indexed.draw_count);
state->pctx->draw_vbo(state->pctx, &state->info, 0, NULL, cmd->u.draw_indexed.draws, cmd->u.draw_indexed.draw_count);
}
static void handle_draw_indirect(struct lvp_cmd_buffer_entry *cmd,
@ -2171,7 +2171,7 @@ static void handle_draw_indirect(struct lvp_cmd_buffer_entry *cmd,
state->indirect_info.buffer = cmd->u.draw_indirect.buffer->bo;
state->info.view_mask = subpass->view_mask;
state->pctx->draw_vbo(state->pctx, &state->info, &state->indirect_info, &draw, 1);
state->pctx->draw_vbo(state->pctx, &state->info, 0, &state->indirect_info, &draw, 1);
}
static void handle_index_buffer(struct lvp_cmd_buffer_entry *cmd,
@ -2644,7 +2644,7 @@ static void handle_draw_indirect_count(struct lvp_cmd_buffer_entry *cmd,
state->indirect_info.indirect_draw_count = cmd->u.draw_indirect_count.count_buffer->bo;
state->info.view_mask = subpass->view_mask;
state->pctx->draw_vbo(state->pctx, &state->info, &state->indirect_info, &draw, 1);
state->pctx->draw_vbo(state->pctx, &state->info, 0, &state->indirect_info, &draw, 1);
}
static void handle_compute_push_descriptor_set(struct lvp_cmd_buffer_entry *cmd,
@ -2818,7 +2818,7 @@ static void handle_draw_indirect_byte_count(struct lvp_cmd_buffer_entry *cmd,
draw.count /= cmd->u.draw_indirect_byte_count.vertex_stride;
state->info.view_mask = subpass->view_mask;
state->pctx->draw_vbo(state->pctx, &state->info, &state->indirect_info, &draw, 1);
state->pctx->draw_vbo(state->pctx, &state->info, 0, &state->indirect_info, &draw, 1);
}
static void handle_begin_conditional_rendering(struct lvp_cmd_buffer_entry *cmd,

View File

@ -3315,7 +3315,7 @@ NineDevice9_ProcessVertices( struct NineDevice9 *This,
pipe_sw->set_stream_output_targets(pipe_sw, 1, &target, offsets);
pipe_sw->draw_vbo(pipe_sw, &draw, NULL, &sc, 1);
pipe_sw->draw_vbo(pipe_sw, &draw, 0, NULL, &sc, 1);
pipe_sw->set_stream_output_targets(pipe_sw, 0, NULL, 0);
pipe_sw->stream_output_target_destroy(pipe_sw, target);

View File

@ -2388,7 +2388,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_primitive,
info.max_index = draw.start + draw.count - 1;
info.index.resource = NULL;
context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1);
context->pipe->draw_vbo(context->pipe, &info, 0, NULL, &draw, 1);
}
CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive,
@ -2415,7 +2415,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive,
info.max_index = MinVertexIndex + NumVertices - 1;
info.index.resource = context->idxbuf;
context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1);
context->pipe->draw_vbo(context->pipe, &info, 0, NULL, &draw, 1);
}
CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf,
@ -2451,7 +2451,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf,
context->pipe->set_vertex_buffers(context->pipe, 0, 1, 0, false, vbuf);
context->changed.vtxbuf |= 1;
context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1);
context->pipe->draw_vbo(context->pipe, &info, 0, NULL, &draw, 1);
}
CSMT_ITEM_NO_WAIT(nine_context_resource_copy_region,

View File

@ -131,12 +131,14 @@ struct pipe_context {
*
* \param pipe context
* \param info draw info
* \param drawid_offset offset to add for drawid param of each draw
* \param indirect indirect multi draws
* \param draws array of (start, count) pairs for direct draws
* \param num_draws number of direct draws; 1 for indirect multi draws
*/
void (*draw_vbo)(struct pipe_context *pipe,
const struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);

View File

@ -761,8 +761,8 @@ struct pipe_draw_info
unsigned start_instance; /**< first instance id */
unsigned instance_count; /**< number of instances */
unsigned drawid; /**< id of this draw in a multidraw */
int _pad2; /**< padding for memcmp and index_bias reuse */
unsigned _pad3; /**< id of this draw in a multidraw */
/**
* Primitive restart enable/index (only applies to indexed drawing)

View File

@ -216,7 +216,7 @@ static void draw( void )
indices);
}
ctx->draw_vbo(ctx, &info, NULL, &draw, 1);
ctx->draw_vbo(ctx, &info, 0, NULL, &draw, 1);
pipe_resource_reference(&info.index.resource, NULL);

View File

@ -581,6 +581,7 @@ struct dd_function_table {
*/
void (*DrawGallium)(struct gl_context *ctx,
struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);
@ -598,6 +599,7 @@ struct dd_function_table {
*/
void (*DrawGalliumMultiMode)(struct gl_context *ctx,
struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
const unsigned char *mode,
unsigned num_draws);

View File

@ -936,6 +936,7 @@ _mesa_validate_MultiDrawElementsIndirectCount(struct gl_context *ctx,
void
_mesa_draw_gallium_fallback(struct gl_context *ctx,
struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
@ -994,7 +995,7 @@ _mesa_draw_gallium_fallback(struct gl_context *ctx,
prim.start = index_size && info->has_user_indices ? 0 : draws[i].start;
prim.count = draws[i].count;
prim.basevertex = index_size ? draws[i].index_bias : 0;
prim.draw_id = info->drawid + (info->increment_draw_id ? i : 0);
prim.draw_id = drawid_offset + (info->increment_draw_id ? i : 0);
if (!index_size) {
min_index = draws[i].start;
@ -1028,7 +1029,7 @@ _mesa_draw_gallium_fallback(struct gl_context *ctx,
prim[num_prims].start = draws[i].start;
prim[num_prims].count = draws[i].count;
prim[num_prims].basevertex = info->index_size ? draws[i].index_bias : 0;
prim[num_prims].draw_id = info->drawid + (info->increment_draw_id ? i : 0);
prim[num_prims].draw_id = drawid_offset + (info->increment_draw_id ? i : 0);
if (!index_size) {
min_index = MIN2(min_index, draws[i].start);
@ -1066,6 +1067,7 @@ _mesa_draw_gallium_fallback(struct gl_context *ctx,
void
_mesa_draw_gallium_multimode_fallback(struct gl_context *ctx,
struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
const unsigned char *mode,
unsigned num_draws)
@ -1076,7 +1078,7 @@ _mesa_draw_gallium_multimode_fallback(struct gl_context *ctx,
for (i = 0, first = 0; i <= num_draws; i++) {
if (i == num_draws || mode[i] != mode[first]) {
info->mode = mode[first];
ctx->Driver.DrawGallium(ctx, info, &draws[first], i - first);
ctx->Driver.DrawGallium(ctx, info, drawid_offset, &draws[first], i - first);
first = i;
}
}
@ -1296,9 +1298,9 @@ _mesa_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
info.index_bias_varies = false;
/* Packed section end. */
info._pad2 = 0;
info._pad3 = 0;
info.start_instance = baseInstance;
info.instance_count = numInstances;
info.drawid = 0;
info.view_mask = 0;
info.min_index = start;
info.max_index = start + count - 1;
@ -1306,7 +1308,7 @@ _mesa_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
draw.start = start;
draw.count = count;
ctx->Driver.DrawGallium(ctx, &info, &draw, 1);
ctx->Driver.DrawGallium(ctx, &info, 0, &draw, 1);
if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
_mesa_flush(ctx);
@ -1626,9 +1628,9 @@ _mesa_MultiDrawArrays(GLenum mode, const GLint *first,
info.index_bias_varies = false;
/* Packed section end. */
info._pad2 = 0;
info._pad3 = 0;
info.start_instance = 0;
info.instance_count = 1;
info.drawid = 0;
info.view_mask = 0;
for (int i = 0; i < primcount; i++) {
@ -1636,7 +1638,7 @@ _mesa_MultiDrawArrays(GLenum mode, const GLint *first,
draw[i].count = count[i];
}
ctx->Driver.DrawGallium(ctx, &info, draw, primcount);
ctx->Driver.DrawGallium(ctx, &info, 0, draw, primcount);
if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
_mesa_flush(ctx);
@ -1742,9 +1744,9 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, GLenum mode,
info.index_bias_varies = false;
/* Packed section end. */
info._pad2 = 0;
info._pad3 = 0;
info.start_instance = baseInstance;
info.instance_count = numInstances;
info.drawid = 0;
info.view_mask = 0;
info.restart_index = ctx->Array._RestartIndex[index_size_shift];
@ -1792,7 +1794,7 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, GLenum mode,
* for the latter case elsewhere.
*/
ctx->Driver.DrawGallium(ctx, &info, &draw, 1);
ctx->Driver.DrawGallium(ctx, &info, 0, &draw, 1);
if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
_mesa_flush(ctx);
@ -2131,9 +2133,9 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
info.index_bias_varies = !!basevertex;
/* Packed section end. */
info._pad2 = 0;
info._pad3 = 0;
info.start_instance = 0;
info.instance_count = 1;
info.drawid = 0;
info.view_mask = 0;
info.restart_index = ctx->Array._RestartIndex[index_size_shift];
@ -2171,7 +2173,7 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
}
}
ctx->Driver.DrawGallium(ctx, &info, draw, primcount);
ctx->Driver.DrawGallium(ctx, &info, 0, draw, primcount);
FREE_PRIMS(draw, primcount);
} else {
/* draw[i].start would overflow. Draw one at a time. */
@ -2186,13 +2188,12 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
/* Reset these, because the callee can change them. */
info.index_bounds_valid = false;
info.drawid = i;
info.index.user = indices[i];
draw.start = 0;
draw.index_bias = basevertex ? basevertex[i] : 0;
draw.count = count[i];
ctx->Driver.DrawGallium(ctx, &info, &draw, 1);
ctx->Driver.DrawGallium(ctx, &info, i, &draw, 1);
}
}

View File

@ -90,12 +90,14 @@ _mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao,
void
_mesa_draw_gallium_fallback(struct gl_context *ctx,
struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws);
void
_mesa_draw_gallium_multimode_fallback(struct gl_context *ctx,
struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
const unsigned char *mode,
unsigned num_draws);

View File

@ -173,6 +173,7 @@ prepare_indexed_draw(/* pass both st and ctx to reduce dereferences */
static void
st_draw_gallium(struct gl_context *ctx,
struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
unsigned num_draws)
{
@ -183,12 +184,13 @@ st_draw_gallium(struct gl_context *ctx,
if (!prepare_indexed_draw(st, ctx, info, draws, num_draws))
return;
cso_multi_draw(st->cso_context, info, draws, num_draws);
cso_multi_draw(st->cso_context, info, drawid_offset, draws, num_draws);
}
static void
st_draw_gallium_multimode(struct gl_context *ctx,
struct pipe_draw_info *info,
unsigned drawid_offset,
const struct pipe_draw_start_count_bias *draws,
const unsigned char *mode,
unsigned num_draws)
@ -207,7 +209,7 @@ st_draw_gallium_multimode(struct gl_context *ctx,
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, &draws[first], i - first);
cso_multi_draw(cso, info, drawid_offset, &draws[first], i - first);
first = i;
/* We can pass the reference only once. st_buffer_object keeps
@ -268,8 +270,7 @@ st_indirect_draw_vbo(struct gl_context *ctx,
assert(!indirect_draw_count);
indirect.draw_count = 1;
for (i = 0; i < draw_count; i++) {
info.drawid = i;
cso_draw_vbo(st->cso_context, &info, &indirect, draw);
cso_draw_vbo(st->cso_context, &info, i, &indirect, draw);
indirect.offset += stride;
}
} else {
@ -280,7 +281,7 @@ st_indirect_draw_vbo(struct gl_context *ctx,
st_buffer_object(indirect_draw_count)->buffer;
indirect.indirect_draw_count_offset = indirect_draw_count_offset;
}
cso_draw_vbo(st->cso_context, &info, &indirect, draw);
cso_draw_vbo(st->cso_context, &info, 0, &indirect, draw);
}
}
@ -308,7 +309,7 @@ st_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
if (!st_transform_feedback_draw_init(tfb_vertcount, stream, &indirect))
return;
cso_draw_vbo(st->cso_context, &info, &indirect, draw);
cso_draw_vbo(st->cso_context, &info, 0, &indirect, draw);
}
void

View File

@ -452,13 +452,12 @@ st_feedback_draw_vbo(struct gl_context *ctx,
info.mode = prims[i].mode;
d.index_bias = prims[i].basevertex;
info.drawid = prims[i].draw_id;
if (!ib) {
info.min_index = d.start;
info.max_index = d.start + d.count - 1;
}
draw_vbo(draw, &info, NULL, &d, 1);
draw_vbo(draw, &info, prims[i].draw_id, NULL, &d, 1);
}
/* unmap images */

View File

@ -333,7 +333,7 @@ vbo_exec_vtx_flush(struct vbo_exec_context *exec)
exec->vtx.info.vertices_per_patch =
ctx->TessCtrlProgram.patch_vertices;
ctx->Driver.DrawGalliumMultiMode(ctx, &exec->vtx.info,
ctx->Driver.DrawGalliumMultiMode(ctx, &exec->vtx.info, 0,
exec->vtx.draw,
exec->vtx.mode,
exec->vtx.prim_count);

View File

@ -235,12 +235,12 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
info->vertices_per_patch = ctx->TessCtrlProgram.patch_vertices;
void *gl_bo = info->index.gl_bo;
if (node->merged.mode) {
ctx->Driver.DrawGalliumMultiMode(ctx, info,
ctx->Driver.DrawGalliumMultiMode(ctx, info, 0,
node->merged.start_count,
node->merged.mode,
node->merged.num_draws);
} else {
ctx->Driver.DrawGallium(ctx, info,
ctx->Driver.DrawGallium(ctx, info, 0,
node->merged.start_count,
node->merged.num_draws);
}