From 07a7d3627f5f888909a6b3f48d865171e7b4629a Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 13 Feb 2025 11:12:09 -0500 Subject: [PATCH] zink: store last index buffer this allows skipping some draw-time ops when the same index buffer is used repeatedly Part-of: --- src/gallium/drivers/zink/zink_context.c | 3 +++ src/gallium/drivers/zink/zink_draw.cpp | 9 ++++++--- src/gallium/drivers/zink/zink_types.h | 3 +++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 5678f7da641..4073e229750 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -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 diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 2a0be73d89f..6e944b3a584 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -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, diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 48c29b77e3d..2f51a8a53ee 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -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;