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,