vkdevice: remove gst_vulkan_device_close()

When sharing the device between multiple elements/application, we need
to use th erefcount to know when to close the device.
This commit is contained in:
Matthew Waters 2015-12-07 17:21:12 +11:00
parent 5dd530daec
commit 75aaf184bb
4 changed files with 49 additions and 25 deletions

View file

@ -31,6 +31,7 @@ typedef struct _GstVulkanInstancePrivate GstVulkanInstancePrivate;
typedef struct _GstVulkanDevice GstVulkanDevice; typedef struct _GstVulkanDevice GstVulkanDevice;
typedef struct _GstVulkanDeviceClass GstVulkanDeviceClass; typedef struct _GstVulkanDeviceClass GstVulkanDeviceClass;
typedef struct _GstVulkanDevicePrivate GstVulkanDevicePrivate;
typedef struct _GstVulkanQueue GstVulkanQueue; typedef struct _GstVulkanQueue GstVulkanQueue;
typedef struct _GstVulkanQueueClass GstVulkanQueueClass; typedef struct _GstVulkanQueueClass GstVulkanQueueClass;

View file

@ -48,6 +48,11 @@ G_DEFINE_TYPE_WITH_CODE (GstVulkanDevice, gst_vulkan_device, GST_TYPE_OBJECT,
static void gst_vulkan_device_finalize (GObject * object); static void gst_vulkan_device_finalize (GObject * object);
struct _GstVulkanDevicePrivate
{
gboolean opened;
};
GstVulkanDevice * GstVulkanDevice *
gst_vulkan_device_new (GstVulkanInstance * instance) gst_vulkan_device_new (GstVulkanInstance * instance)
{ {
@ -63,6 +68,8 @@ gst_vulkan_device_new (GstVulkanInstance * instance)
static void static void
gst_vulkan_device_init (GstVulkanDevice * device) gst_vulkan_device_init (GstVulkanDevice * device)
{ {
device->priv = G_TYPE_INSTANCE_GET_PRIVATE ((device),
GST_TYPE_VULKAN_DEVICE, GstVulkanDevicePrivate);
} }
static void static void
@ -70,6 +77,8 @@ gst_vulkan_device_class_init (GstVulkanDeviceClass * device_class)
{ {
GObjectClass *gobject_class = (GObjectClass *) device_class; GObjectClass *gobject_class = (GObjectClass *) device_class;
g_type_class_add_private (device_class, sizeof (GstVulkanDevicePrivate));
gobject_class->finalize = gst_vulkan_device_finalize; gobject_class->finalize = gst_vulkan_device_finalize;
} }
@ -78,6 +87,9 @@ gst_vulkan_device_finalize (GObject * object)
{ {
GstVulkanDevice *device = GST_VULKAN_DEVICE (object); GstVulkanDevice *device = GST_VULKAN_DEVICE (object);
g_free (device->queue_family_props);
device->queue_family_props = NULL;
if (device->cmd_pool.handle) if (device->cmd_pool.handle)
vkDestroyCommandPool (device->device, device->cmd_pool); vkDestroyCommandPool (device->device, device->cmd_pool);
device->cmd_pool.handle = 0; device->cmd_pool.handle = 0;
@ -118,6 +130,12 @@ _physical_device_info (GstVulkanDevice * device, GError ** error)
VkResult err; VkResult err;
gpu = gst_vulkan_device_get_physical_device (device); gpu = gst_vulkan_device_get_physical_device (device);
if (!gpu) {
g_set_error (error, GST_VULKAN_ERROR,
GST_VULKAN_ERROR_INITIALIZATION_FAILED,
"Failed to retrieve physical device");
return FALSE;
}
err = vkGetPhysicalDeviceProperties (gpu, &props); err = vkGetPhysicalDeviceProperties (gpu, &props);
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
@ -150,8 +168,15 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
g_return_val_if_fail (GST_IS_VULKAN_DEVICE (device), FALSE); g_return_val_if_fail (GST_IS_VULKAN_DEVICE (device), FALSE);
GST_OBJECT_LOCK (device);
if (device->priv->opened) {
GST_OBJECT_UNLOCK (device);
return TRUE;
}
if (!_physical_device_info (device, error)) if (!_physical_device_info (device, error))
return FALSE; goto error;
gpu = gst_vulkan_device_get_physical_device (device); gpu = gst_vulkan_device_get_physical_device (device);
@ -159,7 +184,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
err = vkEnumerateDeviceLayerProperties (gpu, &device_layer_count, NULL); err = vkEnumerateDeviceLayerProperties (gpu, &device_layer_count, NULL);
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkEnumerateDeviceLayerProperties") < 0) "vkEnumerateDeviceLayerProperties") < 0)
return FALSE; goto error;
device_layers = g_new0 (VkLayerProperties, device_layer_count); device_layers = g_new0 (VkLayerProperties, device_layer_count);
err = err =
@ -168,7 +193,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkEnumerateDeviceLayerProperties") < 0) { "vkEnumerateDeviceLayerProperties") < 0) {
g_free (device_layers); g_free (device_layers);
return FALSE; goto error;
} }
validation_found = validation_found =
@ -181,7 +206,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
"a required validation layer.\n\n" "a required validation layer.\n\n"
"Please look at the Getting Started guide for additional " "Please look at the Getting Started guide for additional "
"information.\nvkCreateDevice Failure"); "information.\nvkCreateDevice Failure");
return FALSE; goto error;
} }
enabled_layer_count = G_N_ELEMENTS (device_validation_layers); enabled_layer_count = G_N_ELEMENTS (device_validation_layers);
@ -190,7 +215,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
&device_extension_count, NULL); &device_extension_count, NULL);
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkEnumerateDeviceExtensionProperties") < 0) "vkEnumerateDeviceExtensionProperties") < 0)
return FALSE; goto error;
have_swapchain_ext = 0; have_swapchain_ext = 0;
enabled_extension_count = 0; enabled_extension_count = 0;
@ -201,7 +226,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkEnumerateDeviceExtensionProperties") < 0) { "vkEnumerateDeviceExtensionProperties") < 0) {
g_free (device_extensions); g_free (device_extensions);
return FALSE; goto error;
} }
for (uint32_t i = 0; i < device_extension_count; i++) { for (uint32_t i = 0; i < device_extension_count; i++) {
@ -224,17 +249,17 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
err = vkGetPhysicalDeviceProperties (gpu, &device->gpu_props); err = vkGetPhysicalDeviceProperties (gpu, &device->gpu_props);
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkGetPhysicalDeviceProperties") < 0) "vkGetPhysicalDeviceProperties") < 0)
return FALSE; goto error;
err = vkGetPhysicalDeviceMemoryProperties (gpu, &device->memory_properties); err = vkGetPhysicalDeviceMemoryProperties (gpu, &device->memory_properties);
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkGetPhysicalDeviceProperties") < 0) "vkGetPhysicalDeviceProperties") < 0)
return FALSE; goto error;
err = vkGetPhysicalDeviceFeatures (gpu, &device->gpu_features); err = vkGetPhysicalDeviceFeatures (gpu, &device->gpu_features);
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkGetPhysicalDeviceFeatures") < 0) "vkGetPhysicalDeviceFeatures") < 0)
return FALSE; goto error;
/* Call with NULL data to get count */ /* Call with NULL data to get count */
err = err =
@ -242,7 +267,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
NULL); NULL);
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkGetPhysicalDeviceQueueFamilyProperties") < 0) "vkGetPhysicalDeviceQueueFamilyProperties") < 0)
return FALSE; goto error;
g_assert (device->n_queue_families >= 1); g_assert (device->n_queue_families >= 1);
device->queue_family_props = device->queue_family_props =
@ -252,7 +277,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
device->queue_family_props); device->queue_family_props);
if (gst_vulkan_error_to_g_error (err, error, if (gst_vulkan_error_to_g_error (err, error,
"vkGetPhysicalDeviceQueueFamilyProperties") < 0) "vkGetPhysicalDeviceQueueFamilyProperties") < 0)
return FALSE; goto error;
/* FIXME: allow overriding/selecting */ /* FIXME: allow overriding/selecting */
for (i = 0; i < device->n_queue_families; i++) { for (i = 0; i < device->n_queue_families; i++) {
@ -263,7 +288,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
g_set_error (error, GST_VULKAN_ERROR, g_set_error (error, GST_VULKAN_ERROR,
GST_VULKAN_ERROR_INITIALIZATION_FAILED, GST_VULKAN_ERROR_INITIALIZATION_FAILED,
"Failed to find a compatible queue family"); "Failed to find a compatible queue family");
return FALSE; goto error;
} }
device->queue_family_id = i; device->queue_family_id = i;
device->n_queues = 1; device->n_queues = 1;
@ -290,7 +315,7 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
err = vkCreateDevice (gpu, &device_info, &device->device); err = vkCreateDevice (gpu, &device_info, &device->device);
if (gst_vulkan_error_to_g_error (err, error, "vkCreateDevice") < 0) if (gst_vulkan_error_to_g_error (err, error, "vkCreateDevice") < 0)
return FALSE; goto error;
} }
{ {
VkCmdPoolCreateInfo cmd_pool_info = { 0, }; VkCmdPoolCreateInfo cmd_pool_info = { 0, };
@ -303,10 +328,17 @@ gst_vulkan_device_open (GstVulkanDevice * device, GError ** error)
err = err =
vkCreateCommandPool (device->device, &cmd_pool_info, &device->cmd_pool); vkCreateCommandPool (device->device, &cmd_pool_info, &device->cmd_pool);
if (gst_vulkan_error_to_g_error (err, error, "vkCreateCommandPool") < 0) if (gst_vulkan_error_to_g_error (err, error, "vkCreateCommandPool") < 0)
return FALSE; goto error;
} }
GST_OBJECT_UNLOCK (device);
return TRUE; return TRUE;
error:
{
GST_OBJECT_UNLOCK (device);
return FALSE;
}
} }
GstVulkanQueue * GstVulkanQueue *
@ -391,12 +423,3 @@ gst_vulkan_device_create_cmd_buffer (GstVulkanDevice * device,
return TRUE; return TRUE;
} }
void
gst_vulkan_device_close (GstVulkanDevice * device)
{
g_return_if_fail (GST_IS_VULKAN_DEVICE (device));
g_return_if_fail (device->device != NULL);
g_free (device->queue_family_props);
}

