gallium: split drawid out of pipe_draw_info and as a separate draw_vbo param
the only case in which this is nonzero is if a multidraw gets split by the frontend, i.e., mesa core, and in all other cases it can be ignored. the value can also be ignored for all indirect draws, though it seems many (most?) gallium drivers are not aware of this Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10166>
This commit is contained in:
parent
7ed8e5db3a
commit
dae3113c3d
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -963,6 +963,7 @@ static void si_emit_draw_registers(struct si_context *sctx,
|
|||
|
||||
template <chip_class GFX_VERSION, si_has_ngg NGG, si_has_prim_discard_cs ALLOW_PRIM_DISCARD_CS>
|
||||
static void si_emit_draw_packets(struct si_context *sctx, const struct pipe_draw_info *info,
|
||||
unsigned drawid_base,
|
||||
const struct pipe_draw_indirect_info *indirect,
|
||||
const struct pipe_draw_start_count_bias *draws,
|
||||
unsigned num_draws,
|
||||
|
@ -1056,7 +1057,6 @@ static void si_emit_draw_packets(struct si_context *sctx, const struct pipe_draw
|
|||
|
||||
unsigned sh_base_reg = sctx->shader_pointers.sh_base[PIPE_SHADER_VERTEX];
|
||||
bool render_cond_bit = sctx->render_cond_enabled;
|
||||
unsigned drawid_base = info->drawid;
|
||||
|
||||
if (indirect) {
|
||||
assert(num_draws == 1);
|
||||
|
@ -1734,6 +1734,7 @@ template <chip_class GFX_VERSION, si_has_tess HAS_TESS, si_has_gs HAS_GS, si_has
|
|||
si_has_prim_discard_cs ALLOW_PRIM_DISCARD_CS>
|
||||
static void si_draw_vbo(struct pipe_context *ctx,
|
||||
const struct pipe_draw_info *info,
|
||||
unsigned drawid_offset,
|
||||
const struct pipe_draw_indirect_info *indirect,
|
||||
const struct pipe_draw_start_count_bias *draws,
|
||||
unsigned num_draws)
|
||||
|
@ -1951,7 +1952,7 @@ static void si_draw_vbo(struct pipe_context *ctx,
|
|||
(instance_count == 1 ||
|
||||
(instance_count <= USHRT_MAX && index_size && index_size <= 2) ||
|
||||
pd_msg("instance_count too large or index_size == 4 or DrawArraysInstanced"))) &&
|
||||
((info->drawid == 0 && (num_draws == 1 || !info->increment_draw_id)) ||
|
||||
((drawid_offset == 0 && (num_draws == 1 || !info->increment_draw_id)) ||
|
||||
!sctx->shader.vs.cso->info.uses_drawid || pd_msg("draw_id > 0")) &&
|
||||
(!sctx->render_cond || pd_msg("render condition")) &&
|
||||
/* Forced enablement ignores pipeline statistics queries. */
|
||||
|
@ -1978,7 +1979,7 @@ static void si_draw_vbo(struct pipe_context *ctx,
|
|||
* dispatches can run ahead. */
|
||||
(si_all_vs_resources_read_only(sctx, index_size ? indexbuf : NULL) ||
|
||||
pd_msg("write reference"))) {
|
||||
switch (si_prepare_prim_discard_or_split_draw(sctx, info, draws, num_draws,
|
||||
switch (si_prepare_prim_discard_or_split_draw(sctx, info, drawid_offset, draws, num_draws,
|
||||
primitive_restart, total_direct_count)) {
|
||||
case SI_PRIM_DISCARD_ENABLED:
|
||||
original_index_size = index_size;
|
||||
|
@ -2191,7 +2192,7 @@ static void si_draw_vbo(struct pipe_context *ctx,
|
|||
|
||||
si_emit_draw_packets<GFX_VERSION, NGG,
|
||||
!HAS_TESS && !HAS_GS ? PRIM_DISCARD_CS_OFF : ALLOW_PRIM_DISCARD_CS>
|
||||
(sctx, info, indirect, draws, num_draws, indexbuf, index_size,
|
||||
(sctx, info, drawid_offset, indirect, draws, num_draws, indexbuf, index_size,
|
||||
index_offset, instance_count, dispatch_prim_discard_cs,
|
||||
original_index_size);
|
||||
/* <-- CUs are busy here. */
|
||||
|
@ -2231,7 +2232,7 @@ static void si_draw_vbo(struct pipe_context *ctx,
|
|||
|
||||
si_emit_draw_packets<GFX_VERSION, NGG,
|
||||
!HAS_TESS && !HAS_GS ? PRIM_DISCARD_CS_OFF : ALLOW_PRIM_DISCARD_CS>
|
||||
(sctx, info, indirect, draws, num_draws, indexbuf, index_size,
|
||||
(sctx, info, drawid_offset, indirect, draws, num_draws, indexbuf, index_size,
|
||||
index_offset, instance_count,
|
||||
dispatch_prim_discard_cs, original_index_size);
|
||||
|
||||
|
@ -2312,7 +2313,7 @@ static void si_draw_rectangle(struct blitter_context *blitter, void *vertex_elem
|
|||
sctx->vertex_buffer_pointer_dirty = false;
|
||||
sctx->vertex_buffer_user_sgprs_dirty = false;
|
||||
|
||||
pipe->draw_vbo(pipe, &info, NULL, &draw, 1);
|
||||
pipe->draw_vbo(pipe, &info, 0, NULL, &draw, 1);
|
||||
}
|
||||
|
||||
extern "C"
|
||||
|
@ -2377,6 +2378,7 @@ static void si_init_draw_vbo_all_families(struct si_context *sctx)
|
|||
|
||||
static void si_invalid_draw_vbo(struct pipe_context *pipe,
|
||||
const struct pipe_draw_info *info,
|
||||
unsigned drawid_offset,
|
||||
const struct pipe_draw_indirect_info *indirect,
|
||||
const struct pipe_draw_start_count_bias *draws,
|
||||
unsigned num_draws)
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue