vkinstance: remove gst_vulkan_instance_close
authorMatthew Waters <matthew@centricular.com>
Mon, 7 Dec 2015 06:00:37 +0000 (17:00 +1100)
committerMatthew Waters <matthew@centricular.com>
Tue, 16 Feb 2016 14:13:43 +0000 (01:13 +1100)
Sharing the instance across multiple elements/application will require
using the refcount instead to know when to close and destroy the instance.

ext/vulkan/vk_fwd.h
ext/vulkan/vkinstance.c
ext/vulkan/vkinstance.h
ext/vulkan/vksink.c

index dd52283..89f1892 100644 (file)
@@ -27,6 +27,7 @@ G_BEGIN_DECLS
 
 typedef struct _GstVulkanInstance GstVulkanInstance;
 typedef struct _GstVulkanInstanceClass GstVulkanInstanceClass;
+typedef struct _GstVulkanInstancePrivate GstVulkanInstancePrivate;
 
 typedef struct _GstVulkanDevice GstVulkanDevice;
 typedef struct _GstVulkanDeviceClass GstVulkanDeviceClass;
index 8952ea3..e9fb559 100644 (file)
@@ -54,6 +54,11 @@ G_DEFINE_TYPE_WITH_CODE (GstVulkanInstance, gst_vulkan_instance,
 
 static void gst_vulkan_instance_finalize (GObject * object);
 
+struct _GstVulkanInstancePrivate
+{
+  gboolean opened;
+};
+
 GstVulkanInstance *
 gst_vulkan_instance_new (void)
 {
@@ -63,6 +68,8 @@ gst_vulkan_instance_new (void)
 static void
 gst_vulkan_instance_init (GstVulkanInstance * instance)
 {
+  instance->priv = G_TYPE_INSTANCE_GET_PRIVATE ((instance),
+      GST_TYPE_VULKAN_INSTANCE, GstVulkanInstancePrivate);
 }
 
 static void
@@ -71,6 +78,8 @@ gst_vulkan_instance_class_init (GstVulkanInstanceClass * instance_class)
   gst_vulkan_memory_init_once ();
   gst_vulkan_image_memory_init_once ();
 
+  g_type_class_add_private (instance_class, sizeof (GstVulkanInstancePrivate));
+
   G_OBJECT_CLASS (instance_class)->finalize = gst_vulkan_instance_finalize;
 }
 
@@ -79,6 +88,15 @@ gst_vulkan_instance_finalize (GObject * object)
 {
   GstVulkanInstance *instance = GST_VULKAN_INSTANCE (object);
 
+  if (instance->priv->opened) {
+    if (instance->dbgDestroyMsgCallback)
+      instance->dbgDestroyMsgCallback (instance->instance,
+          instance->msg_callback);
+
+    g_free (instance->physical_devices);
+  }
+  instance->priv->opened = FALSE;
+
   if (instance->instance)
     vkDestroyInstance (instance->instance);
   instance->instance = NULL;
@@ -132,11 +150,17 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
   gboolean have_swapchain_ext = FALSE;
   VkResult err;
 
+  GST_OBJECT_LOCK (instance);
+  if (instance->priv->opened) {
+    GST_OBJECT_UNLOCK (instance);
+    return TRUE;
+  }
+
   /* Look for validation layers */
   err = vkEnumerateInstanceLayerProperties (&instance_layer_count, NULL);
   if (gst_vulkan_error_to_g_error (err, error,
           "vKEnumerateInstanceLayerProperties") < 0)
-    return FALSE;
+    goto error;
 
   instance_layers = g_new0 (VkLayerProperties, instance_layer_count);
   err =
@@ -145,7 +169,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
   if (gst_vulkan_error_to_g_error (err, error,
           "vKEnumerateInstanceLayerProperties") < 0) {
     g_free (instance_layers);
-    return FALSE;
+    goto error;
   }
 
   /* TODO: allow outside selection */
@@ -166,7 +190,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
   if (gst_vulkan_error_to_g_error (err, error,
           "vkEnumerateInstanceExtensionProperties") < 0) {
     g_free (instance_layers);
-    return FALSE;
+    goto error;
   }
 
   memset (extension_names, 0, sizeof (extension_names));
@@ -179,7 +203,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
           "vkEnumerateInstanceExtensionProperties") < 0) {
     g_free (instance_layers);
     g_free (instance_extensions);
-    return FALSE;
+    goto error;
   }
 
   /* TODO: allow outside selection */
@@ -230,7 +254,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
     if (gst_vulkan_error_to_g_error (err, error, "vkCreateInstance") < 0) {
       g_free (instance_layers);
       g_free (instance_extensions);
-      return FALSE;
+      goto error;
     }
   }
 
