zink: simplify swapchain imageview handling
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 25 Oct 2022 17:34:01 +0000 (13:34 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 27 Oct 2022 14:43:50 +0000 (14:43 +0000)
the zink_resource_object::views array already handles this, so don't
duplicate its functionality

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19307>

src/gallium/drivers/zink/zink_batch.c
src/gallium/drivers/zink/zink_surface.c
src/gallium/drivers/zink/zink_types.h

index 28c60d8..7063463 100644 (file)
@@ -149,10 +149,6 @@ zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs)
    util_dynarray_init(&bs->wait_semaphores, NULL);
    bs->swapchain = NULL;
 
-   /* swapchain views are managed independent of the owner resource */
-   while (util_dynarray_contains(&bs->dead_swapchains, VkImageView))
-      VKSCR(DestroyImageView)(screen->dev, util_dynarray_pop(&bs->dead_swapchains, VkImageView), NULL);
-
    /* only reset submitted here so that tc fence desync can pick up the 'completed' flag
     * before the state is reused
     */
@@ -275,7 +271,6 @@ zink_batch_state_destroy(struct zink_screen *screen, struct zink_batch_state *bs
    util_dynarray_fini(&bs->acquires);
    util_dynarray_fini(&bs->unref_semaphores);
    util_dynarray_fini(&bs->acquire_flags);
-   util_dynarray_fini(&bs->dead_swapchains);
    zink_batch_descriptor_deinit(screen, bs);
    ralloc_free(bs);
 }
@@ -333,7 +328,6 @@ create_batch_state(struct zink_context *ctx)
    util_dynarray_init(&bs->acquires, NULL);
    util_dynarray_init(&bs->unref_semaphores, NULL);
    util_dynarray_init(&bs->acquire_flags, NULL);
-   util_dynarray_init(&bs->dead_swapchains, NULL);
    util_dynarray_init(&bs->bindless_releases[0], NULL);
    util_dynarray_init(&bs->bindless_releases[1], NULL);
    util_dynarray_init(&bs->swapchain_obj, NULL);
index 32442b4..78badb3 100644 (file)
@@ -327,8 +327,6 @@ zink_destroy_surface(struct zink_screen *screen, struct pipe_surface *psurface)
    if (surface->simage_view)
       util_dynarray_append(&res->obj->views, VkImageView, surface->simage_view);
    if (surface->is_swapchain) {
-      for (unsigned i = 0; i < surface->old_swapchain_size; i++)
-         util_dynarray_append(&res->obj->views, VkImageView, surface->old_swapchain[i]);
       for (unsigned i = 0; i < surface->swapchain_size; i++)
          util_dynarray_append(&res->obj->views, VkImageView, surface->swapchain[i]);
       free(surface->swapchain);
@@ -440,12 +438,12 @@ zink_surface_swapchain_update(struct zink_context *ctx, struct zink_surface *sur
    if (!cdt)
       return; //dead swapchain
    if (res->obj->dt != surface->dt) {
-      /* new swapchain: clear out previous old_swapchain and move current swapchain there */
-      for (unsigned i = 0; i < surface->old_swapchain_size; i++)
-         util_dynarray_append(&ctx->batch.state->dead_swapchains, VkImageView, surface->old_swapchain[i]);
-      free(surface->old_swapchain);
-      surface->old_swapchain = surface->swapchain;
-      surface->old_swapchain_size = surface->swapchain_size;
+      /* new swapchain: clear out previous swapchain imageviews/array and setup a new one */
+      simple_mtx_lock(&res->obj->view_lock);
+      for (unsigned i = 0; i < surface->swapchain_size; i++)
+         util_dynarray_append(&res->obj->views, VkImageView, surface->swapchain[i]);
+      simple_mtx_unlock(&res->obj->view_lock);
+      free(surface->swapchain);
       surface->swapchain_size = cdt->swapchain->num_images;
       surface->swapchain = calloc(surface->swapchain_size, sizeof(VkImageView));
       surface->base.width = res->base.b.width0;
index 858c774..2ece664 100644 (file)
@@ -502,7 +502,6 @@ struct zink_batch_state {
    struct zink_resource *swapchain;
    struct util_dynarray acquires;
    struct util_dynarray acquire_flags;
-   struct util_dynarray dead_swapchains;
    struct util_dynarray unref_semaphores;
 
    struct util_queue_fence flush_completed;
@@ -1317,8 +1316,6 @@ struct zink_surface {
    void *dt;
    VkImageView *swapchain;
    unsigned swapchain_size;
-   VkImageView *old_swapchain;
-   unsigned old_swapchain_size;
    VkImageView simage_view;//old iview after storage replacement/rebind
    void *obj; //backing resource object
    uint32_t hash;