From 1dfa19c541d2d1da1ba3f440d4d0107c4968b3e0 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 9 Jun 2022 09:19:18 -0400 Subject: [PATCH] zink: keep a count of async presents occuring for a given swapchain this provides info about whether a swapchain is in use in another thread Fixes: 8ade5588e39 ("zink: add kopper api") Reviewed-by: Adam Jackson Part-of: --- src/gallium/drivers/zink/zink_kopper.c | 5 ++++- src/gallium/drivers/zink/zink_kopper.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c index 3cdff02dab9..cfce107f1be 100644 --- a/src/gallium/drivers/zink/zink_kopper.c +++ b/src/gallium/drivers/zink/zink_kopper.c @@ -634,6 +634,8 @@ kopper_present(void *data, void *gdata, int thread_idx) _mesa_hash_table_insert(swapchain->presents, (void*)(uintptr_t)next, arr); } util_dynarray_append(arr, VkSemaphore, cpi->sem); + if (thread_idx != -1) + p_atomic_dec(&swapchain->async_presents); free(cpi); } @@ -660,10 +662,11 @@ zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res) cpi->info.pResults = NULL; res->obj->present = VK_NULL_HANDLE; if (util_queue_is_initialized(&screen->flush_queue)) { + p_atomic_inc(&cpi->swapchain->async_presents); util_queue_add_job(&screen->flush_queue, cpi, &cdt->present_fence, kopper_present, NULL, 0); } else { - kopper_present(cpi, screen, 0); + kopper_present(cpi, screen, -1); } res->obj->acquire = VK_NULL_HANDLE; res->obj->indefinite_acquire = res->obj->acquired = false; diff --git a/src/gallium/drivers/zink/zink_kopper.h b/src/gallium/drivers/zink/zink_kopper.h index 01a3ccabaa1..836dac0c9a0 100644 --- a/src/gallium/drivers/zink/zink_kopper.h +++ b/src/gallium/drivers/zink/zink_kopper.h @@ -41,6 +41,7 @@ struct kopper_swapchain { VkSwapchainCreateInfoKHR scci; unsigned num_acquires; unsigned max_acquires; + unsigned async_presents; }; enum kopper_type {