From ef9875640e3041c7a9f3d5e9886c818a800597cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Mon, 29 Jul 2024 20:59:58 +0200 Subject: [PATCH] vulkanupload: honor downstream pool allocation parameters If a downstream buffer pool is offered, vulkanupload checks its allocation parameters to honor them. Only adds to usage the TRANSFER bits, which are required to upload buffers. Also, fail if the buffer pool cannot be configured with the current parameters. Part-of: --- .../gst-plugins-bad/ext/vulkan/vkupload.c | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/subprojects/gst-plugins-bad/ext/vulkan/vkupload.c b/subprojects/gst-plugins-bad/ext/vulkan/vkupload.c index ccf23543b0..a9c0d307b9 100644 --- a/subprojects/gst-plugins-bad/ext/vulkan/vkupload.c +++ b/subprojects/gst-plugins-bad/ext/vulkan/vkupload.c @@ -1354,10 +1354,13 @@ gst_vulkan_upload_decide_allocation (GstBaseTransform * bt, GstQuery * query) GstStructure *config; GstCaps *caps; guint min, max, size; - gboolean update_pool; - const VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT + gboolean update_pool, is_vulkan_pool; + VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT; + VkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED; + VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + guint64 access = 0; /* VK_ACCESS_NONE */ gst_query_parse_allocation (query, &caps, NULL); if (!caps) @@ -1367,6 +1370,7 @@ gst_vulkan_upload_decide_allocation (GstBaseTransform * bt, GstQuery * query) gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); update_pool = TRUE; + is_vulkan_pool = GST_IS_VULKAN_IMAGE_BUFFER_POOL (pool); } else { GstVideoInfo vinfo; @@ -1374,10 +1378,10 @@ gst_vulkan_upload_decide_allocation (GstBaseTransform * bt, GstQuery * query) gst_video_info_from_caps (&vinfo, caps); size = vinfo.size; min = max = 0; - update_pool = FALSE; + is_vulkan_pool = update_pool = FALSE; } - if (!pool || !GST_IS_VULKAN_IMAGE_BUFFER_POOL (pool)) { + if (!pool || !is_vulkan_pool) { if (pool) gst_object_unref (pool); pool = gst_vulkan_image_buffer_pool_new (vk_upload->device); @@ -1385,14 +1389,22 @@ gst_vulkan_upload_decide_allocation (GstBaseTransform * bt, GstQuery * query) config = gst_buffer_pool_get_config (pool); + if (is_vulkan_pool) { + gst_vulkan_image_buffer_pool_config_get_allocation_params (config, &usage, + &mem_props, &layout, &access); + /* these usage parameters are essential for upload */ + usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + } + gst_buffer_pool_config_set_params (config, caps, size, min, max); gst_vulkan_image_buffer_pool_config_set_allocation_params (config, usage, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - 0 /* VK_ACCESS_NONE */ ); + mem_props, layout, access); if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (pool, "Vulkan Image buffer pool doesn't support requested" + " configuration"); gst_object_unref (pool); - return TRUE; + return FALSE; } if (update_pool)