vkimagebufferpool: refactor how image usage is set

Now that driver version is expected to be equal or superior to 1.3.275 the bug
in NVIDIA and RADV regarding usage is solved, we can revert commit b7ded81f7b.

Also this patch sets the internal usage variable after all the validation are
run, thus the state don't keep an invalid usage.

Finally, the now unused supported_usage variable is dropped.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7247>
This commit is contained in:
Víctor Manuel Jáquez Leal 2024-07-26 17:26:09 +02:00
parent bb9eb6f477
commit fad06c9b6f

View file

@ -171,11 +171,10 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
GstVulkanImageBufferPool *vk_pool = GST_VULKAN_IMAGE_BUFFER_POOL_CAST (pool); GstVulkanImageBufferPool *vk_pool = GST_VULKAN_IMAGE_BUFFER_POOL_CAST (pool);
GstVulkanImageBufferPoolPrivate *priv = GET_PRIV (vk_pool); GstVulkanImageBufferPoolPrivate *priv = GET_PRIV (vk_pool);
VkImageTiling tiling; VkImageTiling tiling;
VkImageUsageFlags requested_usage, supported_usage; VkImageUsageFlags requested_usage;
VkImageCreateInfo image_info; VkImageCreateInfo image_info;
guint min_buffers, max_buffers; guint min_buffers, max_buffers;
GstCaps *caps = NULL, *decode_caps = NULL, *encode_caps = NULL; GstCaps *caps = NULL, *decode_caps = NULL, *encode_caps = NULL;
GstCapsFeatures *features; GstCapsFeatures *features;
gboolean found, no_multiplane, ret = TRUE; gboolean found, no_multiplane, ret = TRUE;
guint i; guint i;
@ -201,16 +200,15 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY); GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY);
gst_vulkan_image_buffer_pool_config_get_allocation_params (config, gst_vulkan_image_buffer_pool_config_get_allocation_params (config,
&priv->usage, &priv->mem_props, &priv->initial_layout, &requested_usage, &priv->mem_props, &priv->initial_layout,
&priv->initial_access, &priv->n_layers, &decode_caps, &encode_caps); &priv->initial_access, &priv->n_layers, &decode_caps, &encode_caps);
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS #if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
{ {
guint n = 0; guint n = 0;
priv->n_profiles = 0; priv->n_profiles = 0;
if (decode_caps && ((priv->usage if (decode_caps && ((requested_usage
& (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR & (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR
| VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)) != 0)) { | VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)) != 0)) {
n++; n++;
@ -219,7 +217,7 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
priv->n_profiles++; priv->n_profiles++;
} }
gst_clear_caps (&decode_caps); gst_clear_caps (&decode_caps);
if (encode_caps && ((priv->usage if (encode_caps && ((requested_usage
& (VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR & (VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR
| VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR)) != 0)) { | VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR)) != 0)) {
n++; n++;
@ -234,39 +232,30 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
} }
if (priv->n_profiles > 0) { if (priv->n_profiles > 0) {
no_multiplane = FALSE; no_multiplane = FALSE;
/* HACK(victor): NVIDIA & RADV drivers don't report decoding features for
* color format. Setting usage to zero to short circuit validation. */
requested_usage = 0;
} else } else
#endif #endif
{ {
no_multiplane = TRUE; no_multiplane = TRUE;
requested_usage = priv->usage;
} }
tiling = priv->raw_caps ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL; 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->physical_device,
&priv->v_info, tiling, no_multiplane, requested_usage, priv->vk_fmts, &priv->v_info, tiling, no_multiplane, requested_usage, priv->vk_fmts,
&priv->n_imgs, &supported_usage); &priv->n_imgs, NULL);
if (!found) if (!found)
goto no_vk_format; goto no_vk_format;
if (priv->usage == 0) {
priv->usage = supported_usage & default_usage;
}
{ {
gboolean video = FALSE, sampleable; gboolean video = FALSE, sampleable;
const GstVulkanFormatMap *vkmap; const GstVulkanFormatMap *vkmap;
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS #if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
video = (priv->usage & (VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR video = (requested_usage & (VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR
| VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR
| VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR
| VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR)); | VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR));
#endif #endif
sampleable = priv->usage & sampleable = requested_usage &
(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT); (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT);
if (sampleable && !video) { if (sampleable && !video) {
@ -293,7 +282,7 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
.arrayLayers = priv->n_layers, .arrayLayers = priv->n_layers,
.samples = VK_SAMPLE_COUNT_1_BIT, .samples = VK_SAMPLE_COUNT_1_BIT,
.tiling = tiling, .tiling = tiling,
.usage = priv->usage, .usage = requested_usage,
.sharingMode = VK_SHARING_MODE_EXCLUSIVE, .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
.queueFamilyIndexCount = 0, .queueFamilyIndexCount = 0,
.pQueueFamilyIndices = NULL, .pQueueFamilyIndices = NULL,
@ -351,6 +340,8 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
gst_buffer_pool_config_set_params (config, caps, gst_buffer_pool_config_set_params (config, caps,
priv->v_info.size, min_buffers, max_buffers); priv->v_info.size, min_buffers, max_buffers);
priv->usage = requested_usage;
return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret; return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret;
/* ERRORS */ /* ERRORS */