From d1f8f7436d7177c726f7fa747187b1cda52808f4 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Fri, 23 Aug 2019 14:19:22 +1000 Subject: [PATCH] vulkan/swapper: destroy the surface in finalize Fixes a leak of the VkSurface object. --- gst-libs/gst/vulkan/gstvkswapper.c | 12 ++++++++++++ gst-libs/gst/vulkan/gstvkwindow.c | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gst-libs/gst/vulkan/gstvkswapper.c b/gst-libs/gst/vulkan/gstvkswapper.c index 4bc0191932..f715c153ab 100644 --- a/gst-libs/gst/vulkan/gstvkswapper.c +++ b/gst-libs/gst/vulkan/gstvkswapper.c @@ -61,6 +61,7 @@ struct _GstVulkanSwapperPrivate PFN_vkGetSwapchainImagesKHR GetSwapchainImagesKHR; PFN_vkAcquireNextImageKHR AcquireNextImageKHR; PFN_vkQueuePresentKHR QueuePresentKHR; + PFN_vkDestroySurfaceKHR DestroySurfaceKHR; /* */ /* runtime variables */ @@ -137,6 +138,7 @@ _get_function_table (GstVulkanSwapper * swapper) GetPhysicalDeviceSurfaceFormatsKHR); GET_PROC_ADDRESS_REQUIRED (swapper, instance, GetPhysicalDeviceSurfacePresentModesKHR); + GET_PROC_ADDRESS_REQUIRED (swapper, instance, DestroySurfaceKHR); GET_PROC_ADDRESS_REQUIRED (swapper, device, CreateSwapchainKHR); GET_PROC_ADDRESS_REQUIRED (swapper, device, DestroySwapchainKHR); GET_PROC_ADDRESS_REQUIRED (swapper, device, GetSwapchainImagesKHR); @@ -478,6 +480,8 @@ static void gst_vulkan_swapper_finalize (GObject * object) { GstVulkanSwapper *swapper = GST_VULKAN_SWAPPER (object); + GstVulkanInstance *instance = + gst_vulkan_device_get_instance (swapper->device); int i; g_signal_handler_disconnect (swapper->window, swapper->priv->draw_id); @@ -509,6 +513,12 @@ gst_vulkan_swapper_finalize (GObject * object) swapper->priv->swap_chain, NULL); swapper->priv->swap_chain = VK_NULL_HANDLE; + if (swapper->priv->surface) { + swapper->priv->DestroySurfaceKHR (instance->instance, + swapper->priv->surface, NULL); + } + swapper->priv->surface = VK_NULL_HANDLE; + g_free (swapper->priv->surf_present_modes); swapper->priv->surf_present_modes = NULL; @@ -536,6 +546,8 @@ gst_vulkan_swapper_finalize (GObject * object) gst_object_unref (swapper->window); swapper->window = NULL; + gst_object_unref (instance); + G_OBJECT_CLASS (parent_class)->finalize (object); } diff --git a/gst-libs/gst/vulkan/gstvkwindow.c b/gst-libs/gst/vulkan/gstvkwindow.c index 1482cbd174..b4e6afbf57 100644 --- a/gst-libs/gst/vulkan/gstvkwindow.c +++ b/gst-libs/gst/vulkan/gstvkwindow.c @@ -294,7 +294,8 @@ gst_vulkan_window_get_display (GstVulkanWindow * window) * @window: a #GstVulkanWindow * @error: a #GError * - * Returns: the VkSurface for displaying into + * Returns: the VkSurface for displaying into. The caller is responsible for + * calling `VkDestroySurface` on the returned surface. * * Since: 1.18 */