diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkphysicaldevice.c b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkphysicaldevice.c index 0e689af2b0..995ebd180b 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkphysicaldevice.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkphysicaldevice.c @@ -260,6 +260,7 @@ gst_vulkan_physical_device_finalize (GObject * object) g_free (priv->available_extensions); priv->available_extensions = NULL; + g_free (device->queue_family_video_ops); g_free (device->queue_family_props); device->queue_family_props = NULL; @@ -559,10 +560,11 @@ dump_queue_properties (GstVulkanPhysicalDevice * device, GError ** error) queue_family_props[i].queueFlags); GST_LOG_OBJECT (device, "queue family at index %i supports %i queues " - "with flags (0x%x) \'%s\', %" G_GUINT32_FORMAT " timestamp bits and " - "a minimum image transfer granuality of %" GST_VULKAN_EXTENT3D_FORMAT, - i, device->queue_family_props[i].queueCount, + "with flags (0x%x) \'%s\', video operations (0x%x), %" G_GUINT32_FORMAT + " timestamp bits and a minimum image transfer granuality of %" + GST_VULKAN_EXTENT3D_FORMAT, i, device->queue_family_props[i].queueCount, device->queue_family_props[i].queueFlags, queue_flags_str, + device->queue_family_video_ops[i], device->queue_family_props[i].timestampValidBits, GST_VULKAN_EXTENT3D_ARGS (device-> queue_family_props[i].minImageTransferGranularity)); @@ -1003,22 +1005,43 @@ gst_vulkan_physical_device_fill_info (GstVulkanPhysicalDevice * device, if (device->n_queue_families > 0) { VkQueueFamilyProperties2 *props; int i; + void *next = NULL; +#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS + VkQueueFamilyVideoPropertiesKHR *queue_family_video_props; + queue_family_video_props = + g_new0 (VkQueueFamilyVideoPropertiesKHR, device->n_queue_families); +#endif props = g_new0 (VkQueueFamilyProperties2, device->n_queue_families); for (i = 0; i < device->n_queue_families; i++) { +#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS + queue_family_video_props[i].sType = + VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR; + next = &queue_family_video_props[i]; +#endif props[i].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2; - props[i].pNext = NULL; + props[i].pNext = next; } get_queue_props2 (device->device, &device->n_queue_families, props); device->queue_family_props = g_new0 (VkQueueFamilyProperties, device->n_queue_families); + device->queue_family_video_ops = + g_new (guint32, device->n_queue_families); for (i = 0; i < device->n_queue_families; i++) { memcpy (&device->queue_family_props[i], &props[i].queueFamilyProperties, sizeof (device->queue_family_props[i])); + +#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS + device->queue_family_video_ops[i] = + queue_family_video_props[i].videoCodecOperations; +#endif } g_free (props); +#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS + g_free (queue_family_video_props); +#endif } } else #endif diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkphysicaldevice.h b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkphysicaldevice.h index ce7e0da53c..53544ad193 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkphysicaldevice.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkphysicaldevice.h @@ -65,6 +65,15 @@ struct _GstVulkanPhysicalDevice VkQueueFamilyProperties *queue_family_props; guint32 n_queue_families; + /** + * GstVulkanPhysicalDevice.queue_family_video_ops: + * + * vulkan video operations allowed per queue family + * + * Since: 1.24 + */ + guint32 *queue_family_video_ops; + /* */ gpointer _reserved [GST_PADDING]; };