static void gst_vulkan_instance_finalize (GObject * object);
+struct _GstVulkanInstancePrivate
+{
+ gboolean opened;
+};
+
GstVulkanInstance *
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
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;
}
{
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;
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 =
if (gst_vulkan_error_to_g_error (err, error,
"vKEnumerateInstanceLayerProperties") < 0) {
g_free (instance_layers);
- return FALSE;
+ goto error;
}
/* TODO: allow outside selection */
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));
"vkEnumerateInstanceExtensionProperties") < 0) {
g_free (instance_layers);
g_free (instance_extensions);
- return FALSE;
+ goto error;
}
/* TODO: allow outside selection */
if (gst_vulkan_error_to_g_error (err, error, "vkCreateInstance") < 0) {
g_free (instance_layers);
g_free (instance_extensions);
- return FALSE;
+ goto 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);
&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,
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,
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,
| 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
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);
-}