Browse Source

GPU: Fix Vulkan backend never checking deallocations (#12567)

---------

Co-authored-by: Sam Lantinga <slouken@libsdl.org>
(cherry picked from commit 0bd70684b35ac6cae114e25a2fdca9f430e0b3b1)
Evan Hemsley 1 month ago
parent
commit
daf468e141
1 changed files with 8 additions and 4 deletions
  1. 8 4
      src/gpu/vulkan/SDL_gpu_vulkan.c

+ 8 - 4
src/gpu/vulkan/SDL_gpu_vulkan.c

@@ -1135,6 +1135,7 @@ struct VulkanRenderer
 
     VulkanMemoryAllocator *memoryAllocator;
     VkPhysicalDeviceMemoryProperties memoryProperties;
+    bool checkEmptyAllocations;
 
     WindowData **claimedWindows;
     Uint32 claimedWindowCount;
@@ -1577,6 +1578,10 @@ static void VULKAN_INTERNAL_RemoveMemoryUsedRegion(
         usedRegion->offset,
         usedRegion->size);
 
+    if (usedRegion->allocation->usedRegionCount == 0) {
+        renderer->checkEmptyAllocations = true;
+    }
+
     SDL_free(usedRegion);
 
     SDL_UnlockMutex(renderer->allocatorLock);
@@ -10433,7 +10438,6 @@ static bool VULKAN_Submit(
     VkPipelineStageFlags waitStages[MAX_PRESENT_COUNT];
     Uint32 swapchainImageIndex;
     VulkanTextureSubresource *swapchainTextureSubresource;
-    Uint8 commandBufferCleaned = 0;
     VulkanMemorySubAllocator *allocator;
     bool presenting = false;
 
@@ -10549,12 +10553,10 @@ static bool VULKAN_Submit(
                 renderer,
                 renderer->submittedCommandBuffers[i],
                 false);
-
-            commandBufferCleaned = 1;
         }
     }
 
-    if (commandBufferCleaned) {
+    if (renderer->checkEmptyAllocations) {
         SDL_LockMutex(renderer->allocatorLock);
 
         for (Uint32 i = 0; i < VK_MAX_MEMORY_TYPES; i += 1) {
@@ -10570,6 +10572,8 @@ static bool VULKAN_Submit(
             }
         }
 
+        renderer->checkEmptyAllocations = false;
+
         SDL_UnlockMutex(renderer->allocatorLock);
     }