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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21779>
This commit is contained in:
Mike Blumenkrantz 2023-03-07 13:40:20 -05:00 committed by Marge Bot
parent aaca91eb79
commit 46f98da188
4 changed files with 7 additions and 0 deletions

View file

@ -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) {

View file

@ -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);

View file

@ -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

View file

@ -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