zink: defer old swapchain destruction

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

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

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16932>
This commit is contained in:
Mike Blumenkrantz 2022-06-09 09:20:01 -04:00 committed by Marge Bot
parent 1dfa19c541
commit 4bee678df3
2 changed files with 22 additions and 3 deletions

View File

@ -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);

View File

@ -30,6 +30,7 @@
#include "kopper_interface.h"
struct kopper_swapchain {
struct kopper_swapchain *next;
VkSwapchainKHR swapchain;
VkImage *images;
bool *inits;