@@ -242,7 +266,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
       &instance->n_physical_devices, NULL);
   if (gst_vulkan_error_to_g_error (err, error,
           "vkEnumeratePhysicalDevices") < 0)
-    return FALSE;
+    goto error;
   g_assert (instance->n_physical_devices > 0);
   instance->physical_devices =
       g_new0 (VkPhysicalDevice, instance->n_physical_devices);
@@ -251,14 +275,14 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
       &instance->n_physical_devices, instance->physical_devices);
   if (gst_vulkan_error_to_g_error (err, error,
           "vkEnumeratePhysicalDevices") < 0)
-    return FALSE;
+    goto error;
 
   instance->dbgCreateMsgCallback = (PFN_vkDbgCreateMsgCallback)
       gst_vulkan_instance_get_proc_address (instance, "vkDbgCreateMsgCallback");
   if (!instance->dbgCreateMsgCallback) {
     g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
         "Failed to retreive vkDbgCreateMsgCallback");
-    return FALSE;
+    goto error;
   }
   instance->dbgDestroyMsgCallback = (PFN_vkDbgDestroyMsgCallback)
       gst_vulkan_instance_get_proc_address (instance,
@@ -266,7 +290,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
   if (!instance->dbgDestroyMsgCallback) {
     g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
         "Failed to retreive vkDbgDestroyMsgCallback");
-    return FALSE;
+    goto error;
   }
   instance->dbgBreakCallback =
       (PFN_vkDbgMsgCallback) gst_vulkan_instance_get_proc_address (instance,
@@ -274,7 +298,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
   if (!instance->dbgBreakCallback) {
     g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
         "Failed to retreive vkDbgBreakCallback");
-    return FALSE;
+    goto error;
   }
 
   err = instance->dbgCreateMsgCallback (instance->instance,
@@ -282,9 +306,18 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
       | VK_DBG_REPORT_DEBUG_BIT | VK_DBG_REPORT_PERF_WARN_BIT,
       _gst_vk_debug_callback, NULL, &instance->msg_callback);
   if (gst_vulkan_error_to_g_error (err, error, "vkDbgCreateMsgCallback") < 0)
-    return FALSE;
+    goto error;
+
+  instance->priv->opened = TRUE;
+  GST_OBJECT_UNLOCK (instance);
 
   return TRUE;
+
+error:
+  {
+    GST_OBJECT_UNLOCK (instance);
+    return FALSE;
+  }
 }
 
 gpointer
@@ -299,16 +332,3 @@ gst_vulkan_instance_get_proc_address (GstVulkanInstance * instance,
 
   return vkGetInstanceProcAddr (instance->instance, name);
 }
-
-void
-gst_vulkan_instance_close (GstVulkanInstance * instance)
-{
-  g_return_if_fail (GST_IS_VULKAN_INSTANCE (instance));
-  g_return_if_fail (instance->instance != NULL);
-
-  if (instance->dbgDestroyMsgCallback)
-    instance->dbgDestroyMsgCallback (instance->instance,
-        instance->msg_callback);
-
-  g_free (instance->physical_devices);
-}
index cb25007..d8e7438 100644 (file)
@@ -45,6 +45,8 @@ struct _GstVulkanInstance
   PFN_vkDbgCreateMsgCallback dbgCreateMsgCallback;
   PFN_vkDbgDestroyMsgCallback dbgDestroyMsgCallback;
   PFN_vkDbgMsgCallback dbgBreakCallback;
+
+  GstVulkanInstancePrivate *priv;
 };
 
 struct _GstVulkanInstanceClass
@@ -55,7 +57,6 @@ struct _GstVulkanInstanceClass
 GstVulkanInstance * gst_vulkan_instance_new                 (void);
 gboolean            gst_vulkan_instance_open                (GstVulkanInstance * instance,
                                                              GError ** error);
-void                gst_vulkan_instance_close               (GstVulkanInstance * instance);
 
 gpointer            gst_vulkan_instance_get_proc_address    (GstVulkanInstance * instance,
                                                              const gchar * name);
index 30a46ea..bedc628 100644 (file)
@@ -302,7 +302,6 @@ gst_vulkan_sink_change_state (GstElement * element, GstStateChange transition)
       gst_vulkan_device_close (vk_sink->device);
       gst_object_unref (vk_sink->device);
       vk_sink->device = NULL;
-      gst_vulkan_instance_close (vk_sink->instance);
       gst_object_unref (vk_sink->instance);
       vk_sink->instance = NULL;
       break;