From c47378fb0fd4334c7c38cf8dd9a4a3505ec76ef9 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 22 Jun 2022 11:46:35 -0400 Subject: [PATCH] zink: move to AoS for storing swapchain struct data this is a bit less cumbersome Reviewed-by: Adam Jackson Part-of: --- src/gallium/drivers/zink/zink_kopper.c | 29 +++++++++++++++-------------- src/gallium/drivers/zink/zink_kopper.h | 11 ++++++++--- src/gallium/drivers/zink/zink_surface.c | 2 +- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c index 68022a8..b07f4b0 100644 --- a/src/gallium/drivers/zink/zink_kopper.c +++ b/src/gallium/drivers/zink/zink_kopper.c @@ -125,12 +125,10 @@ destroy_swapchain(struct zink_screen *screen, struct kopper_swapchain *cswap) { if (!cswap) return; - free(cswap->images); - free(cswap->inits); for (unsigned i = 0; i < cswap->num_images; i++) { - VKSCR(DestroySemaphore)(screen->dev, cswap->acquires[i], NULL); + VKSCR(DestroySemaphore)(screen->dev, cswap->images[i].acquire, NULL); } - free(cswap->acquires); + free(cswap->images); hash_table_foreach(cswap->presents, he) { struct util_dynarray *arr = he->data; while (util_dynarray_contains(arr, VkSemaphore)) @@ -298,12 +296,15 @@ kopper_GetSwapchainImages(struct zink_screen *screen, struct kopper_swapchain *c zink_screen_handle_vkresult(screen, error); if (error != VK_SUCCESS) return error; - cswap->images = malloc(sizeof(VkImage) * cswap->num_images); - cswap->acquires = calloc(cswap->num_images, sizeof(VkSemaphore)); - cswap->inits = calloc(cswap->num_images, sizeof(bool)); + cswap->images = calloc(cswap->num_images, sizeof(struct kopper_swapchain_image)); cswap->presents = _mesa_hash_table_create_u32_keys(NULL); - error = VKSCR(GetSwapchainImagesKHR)(screen->dev, cswap->swapchain, &cswap->num_images, cswap->images); - zink_screen_handle_vkresult(screen, error); + VkImage images[32]; + error = VKSCR(GetSwapchainImagesKHR)(screen->dev, cswap->swapchain, &cswap->num_images, images); + assert(cswap->num_images <= ARRAY_SIZE(images)); + if (zink_screen_handle_vkresult(screen, error)) { + for (unsigned i = 0; i < cswap->num_images; i++) + cswap->images[i].image = images[i]; + } return error; } @@ -495,13 +496,13 @@ kopper_acquire(struct zink_screen *screen, struct zink_resource *res, uint64_t t break; } - cdt->swapchain->acquires[res->obj->dt_idx] = res->obj->acquire = acquire; - res->obj->image = cdt->swapchain->images[res->obj->dt_idx]; + 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; - if (!cdt->swapchain->inits[res->obj->dt_idx]) { + if (!cdt->swapchain->images[res->obj->dt_idx].init) { /* swapchain images are initially in the UNDEFINED layout */ res->layout = VK_IMAGE_LAYOUT_UNDEFINED; - cdt->swapchain->inits[res->obj->dt_idx] = true; + cdt->swapchain->images[res->obj->dt_idx].init = true; } if (timeout == UINT64_MAX) { res->obj->indefinite_acquire = true; @@ -573,7 +574,7 @@ zink_kopper_acquire_submit(struct zink_screen *screen, struct zink_resource *res assert(res->obj->acquire); res->obj->acquired = true; /* this is now owned by the batch */ - cdt->swapchain->acquires[res->obj->dt_idx] = VK_NULL_HANDLE; + cdt->swapchain->images[res->obj->dt_idx].acquire = VK_NULL_HANDLE; cdt->swapchain->dt_has_data = true; return res->obj->acquire; } diff --git a/src/gallium/drivers/zink/zink_kopper.h b/src/gallium/drivers/zink/zink_kopper.h index c35dd8c..d261c2c 100644 --- a/src/gallium/drivers/zink/zink_kopper.h +++ b/src/gallium/drivers/zink/zink_kopper.h @@ -29,14 +29,18 @@ #include "kopper_interface.h" +struct kopper_swapchain_image { + bool init; + VkImage image; + VkSemaphore acquire; +}; + struct kopper_swapchain { struct kopper_swapchain *next; VkSwapchainKHR swapchain; - VkImage *images; - bool *inits; + unsigned last_present; unsigned num_images; - VkSemaphore *acquires; uint32_t last_present_prune; struct hash_table *presents; VkSwapchainCreateInfoKHR scci; @@ -44,6 +48,7 @@ struct kopper_swapchain { unsigned max_acquires; unsigned async_presents; bool dt_has_data; + struct kopper_swapchain_image *images; }; enum kopper_type { diff --git a/src/gallium/drivers/zink/zink_surface.c b/src/gallium/drivers/zink/zink_surface.c index bd29f53..aee2f3a 100644 --- a/src/gallium/drivers/zink/zink_surface.c +++ b/src/gallium/drivers/zink/zink_surface.c @@ -441,7 +441,7 @@ zink_surface_swapchain_update(struct zink_context *ctx, struct zink_surface *sur init_surface_info(surface, res, &surface->ivci); } if (!surface->swapchain[res->obj->dt_idx]) { - assert(res->obj->image && cdt->swapchain->images[res->obj->dt_idx] == res->obj->image); + assert(res->obj->image && cdt->swapchain->images[res->obj->dt_idx].image == res->obj->image); surface->ivci.image = res->obj->image; assert(surface->ivci.image); VKSCR(CreateImageView)(screen->dev, &surface->ivci, NULL, &surface->swapchain[res->obj->dt_idx]); -- 2.7.4