From 04b2fb80469cdc9a82309f0c6a559c4e7eef9ba0 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 10 Sep 2026 12:18:40 -0700 Subject: [PATCH] Make sure the palette is no longer in use before freeing it in the Vulkan renderer Fixes https://github.com/libsdl-org/SDL/issues/16283 --- src/render/vulkan/SDL_render_vulkan.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/render/vulkan/SDL_render_vulkan.c b/src/render/vulkan/SDL_render_vulkan.c index 9be5117116..2a5c4db155 100644 --- a/src/render/vulkan/SDL_render_vulkan.c +++ b/src/render/vulkan/SDL_render_vulkan.c @@ -2638,10 +2638,17 @@ static void VULKAN_DestroyPalette(SDL_Renderer *renderer, SDL_TexturePalette *pa VULKAN_RenderData *data = (VULKAN_RenderData *)renderer->internal; VULKAN_PaletteData *palettedata = (VULKAN_PaletteData *)palette->internal; - if (palettedata) { - VULKAN_DestroyImage(data, &palettedata->image); - SDL_free(palettedata); + if (!palettedata) { + return; } + + /* Because VULKAN_DestroyPalette might be called while the data is in-flight, we need to issue the batch first + Unfortunately, this means that deleting a lot of palettes mid-frame will have poor performance. */ + VULKAN_IssueBatch(data); + VULKAN_WaitForGPU(data); + + VULKAN_DestroyImage(data, &palettedata->image); + SDL_free(palettedata); } static bool VULKAN_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)