From eff99fdf813c199e360d73b0b5a626f048f7f259 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Thu, 13 Jan 2022 23:36:37 +0100 Subject: [PATCH] rendervulkan: Add acquire and release barriers for imported images. --- src/rendervulkan.cpp | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 351e2e5..c07d259 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -2173,6 +2173,27 @@ bool vulkan_composite( struct Composite_t *pComposite, struct VulkanPipeline_t * vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); + + std::vector textureBarriers(pComposite->nLayerCount); + for (int32_t i = 0; i < pComposite->nLayerCount; i++) + { + textureBarriers[i].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + textureBarriers[i].pNext = nullptr; + textureBarriers[i].srcAccessMask = 0; + textureBarriers[i].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + textureBarriers[i].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + textureBarriers[i].newLayout = VK_IMAGE_LAYOUT_GENERAL; + textureBarriers[i].srcQueueFamilyIndex = g_vulkanSupportsModifiers + ? VK_QUEUE_FAMILY_FOREIGN_EXT + : VK_QUEUE_FAMILY_EXTERNAL_KHR; + textureBarriers[i].dstQueueFamilyIndex = queueFamilyIndex; + textureBarriers[i].image = pPipeline->layerBindings[i].tex->m_vkImage; + textureBarriers[i].subresourceRange = subResRange; + } + + vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + 0, 0, nullptr, 0, nullptr, textureBarriers.size(), textureBarriers.data() ); + vkCmdBindPipeline(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelines[pComposite->nLayerCount - 1][pComposite->nSwapChannels][pComposite->nYCBCRMask]); @@ -2299,7 +2320,20 @@ bool vulkan_composite( struct Composite_t *pComposite, struct VulkanPipeline_t * vkCmdPipelineBarrier( curCommandBuffer, pScreenshotTexture ? VK_PIPELINE_STAGE_TRANSFER_BIT : VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, useForeignQueue ? 0 : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); - + + for (int32_t i = 0; i < pComposite->nLayerCount; i++) + { + textureBarriers[i].dstAccessMask = 0; + textureBarriers[i].oldLayout = VK_IMAGE_LAYOUT_GENERAL; + textureBarriers[i].srcQueueFamilyIndex = queueFamilyIndex; + textureBarriers[i].dstQueueFamilyIndex = g_vulkanSupportsModifiers + ? VK_QUEUE_FAMILY_FOREIGN_EXT + : VK_QUEUE_FAMILY_EXTERNAL_KHR; + } + + vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + 0, 0, nullptr, 0, nullptr, textureBarriers.size(), textureBarriers.data() ); + res = vkEndCommandBuffer( curCommandBuffer ); if ( res != VK_SUCCESS )