mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 09:00:10 +01:00
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:
parent
03239662c3
commit
07a7d3627f
3 changed files with 12 additions and 3 deletions
|
|
@ -3726,6 +3726,7 @@ flush_batch(struct zink_context *ctx, bool sync)
|
||||||
ctx->oom_stall = false;
|
ctx->oom_stall = false;
|
||||||
ctx->dd.bindless_bound = false;
|
ctx->dd.bindless_bound = false;
|
||||||
ctx->di.bindless_refs_dirty = true;
|
ctx->di.bindless_refs_dirty = true;
|
||||||
|
ctx->index_buffer = NULL;
|
||||||
ctx->sample_locations_changed = ctx->gfx_pipeline_state.sample_locations_enabled;
|
ctx->sample_locations_changed = ctx->gfx_pipeline_state.sample_locations_enabled;
|
||||||
if (zink_screen(ctx->base.screen)->info.dynamic_state2_feats.extendedDynamicState2PatchControlPoints) {
|
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);
|
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;
|
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])
|
if (rebind_count != d->bind_count[0] + d->bind_count[1])
|
||||||
ctx->buffer_rebind_counter = p_atomic_inc_return(&screen->buffer_rebind_counter);
|
ctx->buffer_rebind_counter = p_atomic_inc_return(&screen->buffer_rebind_counter);
|
||||||
|
if (ctx->index_buffer == dst)
|
||||||
|
ctx->index_buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
|
|
||||||
|
|
@ -387,12 +387,15 @@ zink_draw(struct pipe_context *pctx,
|
||||||
zink_batch_reference_resource_move(ctx, zink_resource(index_buffer));
|
zink_batch_reference_resource_move(ctx, zink_resource(index_buffer));
|
||||||
else
|
else
|
||||||
zink_batch_reference_resource(ctx, zink_resource(index_buffer));
|
zink_batch_reference_resource(ctx, zink_resource(index_buffer));
|
||||||
} else {
|
} else if (BATCH_CHANGED || ctx->index_buffer != dinfo->index.resource || ctx->index_size != dinfo->index_size) {
|
||||||
index_buffer = dinfo->index.resource;
|
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);
|
zink_batch_resource_usage_set(ctx->bs, zink_resource(index_buffer), false, true);
|
||||||
}
|
}
|
||||||
assert(index_size <= 4 && index_size != 3);
|
assert(index_size <= 4 && index_size != 3);
|
||||||
assert(index_size != 1 || screen->info.have_EXT_index_type_uint8);
|
assert(index_size != 1 || screen->info.have_EXT_index_type_uint8);
|
||||||
|
} else {
|
||||||
|
ctx->index_buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->was_line_loop = dinfo->was_line_loop;
|
ctx->was_line_loop = dinfo->was_line_loop;
|
||||||
|
|
@ -503,7 +506,7 @@ zink_draw(struct pipe_context *pctx,
|
||||||
zink_set_primitive_emulation_keys(ctx);
|
zink_set_primitive_emulation_keys(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index_size) {
|
if (index_buffer) {
|
||||||
const VkIndexType index_type[3] = {
|
const VkIndexType index_type[3] = {
|
||||||
VK_INDEX_TYPE_UINT8_EXT,
|
VK_INDEX_TYPE_UINT8_EXT,
|
||||||
VK_INDEX_TYPE_UINT16,
|
VK_INDEX_TYPE_UINT16,
|
||||||
|
|
|
||||||
|
|
@ -1925,6 +1925,9 @@ struct zink_context {
|
||||||
uint32_t ds3_states;
|
uint32_t ds3_states;
|
||||||
unsigned work_count;
|
unsigned work_count;
|
||||||
|
|
||||||
|
struct pipe_resource *index_buffer; //last index buffer
|
||||||
|
unsigned index_size;
|
||||||
|
|
||||||
uint32_t num_so_targets;
|
uint32_t num_so_targets;
|
||||||
struct pipe_stream_output_target *so_targets[PIPE_MAX_SO_BUFFERS];
|
struct pipe_stream_output_target *so_targets[PIPE_MAX_SO_BUFFERS];
|
||||||
bool dirty_so_targets;
|
bool dirty_so_targets;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue