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)