vulkan: add source pipeline stage to _operation_add_frame_barrier()

Instead of dragging the last destination pipeline stage as current barrier
source pipeline stage (which isn't a valid semantic) this patch adds a parameter
to gst_vulkan_operation_add_frame_barrier() to set the source pipeline stage to
define the barrier.

The previous logic brought problems particularly with queue transfers, when the
new queue doesn't support the stage set during a previous operation in a
different queue.

Now the operation API is closer to Vulkan semantics.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7165>
This commit is contained in:
Víctor Manuel Jáquez Leal 2024-07-11 13:05:28 +02:00
parent dd4027388e
commit 2990cc5f71
11 changed files with 35 additions and 19 deletions

View file

@ -4636,6 +4636,11 @@ gst_vulkan_operation_update_frame().</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkoperation.c">a Vulkan Image #GstBuffer</doc>
<type name="Gst.Buffer" c:type="GstBuffer*"/>
</parameter>
<parameter name="src_stage" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkoperation.c">source pipeline stage (VkPipelineStageFlags or
VkPipelineStageFlags2)</doc>
<type name="guint64" c:type="guint64"/>
</parameter>
<parameter name="dst_stage" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkoperation.c">destination pipeline stage (VkPipelineStageFlags or
VkPipelineStageFlags2)</doc>

View file

@ -197,8 +197,9 @@ _image_to_raw_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf)
cmd_buf = raw->exec->cmd_buf;
if (!gst_vulkan_operation_add_frame_barrier (raw->exec, inbuf,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_READ_BIT,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, NULL))
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
NULL))
goto unlock_error;
barriers = gst_vulkan_operation_retrieve_image_barriers (raw->exec);

View file

@ -423,8 +423,9 @@ _buffer_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf)
cmd_buf = raw->exec->cmd_buf;
if (!gst_vulkan_operation_add_frame_barrier (raw->exec, *outbuf,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, NULL))
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
NULL))
goto unlock_error;
barriers = gst_vulkan_operation_retrieve_image_barriers (raw->exec);
@ -685,8 +686,9 @@ _raw_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf)
cmd_buf = raw->exec->cmd_buf;
if (!gst_vulkan_operation_add_frame_barrier (raw->exec, *outbuf,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, NULL))
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
NULL))
goto unlock_error;
barriers = gst_vulkan_operation_retrieve_image_barriers (raw->exec);

View file

@ -692,7 +692,8 @@ gst_vulkan_decoder_decode (GstVulkanDecoder * self,
VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR :
VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR;
gst_vulkan_operation_add_frame_barrier (priv->exec, pic->out,
VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR, new_layout, NULL);
/* Reference for the current image, if existing and not layered */
@ -719,7 +720,8 @@ gst_vulkan_decoder_decode (GstVulkanDecoder * self,
if (!ref_pic->dpb) {
gst_vulkan_operation_add_frame_barrier (priv->exec, ref_buf,
VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR
| VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR,
VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR, NULL);

View file

@ -1303,6 +1303,7 @@ gst_vulkan_encoder_encode (GstVulkanEncoder * self,
VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR);
gst_vulkan_operation_add_frame_barrier (priv->exec, pic->in_buffer,
VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR,
VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,
VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR, NULL);
@ -1311,6 +1312,7 @@ gst_vulkan_encoder_encode (GstVulkanEncoder * self,
VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR);
gst_vulkan_operation_add_frame_barrier (priv->exec, pic->dpb_buffer,
VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR,
VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,
VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR, NULL);

View file

@ -428,8 +428,8 @@ prepare_buffer (GstVulkanImageBufferPool * vk_pool, GstBuffer * buffer)
goto error;
if (!gst_vulkan_operation_add_frame_barrier (priv->exec, buffer,
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, priv->initial_access,
priv->initial_layout, NULL))
VK_PIPELINE_STAGE_NONE_KHR, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
priv->initial_access, priv->initial_layout, NULL))
goto error;
barriers = gst_vulkan_operation_retrieve_image_barriers (priv->exec);

View file

@ -859,6 +859,8 @@ gst_vulkan_operation_add_extra_image_barriers (GstVulkanOperation * self,
* gst_vulkan_operation_add_frame_barrier:
* @self: a #GstVulkanOperation
* @frame: a Vulkan Image #GstBuffer
* @src_stage: source pipeline stage (VkPipelineStageFlags or
* VkPipelineStageFlags2)
* @dst_stage: destination pipeline stage (VkPipelineStageFlags or
* VkPipelineStageFlags2)
* @new_access: the new access flags (VkAccessFlags2 or VkAccessFlags)
@ -876,7 +878,7 @@ gst_vulkan_operation_add_extra_image_barriers (GstVulkanOperation * self,
*/
gboolean
gst_vulkan_operation_add_frame_barrier (GstVulkanOperation * self,
GstBuffer * frame, guint64 dst_stage, guint64 new_access,
GstBuffer * frame, guint64 src_stage, guint64 dst_stage, guint64 new_access,
VkImageLayout new_layout, GstVulkanQueue * new_queue)
{
guint i, n_mems;
@ -932,8 +934,7 @@ gst_vulkan_operation_add_frame_barrier (GstVulkanOperation * self,
VkImageMemoryBarrier2KHR barrier2 = {
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR,
.pNext = NULL,
.srcStageMask = dep_frame ?
dep_frame->dst_stage : vkmem->barrier.parent.pipeline_stages,
.srcStageMask = src_stage,
.dstStageMask = dst_stage,
.srcAccessMask = dep_frame ?
dep_frame->new_access : vkmem->barrier.parent.access_flags,

View file

@ -103,6 +103,7 @@ GArray * gst_vulkan_operation_new_extra_image_barriers
GST_VULKAN_API
gboolean gst_vulkan_operation_add_frame_barrier (GstVulkanOperation * self,
GstBuffer * frame,
guint64 src_stage,
guint64 dst_stage,
guint64 new_access,
VkImageLayout new_layout,

View file

@ -188,8 +188,8 @@ download_and_check_output_buffer (GstVulkanDecoder * dec, VkFormat vk_format,
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
gst_vulkan_operation_add_frame_barrier (exec, pic->out,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_READ_BIT,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, NULL);
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, NULL);
barriers = gst_vulkan_operation_retrieve_image_barriers (exec);
/* *INDENT-OFF* */

View file

@ -240,8 +240,9 @@ upload_buffer_to_image (GstBufferPool * pool, GstBuffer * inbuf,
cmd_buf = exec->cmd_buf;
if (!gst_vulkan_operation_add_frame_barrier (exec, *outbuf,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, NULL))
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
NULL))
goto unlock_error;
barriers = gst_vulkan_operation_retrieve_image_barriers (exec);

View file

@ -245,8 +245,9 @@ upload_buffer_to_image (GstBufferPool * pool, GstBuffer * inbuf,
cmd_buf = exec->cmd_buf;
if (!gst_vulkan_operation_add_frame_barrier (exec, *outbuf,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, NULL))
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
NULL))
goto unlock_error;
barriers = gst_vulkan_operation_retrieve_image_barriers (exec);