From 7627f6e3eda85c316e6bfb6b9d6656c66c1990d1 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 25 Mar 2019 17:34:41 +0100 Subject: [PATCH] [dxvk] Optimize meta copy barriers --- src/dxvk/dxvk_context.cpp | 36 ++++++++++++++++++++++-------------- src/dxvk/dxvk_meta_copy.cpp | 16 ++-------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index d90eadd4f..b7df61952 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2033,9 +2033,12 @@ namespace dxvk { VkImageSubresourceLayers srcSubresource, VkOffset3D srcOffset, VkExtent3D extent) { - m_barriers.recordCommands(m_cmd); - + auto dstSubresourceRange = vk::makeSubresourceRange(dstSubresource); auto srcSubresourceRange = vk::makeSubresourceRange(srcSubresource); + + if (m_barriers.isImageDirty(dstImage, dstSubresourceRange, DxvkAccess::Write) + || m_barriers.isImageDirty(srcImage, srcSubresourceRange, DxvkAccess::Write)) + m_barriers.recordCommands(m_cmd); // Source image needs to be readable if (!(srcImage->info().usage & VK_IMAGE_USAGE_SAMPLED_BIT)) { @@ -2208,21 +2211,26 @@ namespace dxvk { m_cmd->cmdDraw(1, tgtSubresource.layerCount, 0, 0); m_cmd->cmdEndRenderPass(); + m_barriers.accessImage( + srcImage, srcSubresourceRange, + srcLayout, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_SHADER_READ_BIT, + srcImage->info().layout, + srcImage->info().stages, + srcImage->info().access); + + m_barriers.accessImage( + dstImage, dstSubresourceRange, + dstImage->info().layout, + VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, + dstImage->info().layout, + dstImage->info().stages, + dstImage->info().access); + m_cmd->trackResource(tgtImage); m_cmd->trackResource(srcImage); m_cmd->trackResource(fb); - - // If necessary, transition source image back - if (srcImage->info().layout != srcLayout) { - m_barriers.accessImage( - srcImage, srcSubresourceRange, - srcLayout, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_ACCESS_SHADER_READ_BIT, - srcImage->info().layout, - srcImage->info().stages, - srcImage->info().access); - } // If necessary, copy the temporary image // to the original destination image diff --git a/src/dxvk/dxvk_meta_copy.cpp b/src/dxvk/dxvk_meta_copy.cpp index e20102e5f..a3ab7b37b 100644 --- a/src/dxvk/dxvk_meta_copy.cpp +++ b/src/dxvk/dxvk_meta_copy.cpp @@ -35,18 +35,6 @@ namespace dxvk { VkRenderPass DxvkMetaCopyRenderPass::createRenderPass(bool discard) const { auto aspect = m_dstImageView->info().aspect; - std::array subpassDeps = {{ - { VK_SUBPASS_EXTERNAL, 0, - m_dstImageView->imageInfo().stages, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - 0, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 0 }, - { 0, VK_SUBPASS_EXTERNAL, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - m_dstImageView->imageInfo().stages, - VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, - m_dstImageView->imageInfo().access, 0 }, - }}; - VkAttachmentDescription attachment; attachment.flags = 0; attachment.format = m_dstImageView->info().format; @@ -96,8 +84,8 @@ namespace dxvk { info.pAttachments = &attachment; info.subpassCount = 1; info.pSubpasses = &subpass; - info.dependencyCount = subpassDeps.size(); - info.pDependencies = subpassDeps.data(); + info.dependencyCount = 0; + info.pDependencies = nullptr; VkRenderPass result = VK_NULL_HANDLE; if (m_vkd->vkCreateRenderPass(m_vkd->device(), &info, nullptr, &result) != VK_SUCCESS)