From 46f98da188c887576043ef71514ea45250efdc98 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 7 Mar 2023 13:40:20 -0500 Subject: [PATCH] zink: add a mechanism to trigger copy box resets from batch state reset the resource isn't available during batch state reset, so a new flag is needed to force a reset the next time the copy boxes would be used Part-of: --- src/gallium/drivers/zink/zink_batch.c | 1 + src/gallium/drivers/zink/zink_context.c | 4 ++++ src/gallium/drivers/zink/zink_resource.c | 1 + src/gallium/drivers/zink/zink_types.h | 1 + 4 files changed, 7 insertions(+) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 97f876a..e244a5f 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 5d540da..ad2ef7e 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 5a9373c..b3f5158 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 1d1f0bf..c12e4a4 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 -- 2.7.4