diff options
author | Lynne <dev@lynne.ee> | 2020-03-12 16:57:14 +0000 |
---|---|---|
committer | Lynne <dev@lynne.ee> | 2020-03-12 18:16:11 +0000 |
commit | 9086af2a0a590c7f576b72379d1708392cd96d5c (patch) | |
tree | bb3de240990d2d727311e4b938af2b6e74ced07e /libavutil/hwcontext_vulkan.c | |
parent | 08d0a8992d75bbcffe9e7f3392cc94a7f84fc9df (diff) | |
download | ffmpeg-9086af2a0a590c7f576b72379d1708392cd96d5c.tar.gz |
hwcontext_vulkan: only convert image layout for transfers if necessary
Diffstat (limited to 'libavutil/hwcontext_vulkan.c')
-rw-r--r-- | libavutil/hwcontext_vulkan.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 8ed0e6edfa..51fdbd2489 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -2437,6 +2437,8 @@ static int transfer_image_buf(AVHWDeviceContext *ctx, AVVkFrame *frame, VkResult ret; AVVulkanDeviceContext *hwctx = ctx->hwctx; VulkanDevicePriv *s = ctx->internal->priv; + + int bar_num = 0; VkPipelineStageFlagBits sem_wait_dst[AV_NUM_DATA_POINTERS]; const int planes = av_pix_fmt_count_planes(pix_fmt); @@ -2469,29 +2471,39 @@ static int transfer_image_buf(AVHWDeviceContext *ctx, AVVkFrame *frame, /* Change the image layout to something more optimal for transfers */ for (int i = 0; i < planes; i++) { - img_bar[i].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - img_bar[i].srcAccessMask = 0x0; - img_bar[i].dstAccessMask = to_buf ? VK_ACCESS_TRANSFER_READ_BIT : + VkImageLayout new_layout = to_buf ? VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL : + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + VkAccessFlags new_access = to_buf ? VK_ACCESS_TRANSFER_READ_BIT : VK_ACCESS_TRANSFER_WRITE_BIT; - img_bar[i].oldLayout = frame->layout[i]; - img_bar[i].newLayout = to_buf ? VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL : - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - img_bar[i].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - img_bar[i].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - img_bar[i].image = frame->img[i]; - img_bar[i].subresourceRange.levelCount = 1; - img_bar[i].subresourceRange.layerCount = 1; - img_bar[i].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; sem_wait_dst[i] = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - frame->layout[i] = img_bar[i].newLayout; - frame->access[i] = img_bar[i].dstAccessMask; + /* If the layout matches and we have read access skip the barrier */ + if ((frame->layout[i] == new_layout) && (frame->access[i] & new_access)) + continue; + + img_bar[bar_num].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + img_bar[bar_num].srcAccessMask = 0x0; + img_bar[bar_num].dstAccessMask = new_access; + img_bar[bar_num].oldLayout = frame->layout[i]; + img_bar[bar_num].newLayout = new_layout; + img_bar[bar_num].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + img_bar[bar_num].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + img_bar[bar_num].image = frame->img[i]; + img_bar[bar_num].subresourceRange.levelCount = 1; + img_bar[bar_num].subresourceRange.layerCount = 1; + img_bar[bar_num].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + + frame->layout[i] = img_bar[bar_num].newLayout; + frame->access[i] = img_bar[bar_num].dstAccessMask; + + bar_num++; } - vkCmdPipelineBarrier(s->cmd.buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, 0, - 0, NULL, 0, NULL, planes, img_bar); + if (bar_num) + vkCmdPipelineBarrier(s->cmd.buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, 0, + 0, NULL, 0, NULL, bar_num, img_bar); /* Schedule a copy for each plane */ for (int i = 0; i < planes; i++) { |