rendervulkan: Add acquire and release barriers for imported images.

This commit is contained in:
Georg Lehmann 2022-01-13 23:36:37 +01:00 committed by Joshua Ashton
parent 10ba9f3908
commit eff99fdf81

View file

@ -2174,6 +2174,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, vkCmdPipelineBarrier( curCommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier );
std::vector<VkImageMemoryBarrier> 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]); vkCmdBindPipeline(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelines[pComposite->nLayerCount - 1][pComposite->nSwapChannels][pComposite->nYCBCRMask]);
vkCmdBindDescriptorSets(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, vkCmdBindDescriptorSets(curCommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE,
@ -2300,6 +2321,19 @@ bool vulkan_composite( struct Composite_t *pComposite, struct VulkanPipeline_t *
useForeignQueue ? 0 : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, useForeignQueue ? 0 : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
0, 0, nullptr, 0, nullptr, 1, &memoryBarrier ); 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 ); res = vkEndCommandBuffer( curCommandBuffer );
if ( res != VK_SUCCESS ) if ( res != VK_SUCCESS )