zink: store last index buffer

this allows skipping some draw-time ops when the same index buffer
is used repeatedly

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37318>
This commit is contained in:
Mike Blumenkrantz 2025-02-13 11:12:09 -05:00 committed by Marge Bot
parent 03239662c3
commit 07a7d3627f
3 changed files with 12 additions and 3 deletions

View file

@ -3726,6 +3726,7 @@ flush_batch(struct zink_context *ctx, bool sync)
ctx->oom_stall = false;
ctx->dd.bindless_bound = false;
ctx->di.bindless_refs_dirty = true;
ctx->index_buffer = NULL;
ctx->sample_locations_changed = ctx->gfx_pipeline_state.sample_locations_enabled;
if (zink_screen(ctx->base.screen)->info.dynamic_state2_feats.extendedDynamicState2PatchControlPoints) {
VKCTX(CmdSetPatchControlPointsEXT)(ctx->bs->cmdbuf, ctx->gfx_pipeline_state.dyn_state2.vertices_per_patch);
@ -5346,6 +5347,8 @@ zink_context_replace_buffer_storage(struct pipe_context *pctx, struct pipe_resou
unsigned rebind_count = num_rebinds ? rebind_buffer(ctx, d, rebind_mask, num_rebinds) : 0;
if (rebind_count != d->bind_count[0] + d->bind_count[1])
ctx->buffer_rebind_counter = p_atomic_inc_return(&screen->buffer_rebind_counter);
if (ctx->index_buffer == dst)
ctx->index_buffer = NULL;
}
static bool

View file

@ -387,12 +387,15 @@ zink_draw(struct pipe_context *pctx,
zink_batch_reference_resource_move(ctx, zink_resource(index_buffer));
else
zink_batch_reference_resource(ctx, zink_resource(index_buffer));
} else {
index_buffer = dinfo->index.resource;
} else if (BATCH_CHANGED || ctx->index_buffer != dinfo->index.resource || ctx->index_size != dinfo->index_size) {
ctx->index_buffer = index_buffer = dinfo->index.resource;
ctx->index_size = dinfo->index_size;
zink_batch_resource_usage_set(ctx->bs, zink_resource(index_buffer), false, true);
}
assert(index_size <= 4 && index_size != 3);
assert(index_size != 1 || screen->info.have_EXT_index_type_uint8);
} else {
ctx->index_buffer = NULL;
}
ctx->was_line_loop = dinfo->was_line_loop;
@ -503,7 +506,7 @@ zink_draw(struct pipe_context *pctx,
zink_set_primitive_emulation_keys(ctx);
}
if (index_size) {
if (index_buffer) {
const VkIndexType index_type[3] = {
VK_INDEX_TYPE_UINT8_EXT,
VK_INDEX_TYPE_UINT16,

View file

@ -1925,6 +1925,9 @@ struct zink_context {
uint32_t ds3_states;
unsigned work_count;
struct pipe_resource *index_buffer; //last index buffer
unsigned index_size;
uint32_t num_so_targets;
struct pipe_stream_output_target *so_targets[PIPE_MAX_SO_BUFFERS];
bool dirty_so_targets;