diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index 64c48d0f0be..96b2072e91c 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -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); } diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h index a222046d9dd..fa5e49ea3b7 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.h +++ b/src/gallium/auxiliary/cso_cache/cso_context.h @@ -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); diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h index 19f04d595e9..15e4d25acf6 100644 --- a/src/gallium/auxiliary/draw/draw_context.h +++ b/src/gallium/auxiliary/draw/draw_context.h @@ -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); diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c index 11980fe197c..323052cfb6d 100644 --- a/src/gallium/auxiliary/draw/draw_pt.c +++ b/src/gallium/auxiliary/draw/draw_pt.c @@ -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; diff --git a/src/gallium/auxiliary/driver_ddebug/dd_draw.c b/src/gallium/auxiliary/driver_ddebug/dd_draw.c index e9f481d90d0..f2f8a63c281 100644 --- a/src/gallium/auxiliary/driver_ddebug/dd_draw.c +++ b/src/gallium/auxiliary/driver_ddebug/dd_draw.c @@ -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); } diff --git a/src/gallium/auxiliary/driver_ddebug/dd_pipe.h b/src/gallium/auxiliary/driver_ddebug/dd_pipe.h index 2bdcea85669..e7e23fe1caa 100644 --- a/src/gallium/auxiliary/driver_ddebug/dd_pipe.h +++ b/src/gallium/auxiliary/driver_ddebug/dd_pipe.h @@ -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; }; diff --git a/src/gallium/auxiliary/driver_noop/noop_state.c b/src/gallium/auxiliary/driver_noop/noop_state.c index 9386535a642..858f816f7a8 100644 --- a/src/gallium/auxiliary/driver_noop/noop_state.c +++ b/src/gallium/auxiliary/driver_noop/noop_state.c @@ -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) diff --git a/src/gallium/auxiliary/driver_rbug/rbug_context.c b/src/gallium/auxiliary/driver_rbug/rbug_context.c index cec9756da45..5f5fd4a3ec6 100644 --- a/src/gallium/auxiliary/driver_rbug/rbug_context.c +++ b/src/gallium/auxiliary/driver_rbug/rbug_context.c @@ -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); diff --git a/src/gallium/auxiliary/driver_trace/tr_context.c b/src/gallium/auxiliary/driver_trace/tr_context.c index e2c4cc38dc5..2454ff77d4c 100644 --- a/src/gallium/auxiliary/driver_trace/tr_context.c +++ b/src/gallium/auxiliary/driver_trace/tr_context.c @@ -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(); } diff --git a/src/gallium/auxiliary/indices/u_primconvert.c b/src/gallium/auxiliary/indices/u_primconvert.c index d09dc67befd..37d33aa5d6c 100644 --- a/src/gallium/auxiliary/indices/u_primconvert.c +++ b/src/gallium/auxiliary/indices/u_primconvert.c @@ -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); } diff --git a/src/gallium/auxiliary/indices/u_primconvert.h b/src/gallium/auxiliary/indices/u_primconvert.h index d853a71fe51..22933891911 100644 --- a/src/gallium/auxiliary/indices/u_primconvert.h +++ b/src/gallium/auxiliary/indices/u_primconvert.h @@ -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); diff --git a/src/gallium/auxiliary/util/u_draw.c b/src/gallium/auxiliary/util/u_draw.c index 36bd2fc8370..57c78a9b859 100644 --- a/src/gallium/auxiliary/util/u_draw.c +++ b/src/gallium/auxiliary/util/u_draw.c @@ -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++; } } diff --git a/src/gallium/auxiliary/util/u_draw.h b/src/gallium/auxiliary/util/u_draw.h index dea30fb9adc..6231d73dd29 100644 --- a/src/gallium/auxiliary/util/u_draw.h +++ b/src/gallium/auxiliary/util/u_draw.h @@ -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); diff --git a/src/gallium/auxiliary/util/u_dump_state.c b/src/gallium/auxiliary/util/u_dump_state.c index ecb9b726c9b..85a4d010274 100644 --- a/src/gallium/auxiliary/util/u_dump_state.c +++ b/src/gallium/auxiliary/util/u_dump_state.c @@ -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); diff --git a/src/gallium/auxiliary/util/u_prim_restart.c b/src/gallium/auxiliary/util/u_prim_restart.c index 0b9f37e7b51..aea0c0c58cd 100644 --- a/src/gallium/auxiliary/util/u_prim_restart.c +++ b/src/gallium/auxiliary/util/u_prim_restart.c @@ -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); diff --git a/src/gallium/auxiliary/util/u_prim_restart.h b/src/gallium/auxiliary/util/u_prim_restart.h index b76acc31200..453c1281d8d 100644 --- a/src/gallium/auxiliary/util/u_prim_restart.h +++ b/src/gallium/auxiliary/util/u_prim_restart.h @@ -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); diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c index b0ec2d45a44..e34e01a4c88 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.c +++ b/src/gallium/auxiliary/util/u_threaded_context.c @@ -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; diff --git a/src/gallium/auxiliary/util/u_threaded_context.h b/src/gallium/auxiliary/util/u_threaded_context.h index 6a1cb67dd29..6d0227a4a14 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.h +++ b/src/gallium/auxiliary/util/u_threaded_context.h @@ -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); diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c index 883ca6e6cc4..69c22e39258 100644 --- a/src/gallium/auxiliary/util/u_vbuf.c +++ b/src/gallium/auxiliary/util/u_vbuf.c @@ -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); diff --git a/src/gallium/auxiliary/util/u_vbuf.h b/src/gallium/auxiliary/util/u_vbuf.h index 33b4d294048..70aaee71698 100644 --- a/src/gallium/auxiliary/util/u_vbuf.h +++ b/src/gallium/auxiliary/util/u_vbuf.h @@ -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, diff --git a/src/gallium/drivers/d3d12/d3d12_context.h b/src/gallium/drivers/d3d12/d3d12_context.h index 6b0a96dcbe9..d280bb4b904 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.h +++ b/src/gallium/drivers/d3d12/d3d12_context.h @@ -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); diff --git a/src/gallium/drivers/d3d12/d3d12_draw.cpp b/src/gallium/drivers/d3d12/d3d12_draw.cpp index 037403c081e..45ff9655815 100644 --- a/src/gallium/drivers/d3d12/d3d12_draw.cpp +++ b/src/gallium/drivers/d3d12/d3d12_draw.cpp @@ -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; } diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index 2d5aa9a2ad8..4dd9e427ea1 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -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; } diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c index 97d8eab9a40..2a53632bbb1 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c @@ -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 diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c index cdf23304e30..786c9548022 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c @@ -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 = { diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.h b/src/gallium/drivers/freedreno/a3xx/fd3_emit.h index e28bb4d62b8..cf8f16dbeea 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.h +++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.h @@ -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; diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c index 5136a9ea907..7647388e5fd 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c @@ -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 = { diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_emit.h b/src/gallium/drivers/freedreno/a4xx/fd4_emit.h index 889922f2d52..2a012dab72a 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_emit.h +++ b/src/gallium/drivers/freedreno/a4xx/fd4_emit.h @@ -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; diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c index 0f5962313ab..6868b521314 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c @@ -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 = { diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_emit.h b/src/gallium/drivers/freedreno/a5xx/fd5_emit.h index d35824e3bb1..b8ecdc8d9dc 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_emit.h +++ b/src/gallium/drivers/freedreno/a5xx/fd5_emit.h @@ -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; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c index 500e4f7565b..dfb6f9a904e 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c @@ -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 = { diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.h b/src/gallium/drivers/freedreno/a6xx/fd6_emit.h index 7cde37e43ab..e829970a4cb 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.h +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.h @@ -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; diff --git a/src/gallium/drivers/freedreno/freedreno_blitter.c b/src/gallium/drivers/freedreno/freedreno_blitter.c index 4618664aa88..2a5bb4b84a2 100644 --- a/src/gallium/drivers/freedreno/freedreno_blitter.c +++ b/src/gallium/drivers/freedreno/freedreno_blitter.c @@ -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)); diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h index 81957f4e48d..26507635320 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.h +++ b/src/gallium/drivers/freedreno/freedreno_context.h @@ -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; diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index ce7e44343b9..c82ec03aa68 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -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; diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c index 6ed154d23cf..e007486fea1 100644 --- a/src/gallium/drivers/i915/i915_context.c +++ b/src/gallium/drivers/i915/i915_context.c @@ -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 diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h index c1348b95568..ca21bcdd158 100644 --- a/src/gallium/drivers/iris/iris_context.h +++ b/src/gallium/drivers/iris/iris_context.h @@ -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); diff --git a/src/gallium/drivers/iris/iris_draw.c b/src/gallium/drivers/iris/iris_draw.c index fb190559eee..1bf5bf7fd79 100644 --- a/src/gallium/drivers/iris/iris_draw.c +++ b/src/gallium/drivers/iris/iris_draw.c @@ -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); diff --git a/src/gallium/drivers/iris/iris_screen.h b/src/gallium/drivers/iris/iris_screen.h index 1cee7dab4b2..3724b559a94 100644 --- a/src/gallium/drivers/iris/iris_screen.h +++ b/src/gallium/drivers/iris/iris_screen.h @@ -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, diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 2b4fd0c4b8d..02577a0f67e 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -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; diff --git a/src/gallium/drivers/lima/lima_draw.c b/src/gallium/drivers/lima/lima_draw.c index 19a38fd5677..6f5b5b2b867 100644 --- a/src/gallium/drivers/lima/lima_draw.c +++ b/src/gallium/drivers/lima/lima_draw.c @@ -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; } diff --git a/src/gallium/drivers/llvmpipe/lp_draw_arrays.c b/src/gallium/drivers/llvmpipe/lp_draw_arrays.c index 2fb87336fbe..a5c5f606ddd 100644 --- a/src/gallium/drivers/llvmpipe/lp_draw_arrays.c +++ b/src/gallium/drivers/llvmpipe/lp_draw_arrays.c @@ -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 diff --git a/src/gallium/drivers/nouveau/nv30/nv30_context.h b/src/gallium/drivers/nouveau/nv30/nv30_context.h index 1f1ad583ec0..95fc68fb8ac 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_context.h +++ b/src/gallium/drivers/nouveau/nv30/nv30_context.h @@ -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 diff --git a/src/gallium/drivers/nouveau/nv30/nv30_draw.c b/src/gallium/drivers/nouveau/nv30/nv30_draw.c index 1c4f2b86e62..a41778827b3 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_draw.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_draw.c @@ -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) diff --git a/src/gallium/drivers/nouveau/nv30/nv30_vbo.c b/src/gallium/drivers/nouveau/nv30/nv30_vbo.c index b7d56e24d09..78f442a7c0e 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_vbo.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_vbo.c @@ -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) { diff --git a/src/gallium/drivers/nouveau/nv50/nv50_context.h b/src/gallium/drivers/nouveau/nv50/nv50_context.h index 7b67c67a712..29d1e5f3dbc 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_context.h +++ b/src/gallium/drivers/nouveau/nv50/nv50_context.h @@ -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); diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c index 8a4dd81e4c9..1041a239a4c 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c @@ -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; } diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h index 456ab2eb7dc..c6871dc5440 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h @@ -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); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c index 08ce6b3b7e1..29bc9b28fac 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c @@ -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); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c index f69c0d8b8ce..30dae5a1265 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c @@ -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); diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index c2d937936a2..b770ed38644 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -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++; } } diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c index 5ef6ee63eec..1c09e9ef64d 100644 --- a/src/gallium/drivers/r300/r300_render.c +++ b/src/gallium/drivers/r300/r300_render.c @@ -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); } diff --git a/src/gallium/drivers/r300/r300_render_stencilref.c b/src/gallium/drivers/r300/r300_render_stencilref.c index d18f6ccf108..87d944d2e03 100644 --- a/src/gallium/drivers/r300/r300_render_stencilref.c +++ b/src/gallium/drivers/r300/r300_render_stencilref.c @@ -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); } } diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 4844c9075de..0a70d2d9673 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/si_compute_prim_discard.c b/src/gallium/drivers/radeonsi/si_compute_prim_discard.c index 7a4f423e68f..ffd35d37417 100644 --- a/src/gallium/drivers/radeonsi/si_compute_prim_discard.c +++ b/src/gallium/drivers/radeonsi/si_compute_prim_discard.c @@ -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) diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index ec812d5924c..fba6d53a20c 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -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); diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index c9da1cf2a18..1b47cf986ba 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -963,6 +963,7 @@ static void si_emit_draw_registers(struct si_context *sctx, template 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 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 - (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 - (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) diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c b/src/gallium/drivers/softpipe/sp_draw_arrays.c index 3b2a7d695a5..6a5f34703a3 100644 --- a/src/gallium/drivers/softpipe/sp_draw_arrays.c +++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c @@ -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++) { diff --git a/src/gallium/drivers/softpipe/sp_state.h b/src/gallium/drivers/softpipe/sp_state.h index 9e7259217cb..7196cdff118 100644 --- a/src/gallium/drivers/softpipe/sp_state.h +++ b/src/gallium/drivers/softpipe/sp_state.h @@ -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); diff --git a/src/gallium/drivers/svga/svga_pipe_draw.c b/src/gallium/drivers/svga/svga_pipe_draw.c index 35adabfcc62..f1c6276fc76 100644 --- a/src/gallium/drivers/svga/svga_pipe_draw.c +++ b/src/gallium/drivers/svga/svga_pipe_draw.c @@ -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)) { diff --git a/src/gallium/drivers/svga/svga_swtnl.h b/src/gallium/drivers/svga/svga_swtnl.h index 704a6e7f65d..4a79c8a31fe 100644 --- a/src/gallium/drivers/svga/svga_swtnl.h +++ b/src/gallium/drivers/svga/svga_swtnl.h @@ -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); diff --git a/src/gallium/drivers/svga/svga_swtnl_draw.c b/src/gallium/drivers/svga/svga_swtnl_draw.c index a5cc6f618ff..11d9724c7e8 100644 --- a/src/gallium/drivers/svga/svga_swtnl_draw.c +++ b/src/gallium/drivers/svga/svga_swtnl_draw.c @@ -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); diff --git a/src/gallium/drivers/swr/swr_draw.cpp b/src/gallium/drivers/swr/swr_draw.cpp index 96c862f2651..91e43e0e2a9 100644 --- a/src/gallium/drivers/swr/swr_draw.cpp +++ b/src/gallium/drivers/swr/swr_draw.cpp @@ -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; } diff --git a/src/gallium/drivers/tegra/tegra_context.c b/src/gallium/drivers/tegra/tegra_context.c index b31ce85a985..e75a7c96e6f 100644 --- a/src/gallium/drivers/tegra/tegra_context.c +++ b/src/gallium/drivers/tegra/tegra_context.c @@ -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 diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index c7972f85373..1611a8027c5 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -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; diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c index b3d0996ec47..d01a1c27273 100644 --- a/src/gallium/drivers/vc4/vc4_draw.c +++ b/src/gallium/drivers/vc4/vc4_draw.c @@ -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; diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c index afd8f5815c0..b27f8643c0e 100644 --- a/src/gallium/drivers/virgl/virgl_context.c +++ b/src/gallium/drivers/virgl/virgl_context.c @@ -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); diff --git a/src/gallium/drivers/virgl/virgl_encode.c b/src/gallium/drivers/virgl/virgl_encode.c index 8fd302f76d6..6e8476f42f7 100644 --- a/src/gallium/drivers/virgl/virgl_encode.c +++ b/src/gallium/drivers/virgl/virgl_encode.c @@ -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)); diff --git a/src/gallium/drivers/virgl/virgl_encode.h b/src/gallium/drivers/virgl/virgl_encode.h index 20af94d420e..bccb279c29e 100644 --- a/src/gallium/drivers/virgl/virgl_encode.h +++ b/src/gallium/drivers/virgl/virgl_encode.h @@ -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); diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index ed5efe0b711..85b7c67ae15 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -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); diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index b4c47344e03..54aaa22df5b 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -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; diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index fcbf2a50bd7..ea2d215fc2b 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -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, diff --git a/src/gallium/frontends/nine/device9.c b/src/gallium/frontends/nine/device9.c index 5bd6f25e8dd..3783bd7ec3d 100644 --- a/src/gallium/frontends/nine/device9.c +++ b/src/gallium/frontends/nine/device9.c @@ -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); diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index fc3fd8eed9c..d1a0d24aa97 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -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, diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index 52c77b8a22f..61e3bb4ae91 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -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); diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 45073c57d8c..fb864265cf5 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -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) diff --git a/src/gallium/tests/graw/tri-instanced.c b/src/gallium/tests/graw/tri-instanced.c index 0390c06e48f..66f7d1b22cb 100644 --- a/src/gallium/tests/graw/tri-instanced.c +++ b/src/gallium/tests/graw/tri-instanced.c @@ -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); diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 800b3e81805..8db6848be95 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -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); diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c index 38d404030e4..88fad374cbf 100644 --- a/src/mesa/main/draw.c +++ b/src/mesa/main/draw.c @@ -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); } } diff --git a/src/mesa/main/draw.h b/src/mesa/main/draw.h index bb7fe6d0c95..061919815a9 100644 --- a/src/mesa/main/draw.h +++ b/src/mesa/main/draw.h @@ -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); diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 35073c66f13..f41782196ce 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -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 diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c index efba83868e6..1de2ce27a17 100644 --- a/src/mesa/state_tracker/st_draw_feedback.c +++ b/src/mesa/state_tracker/st_draw_feedback.c @@ -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 */ diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c index dc634979647..f631b00bb07 100644 --- a/src/mesa/vbo/vbo_exec_draw.c +++ b/src/mesa/vbo/vbo_exec_draw.c @@ -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); diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index 3020c105c64..9b95640eaf6 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -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); }