vkimagebufferpool: set image creation flags in needed

set ALIAS bit if the usage is for both sampled and storage.

set MUTABLE_FORMAT and EXTENDED_USAGE bits if the image is a multiplane YUV and
uses multiple memories.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6798>
This commit is contained in:
Víctor Manuel Jáquez Leal 2024-04-17 12:21:43 +02:00
parent 0f8f2d0057
commit 3a2e8d2d19

View file

@ -47,6 +47,7 @@ struct _GstVulkanImageBufferPoolPrivate
gboolean raw_caps; gboolean raw_caps;
GstVideoInfo v_info; GstVideoInfo v_info;
VkImageUsageFlags usage; VkImageUsageFlags usage;
VkImageCreateFlags img_flags;
VkMemoryPropertyFlags mem_props; VkMemoryPropertyFlags mem_props;
VkImageLayout initial_layout; VkImageLayout initial_layout;
guint64 initial_access; guint64 initial_access;
@ -253,12 +254,34 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
priv->usage = supported_usage & default_usage; priv->usage = supported_usage & default_usage;
} }
{
gboolean dpb_only = FALSE, sampleable;
const GstVulkanFormatMap *vkmap;
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
dpb_only = (priv->usage & VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)
&& !(priv->usage & VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR);
#endif
sampleable = priv->usage &
(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT);
if (sampleable && !dpb_only) {
vkmap = gst_vulkan_format_get_map (GST_VIDEO_INFO_FORMAT (&priv->v_info));
priv->img_flags = VK_IMAGE_CREATE_ALIAS_BIT;
if (GST_VIDEO_INFO_N_PLANES (&priv->v_info) > 1
&& vkmap->vkfrmt != priv->vk_fmts[0]) {
priv->img_flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
| VK_IMAGE_CREATE_EXTENDED_USAGE_BIT;
}
}
}
/* get the size of the buffer to allocate */ /* get the size of the buffer to allocate */
/* *INDENT-OFF* */ /* *INDENT-OFF* */
image_info = (VkImageCreateInfo) { image_info = (VkImageCreateInfo) {
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
.pNext = NULL, .pNext = NULL,
.flags = 0, .flags = priv->img_flags,
.imageType = VK_IMAGE_TYPE_2D, .imageType = VK_IMAGE_TYPE_2D,
/* .format = fill per image, */ /* .format = fill per image, */
/* .extent = fill per plane, */ /* .extent = fill per plane, */
@ -463,7 +486,7 @@ gst_vulkan_image_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
image_info = (VkImageCreateInfo) { image_info = (VkImageCreateInfo) {
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
.pNext = NULL, .pNext = NULL,
.flags = 0, .flags = priv->img_flags,
.imageType = VK_IMAGE_TYPE_2D, .imageType = VK_IMAGE_TYPE_2D,
/* .format = fill per image, */ /* .format = fill per image, */
/* .extent = fill per plane, */ /* .extent = fill per plane, */