mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-22 09:41:07 +00:00
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:
parent
dd4027388e
commit
2990cc5f71
11 changed files with 35 additions and 19 deletions
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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* */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue