Mesa (main): zink: defer old swapchain destruction

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 13 17:58:03 UTC 2022


Module: Mesa
Branch: main
Commit: 4bee678df3afb654c4f52987fefd039750609976
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4bee678df3afb654c4f52987fefd039750609976

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Jun  9 09:20:01 2022 -0400

zink: defer old swapchain destruction

ensure that swapchains that are about to be presented asynchronously
cannot be destroyed

Fixes: 8ade5588e39 ("zink: add kopper api")

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16932>

---

 src/gallium/drivers/zink/zink_kopper.c | 24 +++++++++++++++++++++---
 src/gallium/drivers/zink/zink_kopper.h |  1 +
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c
index cfce107f1be..a0302b66456 100644
--- a/src/gallium/drivers/zink/zink_kopper.c
+++ b/src/gallium/drivers/zink/zink_kopper.c
@@ -143,6 +143,21 @@ destroy_swapchain(struct zink_screen *screen, struct kopper_swapchain *cswap)
    free(cswap);
 }
 
+static void
+prune_old_swapchains(struct zink_screen *screen, struct kopper_displaytarget *cdt, bool wait)
+{
+   while (cdt->old_swapchain) {
+      struct kopper_swapchain *cswap = cdt->old_swapchain;
+      if (cswap->async_presents) {
+         if (wait)
+            continue;
+         return;
+      }
+      cdt->old_swapchain = cswap->next;
+      destroy_swapchain(screen, cswap);
+   }
+}
+
 static struct hash_entry *
 find_dt_entry(struct zink_screen *screen, const struct kopper_displaytarget *cdt)
 {
@@ -182,7 +197,7 @@ zink_kopper_deinit_displaytarget(struct zink_screen *screen, struct kopper_displ
    _mesa_hash_table_remove(&screen->dts, he);
    simple_mtx_unlock(&screen->dt_lock);
    destroy_swapchain(screen, cdt->swapchain);
-   destroy_swapchain(screen, cdt->old_swapchain);
+   prune_old_swapchains(screen, cdt, true);
    VKSCR(DestroySurfaceKHR)(screen->instance, cdt->surface, NULL);
    cdt->swapchain = cdt->old_swapchain = NULL;
    cdt->surface = VK_NULL_HANDLE;
@@ -309,8 +324,11 @@ update_swapchain(struct zink_screen *screen, struct kopper_displaytarget *cdt, u
    struct kopper_swapchain *cswap = kopper_CreateSwapchain(screen, cdt, w, h, &error);
    if (!cswap)
       return error;
-   destroy_swapchain(screen, cdt->old_swapchain);
-   cdt->old_swapchain = cdt->swapchain;
+   prune_old_swapchains(screen, cdt, false);
+   struct kopper_swapchain **pswap = &cdt->old_swapchain;
+   while (*pswap)
+      *pswap = (*pswap)->next;
+   *pswap = cdt->swapchain;
    cdt->swapchain = cswap;
 
    return kopper_GetSwapchainImages(screen, cdt->swapchain);
diff --git a/src/gallium/drivers/zink/zink_kopper.h b/src/gallium/drivers/zink/zink_kopper.h
index 836dac0c9a0..7e3e9d81beb 100644
--- a/src/gallium/drivers/zink/zink_kopper.h
+++ b/src/gallium/drivers/zink/zink_kopper.h
@@ -30,6 +30,7 @@
 #include "kopper_interface.h"
 
 struct kopper_swapchain {
+   struct kopper_swapchain *next;
    VkSwapchainKHR swapchain;
    VkImage *images;
    bool *inits;



More information about the mesa-commit mailing list