From 92228a6d283c763aa80b955d68420dec293bdd4b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 21 Jun 2022 10:59:55 -0400 Subject: [PATCH] zink: move 'acquired' flag onto swapchain struct Reviewed-by: Adam Jackson Part-of: --- src/gallium/drivers/zink/zink_batch.c | 2 +- src/gallium/drivers/zink/zink_kopper.c | 13 +++++++------ src/gallium/drivers/zink/zink_kopper.h | 7 +++++++ src/gallium/drivers/zink/zink_resource.h | 1 - src/gallium/drivers/zink/zink_screen.c | 4 ++-- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 1b3b5d62e45..31e17d53468 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -469,7 +469,7 @@ zink_end_batch(struct zink_context *ctx, struct zink_batch *batch) batch->work_count = 0; if (batch->swapchain) { - if (batch->swapchain->obj->acquired && !batch->swapchain->obj->present) { + if (zink_kopper_acquired(batch->swapchain->obj->dt, batch->swapchain->obj->dt_idx) && !batch->swapchain->obj->present) { batch->state->present = zink_kopper_present(screen, batch->swapchain); batch->state->swapchain = batch->swapchain; } diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c index b07f4b030ad..49179357a00 100644 --- a/src/gallium/drivers/zink/zink_kopper.c +++ b/src/gallium/drivers/zink/zink_kopper.c @@ -498,7 +498,7 @@ kopper_acquire(struct zink_screen *screen, struct zink_resource *res, uint64_t t cdt->swapchain->images[res->obj->dt_idx].acquire = res->obj->acquire = acquire; res->obj->image = cdt->swapchain->images[res->obj->dt_idx].image; - res->obj->acquired = false; + cdt->swapchain->images[res->obj->dt_idx].acquired = false; if (!cdt->swapchain->images[res->obj->dt_idx].init) { /* swapchain images are initially in the UNDEFINED layout */ res->layout = VK_IMAGE_LAYOUT_UNDEFINED; @@ -569,10 +569,10 @@ zink_kopper_acquire_submit(struct zink_screen *screen, struct zink_resource *res { assert(res->obj->dt); struct kopper_displaytarget *cdt = kopper_displaytarget(res->obj->dt); - if (res->obj->acquired) + if (zink_kopper_acquired(res->obj->dt, res->obj->dt_idx)) return VK_NULL_HANDLE; assert(res->obj->acquire); - res->obj->acquired = true; + cdt->swapchain->images[res->obj->dt_idx].acquired = true; /* this is now owned by the batch */ cdt->swapchain->images[res->obj->dt_idx].acquire = VK_NULL_HANDLE; cdt->swapchain->dt_has_data = true; @@ -589,7 +589,7 @@ zink_kopper_present(struct zink_screen *screen, struct zink_resource *res) NULL, 0 }; - assert(res->obj->acquired); + assert(zink_kopper_acquired(res->obj->dt, res->obj->dt_idx)); VkResult ret = VKSCR(CreateSemaphore)(screen->dev, &sci, NULL, &res->obj->present); return zink_screen_handle_vkresult(screen, ret) ? res->obj->present : VK_NULL_HANDLE; } @@ -698,7 +698,7 @@ zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res) { assert(res->obj->dt); struct kopper_displaytarget *cdt = kopper_displaytarget(res->obj->dt); - assert(res->obj->acquired); + assert(zink_kopper_acquired(res->obj->dt, res->obj->dt_idx)); assert(res->obj->present); struct kopper_present_info *cpi = malloc(sizeof(struct kopper_present_info)); cpi->sem = res->obj->present; @@ -723,7 +723,8 @@ zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res) kopper_present(cpi, screen, -1); } res->obj->acquire = VK_NULL_HANDLE; - res->obj->indefinite_acquire = res->obj->acquired = false; + res->obj->indefinite_acquire = false; + cdt->swapchain->images[res->obj->dt_idx].acquired = false; res->obj->dt_idx = UINT32_MAX; } diff --git a/src/gallium/drivers/zink/zink_kopper.h b/src/gallium/drivers/zink/zink_kopper.h index d261c2c5a24..a62c6a14860 100644 --- a/src/gallium/drivers/zink/zink_kopper.h +++ b/src/gallium/drivers/zink/zink_kopper.h @@ -31,6 +31,7 @@ struct kopper_swapchain_image { bool init; + bool acquired; VkImage image; VkSemaphore acquire; }; @@ -97,6 +98,12 @@ zink_kopper_last_present_eq(const struct kopper_displaytarget *cdt, uint32_t idx return cdt->swapchain->last_present == idx; } +static inline bool +zink_kopper_acquired(const struct kopper_displaytarget *cdt, uint32_t idx) +{ + return idx != UINT32_MAX && cdt->swapchain->images[idx].acquired; +} + struct kopper_displaytarget * zink_kopper_displaytarget_create(struct zink_screen *screen, unsigned tex_usage, enum pipe_format format, unsigned width, diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index ea091ceb366..84bdec3798c 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -90,7 +90,6 @@ struct zink_resource_object { uint32_t last_dt_idx; VkSemaphore acquire; VkSemaphore present; - bool acquired; bool new_dt; bool dt_has_data; bool indefinite_acquire; diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 6d47b67cab3..b3b53ae7686 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1422,7 +1422,7 @@ zink_flush_frontbuffer(struct pipe_screen *pscreen, /* if the surface has never been acquired, there's nothing to present, * so this is a no-op */ - if (!res->obj->acquired && res->obj->last_dt_idx == UINT32_MAX) + if (!zink_kopper_acquired(res->obj->dt, res->obj->dt_idx) && res->obj->last_dt_idx == UINT32_MAX) return; /* need to get the actual zink_context, not the threaded context */ @@ -1438,7 +1438,7 @@ zink_flush_frontbuffer(struct pipe_screen *pscreen, } } - if (res->obj->acquired) + if (zink_kopper_acquired(res->obj->dt, res->obj->dt_idx)) zink_kopper_present_queue(screen, res); else { assert(res->obj->last_dt_idx != UINT32_MAX);