diff --git a/girs/GstVulkan-1.0.gir b/girs/GstVulkan-1.0.gir
index c92e3211b5..b166497be0 100644
--- a/girs/GstVulkan-1.0.gir
+++ b/girs/GstVulkan-1.0.gir
@@ -7410,9 +7410,9 @@ properties.
-
- a #GstVulkanPhysicalDevice
-
+
+ a #GstVulkanDevice
+
the #GstVideoInfo
diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkformat.c b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkformat.c
index 9c06d0efb3..ac39472f85 100644
--- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkformat.c
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkformat.c
@@ -560,11 +560,41 @@ _get_usage (guint64 feature)
return usage;
}
+static gboolean
+supports_KHR_get_physical_device_properties2 (GstVulkanDevice * device)
+{
+#if defined (VK_KHR_get_physical_device_properties2)
+ return gst_vulkan_physical_device_check_api_version (device->physical_device,
+ 1, 1, 0)
+ || gst_vulkan_instance_is_extension_enabled (device->instance,
+ "VK_KHR_get_physical_device_properties2");
+#else
+ return FALSE;
+#endif
+}
+
+static gboolean
+supports_KHR_format_feature_flags2 (GstVulkanDevice * device)
+{
+#if defined (VK_KHR_format_feature_flags2)
+ if (gst_vulkan_physical_device_check_api_version (device->physical_device, 1,
+ 3, 0))
+ return TRUE;
+
+ if (supports_KHR_get_physical_device_properties2 (device)
+ && gst_vulkan_device_is_extension_enabled (device,
+ "VK_KHR_format_feature_flags2"))
+ return TRUE;
+#endif
+ return FALSE;
+}
+
static guint64
-_get_feature_flags (VkPhysicalDevice gpu, gpointer func, VkFormat format,
- VkImageTiling tiling)
+_get_feature_flags (GstVulkanDevice * device, gpointer func,
+ VkFormat format, VkImageTiling tiling)
{
VkFormatProperties prop = { 0 };
+ VkPhysicalDevice gpu = gst_vulkan_device_get_physical_device (device);
#if defined (VK_KHR_get_physical_device_properties2)
#if defined (VK_KHR_format_feature_flags2)
VkFormatProperties3KHR prop3 = {
@@ -573,24 +603,24 @@ _get_feature_flags (VkPhysicalDevice gpu, gpointer func, VkFormat format,
#endif
VkFormatProperties2KHR prop2 = {
.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR,
-#if defined (VK_KHR_format_feature_flags2)
- .pNext = &prop3,
-#endif
+ .pNext = NULL,
};
- if (func) {
+ if (func && supports_KHR_get_physical_device_properties2 (device)) {
PFN_vkGetPhysicalDeviceFormatProperties2KHR
gst_vkGetPhysicalDeviceFormatProperties2 = func;
+#if defined (VK_KHR_format_feature_flags2)
+ prop2.pNext = &prop3;
+#endif
gst_vkGetPhysicalDeviceFormatProperties2 (gpu, format, &prop2);
-#if defined (VK_KHR_format_feature_flags2)
- return tiling == VK_IMAGE_TILING_LINEAR ?
- prop3.linearTilingFeatures : prop3.optimalTilingFeatures;
-#else
- return tiling == VK_IMAGE_TILING_LINEAR ?
- prop2.formatProperties.linearTilingFeatures :
- prop2.formatProperties.optimalTilingFeatures;
-#endif
+ if (supports_KHR_format_feature_flags2 (device))
+ return tiling == VK_IMAGE_TILING_LINEAR ?
+ prop3.linearTilingFeatures : prop3.optimalTilingFeatures;
+ else
+ return tiling == VK_IMAGE_TILING_LINEAR ?
+ prop2.formatProperties.linearTilingFeatures :
+ prop2.formatProperties.optimalTilingFeatures;
}
#endif /* defined (VK_KHR_get_physical_device_properties2) */
@@ -602,7 +632,7 @@ _get_feature_flags (VkPhysicalDevice gpu, gpointer func, VkFormat format,
/**
* gst_vulkan_format_from_video_info_2: (skip)
- * @physical_device: a #GstVulkanPhysicalDevice
+ * @device: a #GstVulkanDevice
* @info: the #GstVideoInfo
* @tiling: the tiling to use
* @no_multiplane: query for vulkan formats without multiple images
@@ -616,30 +646,27 @@ _get_feature_flags (VkPhysicalDevice gpu, gpointer func, VkFormat format,
* Since: 1.24
*/
gboolean
-gst_vulkan_format_from_video_info_2 (GstVulkanPhysicalDevice * physical_device,
+gst_vulkan_format_from_video_info_2 (GstVulkanDevice * device,
GstVideoInfo * info, VkImageTiling tiling, gboolean no_multiplane,
VkImageUsageFlags requested_usage, VkFormat fmts[GST_VIDEO_MAX_PLANES],
int *n_imgs, VkImageUsageFlags * usage_ret)
{
int i;
- VkPhysicalDevice gpu;
#if defined (VK_KHR_get_physical_device_properties2)
PFN_vkGetPhysicalDeviceFormatProperties2KHR
gst_vkGetPhysicalDeviceFormatProperties2 = NULL;
gst_vkGetPhysicalDeviceFormatProperties2 =
- gst_vulkan_instance_get_proc_address (physical_device->instance,
+ gst_vulkan_instance_get_proc_address (device->instance,
"vkGetPhysicalDeviceFormatProperties2");
if (!gst_vkGetPhysicalDeviceFormatProperties2)
gst_vkGetPhysicalDeviceFormatProperties2 =
- gst_vulkan_instance_get_proc_address (physical_device->instance,
+ gst_vulkan_instance_get_proc_address (device->instance,
"vkGetPhysicalDeviceFormatProperties2KHR");
#else
gpointer gst_vkGetPhysicalDeviceFormatProperties2 = NULL;
#endif
- gpu = gst_vulkan_physical_device_get_handle (physical_device);
-
for (i = 0; i < G_N_ELEMENTS (vk_formats_map); i++) {
guint64 feats_primary, feats_secondary = 0;
VkImageUsageFlags usage = 0;
@@ -647,12 +674,12 @@ gst_vulkan_format_from_video_info_2 (GstVulkanPhysicalDevice * physical_device,
if (vk_formats_map[i].format != GST_VIDEO_INFO_FORMAT (info))
continue;
- feats_primary = _get_feature_flags (gpu,
+ feats_primary = _get_feature_flags (device,
gst_vkGetPhysicalDeviceFormatProperties2, vk_formats_map[i].vkfrmt,
tiling);
if (vk_formats_map[i].vkfrmt != vk_formats_map[i].vkfrmts[0]) {
- feats_secondary = _get_feature_flags (gpu,
+ feats_secondary = _get_feature_flags (device,
gst_vkGetPhysicalDeviceFormatProperties2,
vk_formats_map[i].vkfrmts[0], tiling);
}
diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkformat.h b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkformat.h
index 2bf4a21f74..6d9aa1eb03 100644
--- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkformat.h
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkformat.h
@@ -159,7 +159,7 @@ VkFormat gst_vulkan_format_from_video_info
guint plane);
GST_VULKAN_API
-gboolean gst_vulkan_format_from_video_info_2 (GstVulkanPhysicalDevice * physical_device,
+gboolean gst_vulkan_format_from_video_info_2 (GstVulkanDevice * device,
GstVideoInfo * info,
VkImageTiling tiling,
gboolean no_multiplane,
diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c
index b295a33c3b..0f16402d6e 100644
--- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c
@@ -275,7 +275,7 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
}
tiling = priv->raw_caps ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL;
- found = gst_vulkan_format_from_video_info_2 (vk_pool->device->physical_device,
+ found = gst_vulkan_format_from_video_info_2 (vk_pool->device,
&priv->v_info, tiling, no_multiplane, requested_usage, priv->vk_fmts,
&priv->n_imgs, NULL);
if (!found)
diff --git a/subprojects/gst-plugins-bad/tests/check/libs/vkformat.c b/subprojects/gst-plugins-bad/tests/check/libs/vkformat.c
index f57ffa8bfc..6fbc2c6bfb 100644
--- a/subprojects/gst-plugins-bad/tests/check/libs/vkformat.c
+++ b/subprojects/gst-plugins-bad/tests/check/libs/vkformat.c
@@ -47,7 +47,6 @@ teardown (void)
GST_START_TEST (test_format_from_video_info_2)
{
- GstVulkanPhysicalDevice *phy_dev = device->physical_device;
GstVideoInfo vinfo;
VkFormat vk_fmts[GST_VIDEO_MAX_PLANES];
int n_imgs;
@@ -56,14 +55,14 @@ GST_START_TEST (test_format_from_video_info_2)
fail_unless (gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_NV12, 620,
480));
- fail_unless (gst_vulkan_format_from_video_info_2 (phy_dev, &vinfo,
+ fail_unless (gst_vulkan_format_from_video_info_2 (device, &vinfo,
VK_IMAGE_TILING_OPTIMAL, TRUE, 0, vk_fmts, &n_imgs,
&supported_usage));
fail_unless (n_imgs == 2 && vk_fmts[0] == VK_FORMAT_R8_UNORM
&& vk_fmts[1] == VK_FORMAT_R8G8_UNORM);
- fail_unless (gst_vulkan_format_from_video_info_2 (phy_dev, &vinfo,
+ fail_unless (gst_vulkan_format_from_video_info_2 (device, &vinfo,
VK_IMAGE_TILING_LINEAR, FALSE, 0, vk_fmts, &n_imgs,
&supported_usage));
@@ -74,7 +73,7 @@ GST_START_TEST (test_format_from_video_info_2)
fail_unless (GST_VIDEO_INFO_COLORIMETRY (&vinfo).transfer ==
GST_VIDEO_TRANSFER_SRGB);
- fail_unless (gst_vulkan_format_from_video_info_2 (phy_dev, &vinfo,
+ fail_unless (gst_vulkan_format_from_video_info_2 (device, &vinfo,
VK_IMAGE_TILING_LINEAR, TRUE, 0, vk_fmts, &n_imgs, &supported_usage));
fail_unless (n_imgs == 1 && vk_fmts[0] == VK_FORMAT_R8G8B8A8_UNORM);
@@ -84,7 +83,7 @@ GST_START_TEST (test_format_from_video_info_2)
fail_unless (gst_video_colorimetry_from_string
(&GST_VIDEO_INFO_COLORIMETRY (&vinfo), "smpte240m"));
- fail_unless (gst_vulkan_format_from_video_info_2 (phy_dev, &vinfo,
+ fail_unless (gst_vulkan_format_from_video_info_2 (device, &vinfo,
VK_IMAGE_TILING_LINEAR, TRUE, 0, vk_fmts, &n_imgs, &supported_usage));
fail_unless (n_imgs == 1 && vk_fmts[0] == VK_FORMAT_R8G8B8A8_UNORM);