Ensured swapchain/surface cleanup on device destruction 19/319919/1
authorDavid Steele <david.steele@samsung.com>
Wed, 19 Feb 2025 14:38:57 +0000 (14:38 +0000)
committerDavid Steele <david.steele@samsung.com>
Wed, 19 Feb 2025 14:38:57 +0000 (14:38 +0000)
VulkanDevice should take ownership of vulkan surface / swapchain pair.
For the moment; have ensured that these are properly disposed of
in the VulkanDevice destructor.

[Could change SurfaceSwapchainPair to use UniquePtr instead of raw ptr,
using Destroy() as deallocator fn, then less work!]

Change-Id: Ibd996cd46d8b06bda201fe87f932153f4096e203
Signed-off-by: David Steele <david.steele@samsung.com>
dali/internal/graphics/vulkan/vulkan-device.cpp

index 1e70fe8cb28a997b99484ab41687049dac18496d..86063b20bca3e709e96a931b1b6b91cb96a01eb0 100644 (file)
@@ -90,10 +90,15 @@ Device::~Device()
   // Wait for everything to finish on the GPU
   DeviceWaitIdle();
 
-  mSurfaceMap.clear();
-
   DALI_LOG_STREAM(gVulkanFilter, Debug::General, "DESTROYING GRAPHICS CONTEXT--------------------------------\n");
 
+  for(auto& surfaceSwapchain : mSurfaceMap)
+  {
+    surfaceSwapchain.second.swapchain->Destroy();
+    surfaceSwapchain.second.surface->Destroy();
+  }
+  mSurfaceMap.clear();
+
   SwapBuffers();
   ReleaseCommandPools();
 
@@ -296,12 +301,12 @@ Graphics::SurfaceId Device::CreateSurface(
 
 void Device::DestroySurface(Dali::Graphics::SurfaceId surfaceId)
 {
-  if(auto surface = GetSurface(surfaceId))
+  if(auto match = mSurfaceMap.find(surfaceId); match != mSurfaceMap.end())
   {
     DeviceWaitIdle();
-    auto swapchain = GetSwapchainForSurfaceId(surfaceId);
-    swapchain->Destroy();
-    surface->Destroy();
+    match->second.swapchain->Destroy();
+    match->second.surface->Destroy();
+    mSurfaceMap.erase(match);
   }
 }