View file

@ -53,6 +53,8 @@ struct _GstVulkanDevice
guint32 n_queues; guint32 n_queues;
VkCmdPool cmd_pool; VkCmdPool cmd_pool;
GstVulkanDevicePrivate *priv;
}; };
struct _GstVulkanDeviceClass struct _GstVulkanDeviceClass
@ -64,7 +66,6 @@ GstVulkanDevice * gst_vulkan_device_new (GstVulkanInstance *
GstVulkanInstance * gst_vulkan_device_get_instance (GstVulkanDevice * device); GstVulkanInstance * gst_vulkan_device_get_instance (GstVulkanDevice * device);
gboolean gst_vulkan_device_open (GstVulkanDevice * device, gboolean gst_vulkan_device_open (GstVulkanDevice * device,
GError ** error); GError ** error);
void gst_vulkan_device_close (GstVulkanDevice * device);
gpointer gst_vulkan_device_get_proc_address (GstVulkanDevice * device, gpointer gst_vulkan_device_get_proc_address (GstVulkanDevice * device,
const gchar * name); const gchar * name);

View file

@ -299,7 +299,6 @@ gst_vulkan_sink_change_state (GstElement * element, GstStateChange transition)
gst_vulkan_window_close (vk_sink->window); gst_vulkan_window_close (vk_sink->window);
gst_object_unref (vk_sink->window); gst_object_unref (vk_sink->window);
vk_sink->window = NULL; vk_sink->window = NULL;
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_object_unref (vk_sink->instance); gst_object_unref (vk_sink->instance);