mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
vkinstance: remove gst_vulkan_instance_close
Sharing the instance across multiple elements/application will require using the refcount instead to know when to close and destroy the instance.
This commit is contained in:
parent
203c6fa55c
commit
5dd530daec
4 changed files with 47 additions and 26 deletions
|
@ -27,6 +27,7 @@ G_BEGIN_DECLS
|
||||||
|
|
||||||
typedef struct _GstVulkanInstance GstVulkanInstance;
|
typedef struct _GstVulkanInstance GstVulkanInstance;
|
||||||
typedef struct _GstVulkanInstanceClass GstVulkanInstanceClass;
|
typedef struct _GstVulkanInstanceClass GstVulkanInstanceClass;
|
||||||
|
typedef struct _GstVulkanInstancePrivate GstVulkanInstancePrivate;
|
||||||
|
|
||||||
typedef struct _GstVulkanDevice GstVulkanDevice;
|
typedef struct _GstVulkanDevice GstVulkanDevice;
|
||||||
typedef struct _GstVulkanDeviceClass GstVulkanDeviceClass;
|
typedef struct _GstVulkanDeviceClass GstVulkanDeviceClass;
|
||||||
|
|
|
@ -54,6 +54,11 @@ G_DEFINE_TYPE_WITH_CODE (GstVulkanInstance, gst_vulkan_instance,
|
||||||
|
|
||||||
static void gst_vulkan_instance_finalize (GObject * object);
|
static void gst_vulkan_instance_finalize (GObject * object);
|
||||||
|
|
||||||
|
struct _GstVulkanInstancePrivate
|
||||||
|
{
|
||||||
|
gboolean opened;
|
||||||
|
};
|
||||||
|
|
||||||
GstVulkanInstance *
|
GstVulkanInstance *
|
||||||
gst_vulkan_instance_new (void)
|
gst_vulkan_instance_new (void)
|
||||||
{
|
{
|
||||||
|
@ -63,6 +68,8 @@ gst_vulkan_instance_new (void)
|
||||||
static void
|
static void
|
||||||
gst_vulkan_instance_init (GstVulkanInstance * instance)
|
gst_vulkan_instance_init (GstVulkanInstance * instance)
|
||||||
{
|
{
|
||||||
|
instance->priv = G_TYPE_INSTANCE_GET_PRIVATE ((instance),
|
||||||
|
GST_TYPE_VULKAN_INSTANCE, GstVulkanInstancePrivate);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -71,6 +78,8 @@ gst_vulkan_instance_class_init (GstVulkanInstanceClass * instance_class)
|
||||||
gst_vulkan_memory_init_once ();
|
gst_vulkan_memory_init_once ();
|
||||||
gst_vulkan_image_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;
|
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);
|
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)
|
if (instance->instance)
|
||||||
vkDestroyInstance (instance->instance);
|
vkDestroyInstance (instance->instance);
|
||||||
instance->instance = NULL;
|
instance->instance = NULL;
|
||||||
|
@ -132,11 +150,17 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
|
||||||
gboolean have_swapchain_ext = FALSE;
|
gboolean have_swapchain_ext = FALSE;
|
||||||
VkResult err;
|
VkResult err;
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (instance);
|
||||||
|
if (instance->priv->opened) {
|
||||||
|
GST_OBJECT_UNLOCK (instance);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Look for validation layers */
|
/* Look for validation layers */
|
||||||
err = vkEnumerateInstanceLayerProperties (&instance_layer_count, NULL);
|
err = vkEnumerateInstanceLayerProperties (&instance_layer_count, NULL);
|
||||||
if (gst_vulkan_error_to_g_error (err, error,
|
if (gst_vulkan_error_to_g_error (err, error,
|
||||||
"vKEnumerateInstanceLayerProperties") < 0)
|
"vKEnumerateInstanceLayerProperties") < 0)
|
||||||
return FALSE;
|
goto error;
|
||||||
|
|
||||||
instance_layers = g_new0 (VkLayerProperties, instance_layer_count);
|
instance_layers = g_new0 (VkLayerProperties, instance_layer_count);
|
||||||
err =
|
err =
|
||||||
|
@ -145,7 +169,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
|
||||||
if (gst_vulkan_error_to_g_error (err, error,
|
if (gst_vulkan_error_to_g_error (err, error,
|
||||||
"vKEnumerateInstanceLayerProperties") < 0) {
|
"vKEnumerateInstanceLayerProperties") < 0) {
|
||||||
g_free (instance_layers);
|
g_free (instance_layers);
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: allow outside selection */
|
/* 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,
|
if (gst_vulkan_error_to_g_error (err, error,
|
||||||
"vkEnumerateInstanceExtensionProperties") < 0) {
|
"vkEnumerateInstanceExtensionProperties") < 0) {
|
||||||
g_free (instance_layers);
|
g_free (instance_layers);
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset (extension_names, 0, sizeof (extension_names));
|
memset (extension_names, 0, sizeof (extension_names));
|
||||||
|
@ -179,7 +203,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
|
||||||
"vkEnumerateInstanceExtensionProperties") < 0) {
|
"vkEnumerateInstanceExtensionProperties") < 0) {
|
||||||
g_free (instance_layers);
|
g_free (instance_layers);
|
||||||
g_free (instance_extensions);
|
g_free (instance_extensions);
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: allow outside selection */
|
/* 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) {
|
if (gst_vulkan_error_to_g_error (err, error, "vkCreateInstance") < 0) {
|
||||||
g_free (instance_layers);
|
g_free (instance_layers);
|
||||||
g_free (instance_extensions);
|
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);
|
&instance->n_physical_devices, NULL);
|
||||||
if (gst_vulkan_error_to_g_error (err, error,
|
if (gst_vulkan_error_to_g_error (err, error,
|
||||||
"vkEnumeratePhysicalDevices") < 0)
|
"vkEnumeratePhysicalDevices") < 0)
|
||||||
return FALSE;
|
goto error;
|
||||||
g_assert (instance->n_physical_devices > 0);
|
g_assert (instance->n_physical_devices > 0);
|
||||||
instance->physical_devices =
|
instance->physical_devices =
|
||||||
g_new0 (VkPhysicalDevice, instance->n_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);
|
&instance->n_physical_devices, instance->physical_devices);
|
||||||
if (gst_vulkan_error_to_g_error (err, error,
|
if (gst_vulkan_error_to_g_error (err, error,
|
||||||
"vkEnumeratePhysicalDevices") < 0)
|
"vkEnumeratePhysicalDevices") < 0)
|
||||||
return FALSE;
|
goto error;
|
||||||
|
|
||||||
instance->dbgCreateMsgCallback = (PFN_vkDbgCreateMsgCallback)
|
instance->dbgCreateMsgCallback = (PFN_vkDbgCreateMsgCallback)
|
||||||
gst_vulkan_instance_get_proc_address (instance, "vkDbgCreateMsgCallback");
|
gst_vulkan_instance_get_proc_address (instance, "vkDbgCreateMsgCallback");
|
||||||
if (!instance->dbgCreateMsgCallback) {
|
if (!instance->dbgCreateMsgCallback) {
|
||||||
g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
|
g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
|
||||||
"Failed to retreive vkDbgCreateMsgCallback");
|
"Failed to retreive vkDbgCreateMsgCallback");
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
instance->dbgDestroyMsgCallback = (PFN_vkDbgDestroyMsgCallback)
|
instance->dbgDestroyMsgCallback = (PFN_vkDbgDestroyMsgCallback)
|
||||||
gst_vulkan_instance_get_proc_address (instance,
|
gst_vulkan_instance_get_proc_address (instance,
|
||||||
|
@ -266,7 +290,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
|
||||||
if (!instance->dbgDestroyMsgCallback) {
|
if (!instance->dbgDestroyMsgCallback) {
|
||||||
g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
|
g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
|
||||||
"Failed to retreive vkDbgDestroyMsgCallback");
|
"Failed to retreive vkDbgDestroyMsgCallback");
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
instance->dbgBreakCallback =
|
instance->dbgBreakCallback =
|
||||||
(PFN_vkDbgMsgCallback) gst_vulkan_instance_get_proc_address (instance,
|
(PFN_vkDbgMsgCallback) gst_vulkan_instance_get_proc_address (instance,
|
||||||
|
@ -274,7 +298,7 @@ gst_vulkan_instance_open (GstVulkanInstance * instance, GError ** error)
|
||||||
if (!instance->dbgBreakCallback) {
|
if (!instance->dbgBreakCallback) {
|
||||||
g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
|
g_set_error (error, GST_VULKAN_ERROR, GST_VULKAN_ERROR_FAILED,
|
||||||
"Failed to retreive vkDbgBreakCallback");
|
"Failed to retreive vkDbgBreakCallback");
|
||||||
return FALSE;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = instance->dbgCreateMsgCallback (instance->instance,
|
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,
|
| VK_DBG_REPORT_DEBUG_BIT | VK_DBG_REPORT_PERF_WARN_BIT,
|
||||||
_gst_vk_debug_callback, NULL, &instance->msg_callback);
|
_gst_vk_debug_callback, NULL, &instance->msg_callback);
|
||||||
if (gst_vulkan_error_to_g_error (err, error, "vkDbgCreateMsgCallback") < 0)
|
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;
|
return TRUE;
|
||||||
|
|
||||||
|
error:
|
||||||
|
{
|
||||||
|
GST_OBJECT_UNLOCK (instance);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gpointer
|
gpointer
|
||||||
|
@ -299,16 +332,3 @@ gst_vulkan_instance_get_proc_address (GstVulkanInstance * instance,
|
||||||
|
|
||||||
return vkGetInstanceProcAddr (instance->instance, name);
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -45,6 +45,8 @@ struct _GstVulkanInstance
|
||||||
PFN_vkDbgCreateMsgCallback dbgCreateMsgCallback;
|
PFN_vkDbgCreateMsgCallback dbgCreateMsgCallback;
|
||||||
PFN_vkDbgDestroyMsgCallback dbgDestroyMsgCallback;
|
PFN_vkDbgDestroyMsgCallback dbgDestroyMsgCallback;
|
||||||
PFN_vkDbgMsgCallback dbgBreakCallback;
|
PFN_vkDbgMsgCallback dbgBreakCallback;
|
||||||
|
|
||||||
|
GstVulkanInstancePrivate *priv;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstVulkanInstanceClass
|
struct _GstVulkanInstanceClass
|
||||||
|
@ -55,7 +57,6 @@ struct _GstVulkanInstanceClass
|
||||||
GstVulkanInstance * gst_vulkan_instance_new (void);
|
GstVulkanInstance * gst_vulkan_instance_new (void);
|
||||||
gboolean gst_vulkan_instance_open (GstVulkanInstance * instance,
|
gboolean gst_vulkan_instance_open (GstVulkanInstance * instance,
|
||||||
GError ** error);
|
GError ** error);
|
||||||
void gst_vulkan_instance_close (GstVulkanInstance * instance);
|
|
||||||
|
|
||||||
gpointer gst_vulkan_instance_get_proc_address (GstVulkanInstance * instance,
|
gpointer gst_vulkan_instance_get_proc_address (GstVulkanInstance * instance,
|
||||||
const gchar * name);
|
const gchar * name);
|
||||||
|
|
|
@ -302,7 +302,6 @@ gst_vulkan_sink_change_state (GstElement * element, GstStateChange transition)
|
||||||
gst_vulkan_device_close (vk_sink->device);
|
gst_vulkan_device_close (vk_sink->device);
|
||||||
gst_object_unref (vk_sink->device);
|
gst_object_unref (vk_sink->device);
|
||||||
vk_sink->device = NULL;
|
vk_sink->device = NULL;
|
||||||
gst_vulkan_instance_close (vk_sink->instance);
|
|
||||||
gst_object_unref (vk_sink->instance);
|
gst_object_unref (vk_sink->instance);
|
||||||
vk_sink->instance = NULL;
|
vk_sink->instance = NULL;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue