Просмотр исходного кода

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
Sam Lantinga 1 неделя назад
Родитель
Сommit
04b2fb8046
1 измененных файлов с 10 добавлено и 3 удалено
  1. 10 3
      src/render/vulkan/SDL_render_vulkan.c

+ 10 - 3
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)