Skip to content
Snippets Groups Projects
Commit f11d7948 authored by Mike Blumenkrantz's avatar Mike Blumenkrantz :lifter: Committed by Dylan Baker
Browse files

zink: defer old swapchain destruction


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

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

Reviewed-by: Adam Jackson's avatarAdam Jackson <ajax@redhat.com>
Part-of: <mesa/mesa!16932>
(cherry picked from commit 4bee678d)
parent a86a20ed
No related branches found
No related tags found
No related merge requests found
......@@ -22,7 +22,7 @@
"description": "zink: defer old swapchain destruction",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "8ade5588e39d736bdeab9bdd8ffa7cbfb6a5191e"
},
......
......@@ -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);
......
......@@ -30,6 +30,7 @@
#include "kopper_interface.h"
struct kopper_swapchain {
struct kopper_swapchain *next;
VkSwapchainKHR swapchain;
VkImage *images;
bool *inits;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment