diff --git a/girs/GstVulkan-1.0.gir b/girs/GstVulkan-1.0.gir index d2195d3a88..350880847c 100644 --- a/girs/GstVulkan-1.0.gir +++ b/girs/GstVulkan-1.0.gir @@ -1866,6 +1866,25 @@ only have an effect before the call to gst_vulkan_device_open(). + + Select a compatible queue from the @device supporting the @expected_flags. + + + a #GstVulkanQueue for @queue matching the + @expected_flags + + + + + a #GstVulkanDevice + + + + a VkQueueFlagBits + + + + diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdevice.c b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdevice.c index f3f7dde082..afbff6457e 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdevice.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdevice.c @@ -1070,3 +1070,58 @@ gst_vulkan_device_enable_layer (GstVulkanDevice * device, const gchar * name) return ret; } + +struct choose_queue +{ + guint expected_flags; + GstVulkanQueue *queue; +}; + +static gboolean +_choose_queue (GstVulkanDevice * device, GstVulkanQueue * queue, + struct choose_queue *data) +{ + guint flags = + device->physical_device->queue_family_props[queue->family].queueFlags; + + if ((flags & data->expected_flags) != 0) { + if (data->queue) + gst_object_unref (data->queue); + data->queue = gst_object_ref (queue); + return FALSE; + } + + return TRUE; +} + +/** + * gst_vulkan_device_select_queue + * @device: a #GstVulkanDevice + * @expected_flags: a VkQueueFlagBits + * + * Select a compatible queue from the @device supporting the @expected_flags. + * + * Returns: (transfer full): a #GstVulkanQueue for @queue matching the + * @expected_flags + * + * Since: 1.24 + */ +GstVulkanQueue * +gst_vulkan_device_select_queue (GstVulkanDevice * device, + VkQueueFlagBits expected_flags) +{ + struct choose_queue data; + + data.expected_flags = expected_flags; + data.queue = NULL; + + if (!gst_vulkan_device_open (device, NULL)) { + gst_object_unref (device); + goto beach; + } + gst_vulkan_device_foreach_queue (device, + (GstVulkanDeviceForEachQueueFunc) _choose_queue, &data); + +beach: + return data.queue; +} diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdevice.h b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdevice.h index 6a84ec69ca..01cfed98ca 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdevice.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdevice.h @@ -147,6 +147,10 @@ GST_VULKAN_API GstVulkanFence * gst_vulkan_device_create_fence (GstVulkanDevice * device, GError ** error); +GST_VULKAN_API +GstVulkanQueue * gst_vulkan_device_select_queue (GstVulkanDevice * device, + VkQueueFlagBits expected_flags); + G_END_DECLS #endif /* __GST_VULKAN_DEVICE_H__ */ diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkutils.h b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkutils.h index 4b6e7efef7..95cbdc8bde 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkutils.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkutils.h @@ -59,7 +59,6 @@ GST_VULKAN_API GstVulkanImageView * gst_vulkan_get_or_create_image_view_with_info (GstVulkanImageMemory * image, VkImageViewCreateInfo * create_info); - GST_VULKAN_API GstVulkanHandle * gst_vulkan_create_shader (GstVulkanDevice * device, const gchar * code,