diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 97f876a6053..e244a5fb4d7 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -33,6 +33,7 @@ reset_obj(struct zink_screen *screen, struct zink_batch_state *bs, struct zink_r obj->access = 0; obj->last_write = 0; obj->access_stage = 0; + obj->copies_need_reset = true; /* also prune dead view objects */ simple_mtx_lock(&obj->view_lock); if (obj->is_buffer) { diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 5d540da23b0..ad2ef7e3e3a 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3834,6 +3834,8 @@ zink_check_transfer_dst_barrier(struct zink_resource *res, unsigned level, const void zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_resource *res, unsigned level, const struct pipe_box *box) { + if (res->obj->copies_need_reset) + zink_resource_copies_reset(res); /* skip TRANSFER_DST barrier if no intersection from previous copies */ if (res->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || zink_resource_copy_box_intersects(res, level, box)) { zink_screen(ctx->base.screen)->image_barrier(ctx, res, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); @@ -3848,6 +3850,8 @@ zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_r void zink_resource_buffer_transfer_dst_barrier(struct zink_context *ctx, struct zink_resource *res, unsigned offset, unsigned size) { + if (res->obj->copies_need_reset) + zink_resource_copies_reset(res); struct pipe_box box = {offset, 0, 0, size, 0, 0}; /* must barrier if something read the valid buffer range */ bool valid_read = res->obj->access && util_ranges_intersect(&res->valid_buffer_range, offset, offset + size) && !unordered_res_exec(ctx, res, true); diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 5a9373cff57..b3f515850bb 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -2364,6 +2364,7 @@ zink_resource_copies_reset(struct zink_resource *res) for (unsigned i = 0; i < max_level; i++) util_dynarray_clear(&res->obj->copies[i]); res->obj->copies_valid = false; + res->obj->copies_need_reset = false; } static void diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 1d1f0bf23da..c12e4a4711e 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1120,6 +1120,7 @@ struct zink_resource_object { bool unordered_read; bool unordered_write; bool copies_valid; + bool copies_need_reset; //for use with batch state resets unsigned persistent_maps; //if nonzero, requires vkFlushMappedMemoryRanges during batch use struct util_dynarray copies[16]; //regions being copied to; for barrier omission