From dae3113c3d87a02204aa12f5623c4cb1b30def6a Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sun, 11 Apr 2021 13:35:38 -0400 Subject: [PATCH] gallium: split drawid out of pipe_draw_info and as a separate draw_vbo param MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the only case in which this is nonzero is if a multidraw gets split by the frontend, i.e., mesa core, and in all other cases it can be ignored. the value can also be ignored for all indirect draws, though it seems many (most?) gallium drivers are not aware of this Reviewed-by: Marek Olšák Part-of: --- src/gallium/auxiliary/cso_cache/cso_context.c | 17 +++++++----- src/gallium/auxiliary/cso_cache/cso_context.h | 2 ++ src/gallium/auxiliary/draw/draw_context.h | 1 + src/gallium/auxiliary/draw/draw_pt.c | 3 ++- src/gallium/auxiliary/driver_ddebug/dd_draw.c | 7 ++++- src/gallium/auxiliary/driver_ddebug/dd_pipe.h | 1 + .../auxiliary/driver_noop/noop_state.c | 1 + .../auxiliary/driver_rbug/rbug_context.c | 3 ++- .../auxiliary/driver_trace/tr_context.c | 4 ++- src/gallium/auxiliary/indices/u_primconvert.c | 5 ++-- src/gallium/auxiliary/indices/u_primconvert.h | 1 + src/gallium/auxiliary/util/u_draw.c | 9 ++++--- src/gallium/auxiliary/util/u_draw.h | 9 ++++--- src/gallium/auxiliary/util/u_dump_state.c | 2 -- src/gallium/auxiliary/util/u_prim_restart.c | 3 ++- src/gallium/auxiliary/util/u_prim_restart.h | 1 + .../auxiliary/util/u_threaded_context.c | 21 +++++++++------ .../auxiliary/util/u_threaded_context.h | 1 + src/gallium/auxiliary/util/u_vbuf.c | 12 +++++---- src/gallium/auxiliary/util/u_vbuf.h | 1 + src/gallium/drivers/d3d12/d3d12_context.h | 1 + src/gallium/drivers/d3d12/d3d12_draw.cpp | 7 ++--- src/gallium/drivers/etnaviv/etnaviv_context.c | 5 ++-- src/gallium/drivers/freedreno/a2xx/fd2_draw.c | 1 + src/gallium/drivers/freedreno/a3xx/fd3_draw.c | 2 ++ src/gallium/drivers/freedreno/a3xx/fd3_emit.h | 1 + src/gallium/drivers/freedreno/a4xx/fd4_draw.c | 2 ++ src/gallium/drivers/freedreno/a4xx/fd4_emit.h | 1 + src/gallium/drivers/freedreno/a5xx/fd5_draw.c | 2 ++ src/gallium/drivers/freedreno/a5xx/fd5_emit.h | 1 + src/gallium/drivers/freedreno/a6xx/fd6_draw.c | 2 ++ src/gallium/drivers/freedreno/a6xx/fd6_emit.h | 1 + .../drivers/freedreno/freedreno_blitter.c | 2 +- .../drivers/freedreno/freedreno_context.h | 1 + .../drivers/freedreno/freedreno_draw.c | 9 ++++--- src/gallium/drivers/i915/i915_context.c | 5 ++-- src/gallium/drivers/iris/iris_context.h | 1 + src/gallium/drivers/iris/iris_draw.c | 24 +++++++++-------- src/gallium/drivers/iris/iris_screen.h | 1 + src/gallium/drivers/iris/iris_state.c | 7 ++--- src/gallium/drivers/lima/lima_draw.c | 3 ++- src/gallium/drivers/llvmpipe/lp_draw_arrays.c | 3 ++- .../drivers/nouveau/nv30/nv30_context.h | 1 + src/gallium/drivers/nouveau/nv30/nv30_draw.c | 3 ++- src/gallium/drivers/nouveau/nv30/nv30_vbo.c | 5 ++-- .../drivers/nouveau/nv50/nv50_context.h | 2 +- src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 3 ++- .../drivers/nouveau/nvc0/nvc0_context.h | 3 ++- src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c | 12 +++++---- .../drivers/nouveau/nvc0/nvc0_vbo_translate.c | 3 ++- src/gallium/drivers/panfrost/pan_context.c | 15 +++++++---- src/gallium/drivers/r300/r300_render.c | 8 +++--- .../drivers/r300/r300_render_stencilref.c | 8 +++--- src/gallium/drivers/r600/r600_state_common.c | 3 ++- .../radeonsi/si_compute_prim_discard.c | 9 ++++--- src/gallium/drivers/radeonsi/si_pipe.h | 2 ++ .../drivers/radeonsi/si_state_draw.cpp | 14 +++++----- src/gallium/drivers/softpipe/sp_draw_arrays.c | 5 ++-- src/gallium/drivers/softpipe/sp_state.h | 1 + src/gallium/drivers/svga/svga_pipe_draw.c | 7 ++--- src/gallium/drivers/svga/svga_swtnl.h | 1 + src/gallium/drivers/svga/svga_swtnl_draw.c | 3 ++- src/gallium/drivers/swr/swr_draw.cpp | 6 +++-- src/gallium/drivers/tegra/tegra_context.c | 5 ++-- src/gallium/drivers/v3d/v3dx_draw.c | 7 ++--- src/gallium/drivers/vc4/vc4_draw.c | 5 ++-- src/gallium/drivers/virgl/virgl_context.c | 7 ++--- src/gallium/drivers/virgl/virgl_encode.c | 3 ++- src/gallium/drivers/virgl/virgl_encode.h | 1 + src/gallium/drivers/zink/zink_context.h | 1 + src/gallium/drivers/zink/zink_draw.c | 7 ++--- src/gallium/frontends/lavapipe/lvp_execute.c | 10 +++---- src/gallium/frontends/nine/device9.c | 2 +- src/gallium/frontends/nine/nine_state.c | 6 ++--- src/gallium/include/pipe/p_context.h | 2 ++ src/gallium/include/pipe/p_state.h | 2 +- src/gallium/tests/graw/tri-instanced.c | 2 +- src/mesa/main/dd.h | 2 ++ src/mesa/main/draw.c | 27 ++++++++++--------- src/mesa/main/draw.h | 2 ++ src/mesa/state_tracker/st_draw.c | 13 ++++----- src/mesa/state_tracker/st_draw_feedback.c | 3 +-- src/mesa/vbo/vbo_exec_draw.c | 2 +- src/mesa/vbo/vbo_save_draw.c | 4 +-- 84 files changed, 257 insertions(+), 156 deletions(-) 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); }