mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-14 13:21:28 +00:00
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:
parent
0f8f2d0057
commit
3a2e8d2d19
1 changed files with 25 additions and 2 deletions
|
@ -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, */
|
||||||
|
|
Loading…
Reference in a new issue