1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-02 01:24:11 +01:00

[dxvk] Simplify barriers around meta copy operations

This commit is contained in:
Philip Rebohle 2020-05-02 18:40:42 +02:00
parent f6007e4f1a
commit c1fcc3fc98
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 43 additions and 28 deletions

View File

@ -2913,7 +2913,8 @@ namespace dxvk {
if (srcImage->info().layout != srcLayout) { if (srcImage->info().layout != srcLayout) {
m_execAcquires.accessImage( m_execAcquires.accessImage(
srcImage, srcSubresourceRange, srcImage, srcSubresourceRange,
srcImage->info().layout, 0, 0, srcImage->info().layout,
srcImage->info().stages, 0,
srcLayout, srcLayout,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
VK_ACCESS_SHADER_READ_BIT); VK_ACCESS_SHADER_READ_BIT);
@ -2945,9 +2946,8 @@ namespace dxvk {
info.numLayers = dstSubresource.layerCount; info.numLayers = dstSubresource.layerCount;
info.mipLevels = 1; info.mipLevels = 1;
info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | tgtUsage; info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | tgtUsage;
info.stages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT info.stages = VK_PIPELINE_STAGE_TRANSFER_BIT;
| VK_PIPELINE_STAGE_TRANSFER_BIT; info.access = VK_ACCESS_TRANSFER_READ_BIT;
info.access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
info.tiling = VK_IMAGE_TILING_OPTIMAL; info.tiling = VK_IMAGE_TILING_OPTIMAL;
info.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; info.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
@ -3071,26 +3071,15 @@ namespace dxvk {
m_cmd->cmdDraw(3, tgtSubresource.layerCount, 0, 0); m_cmd->cmdDraw(3, tgtSubresource.layerCount, 0, 0);
m_cmd->cmdEndRenderPass(); m_cmd->cmdEndRenderPass();
m_execBarriers.accessImage( if (srcLayout != srcImage->info().layout) {
srcImage, srcSubresourceRange, m_execBarriers.accessImage(
srcLayout, srcImage, srcSubresourceRange, srcLayout,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, srcImage->info().stages,
VK_ACCESS_SHADER_READ_BIT, srcImage->info().access,
srcImage->info().layout, srcImage->info().layout,
srcImage->info().stages, srcImage->info().stages,
srcImage->info().access); srcImage->info().access);
}
m_execBarriers.accessImage(
dstImage, dstSubresourceRange,
dstImage->info().layout,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
dstImage->info().layout,
dstImage->info().stages,
dstImage->info().access);
m_cmd->trackResource<DxvkAccess::Write>(tgtImage); m_cmd->trackResource<DxvkAccess::Write>(tgtImage);
m_cmd->trackResource<DxvkAccess::Read>(srcImage); m_cmd->trackResource<DxvkAccess::Read>(srcImage);

View File

@ -42,6 +42,9 @@ namespace dxvk {
VkRenderPass DxvkMetaCopyRenderPass::createRenderPass(bool discard) const { VkRenderPass DxvkMetaCopyRenderPass::createRenderPass(bool discard) const {
auto aspect = m_dstImageView->info().aspect; auto aspect = m_dstImageView->info().aspect;
VkPipelineStageFlags cpyStages = 0;
VkAccessFlags cpyAccess = 0;
VkAttachmentDescription attachment; VkAttachmentDescription attachment;
attachment.flags = 0; attachment.flags = 0;
attachment.format = m_dstImageView->info().format; attachment.format = m_dstImageView->info().format;
@ -62,8 +65,8 @@ namespace dxvk {
VkAttachmentReference attachmentRef; VkAttachmentReference attachmentRef;
attachmentRef.attachment = 0; attachmentRef.attachment = 0;
attachmentRef.layout = (aspect & VK_IMAGE_ASPECT_COLOR_BIT) attachmentRef.layout = (aspect & VK_IMAGE_ASPECT_COLOR_BIT)
? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL ? m_dstImageView->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
: VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; : m_dstImageView->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
VkSubpassDescription subpass; VkSubpassDescription subpass;
subpass.flags = 0; subpass.flags = 0;
@ -80,10 +83,33 @@ namespace dxvk {
if (aspect & VK_IMAGE_ASPECT_COLOR_BIT) { if (aspect & VK_IMAGE_ASPECT_COLOR_BIT) {
subpass.colorAttachmentCount = 1; subpass.colorAttachmentCount = 1;
subpass.pColorAttachments = &attachmentRef; subpass.pColorAttachments = &attachmentRef;
cpyStages |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
cpyAccess |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
if (!discard)
cpyAccess |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
} else { } else {
subpass.pDepthStencilAttachment = &attachmentRef; subpass.pDepthStencilAttachment = &attachmentRef;
cpyStages |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
cpyAccess |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
if (!discard)
cpyAccess |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
} }
// We have to be somewhat conservative here since we cannot assume
// that the backend blocks stages that are only used for meta ops
VkPipelineStageFlags extStages = m_dstImageView->imageInfo().stages | m_srcImageView->imageInfo().stages;
VkAccessFlags extAccess = m_dstImageView->imageInfo().access;
std::array<VkSubpassDependency, 2> dependencies = {{
{ VK_SUBPASS_EXTERNAL, 0, extStages, cpyStages, 0, cpyAccess, 0 },
{ 0, VK_SUBPASS_EXTERNAL, cpyStages, extStages, cpyAccess, extAccess, 0 },
}};
VkRenderPassCreateInfo info; VkRenderPassCreateInfo info;
info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
info.pNext = nullptr; info.pNext = nullptr;
@ -92,8 +118,8 @@ namespace dxvk {
info.pAttachments = &attachment; info.pAttachments = &attachment;
info.subpassCount = 1; info.subpassCount = 1;
info.pSubpasses = &subpass; info.pSubpasses = &subpass;
info.dependencyCount = 0; info.dependencyCount = dependencies.size();
info.pDependencies = nullptr; info.pDependencies = dependencies.data();
VkRenderPass result = VK_NULL_HANDLE; VkRenderPass result = VK_NULL_HANDLE;
if (m_vkd->vkCreateRenderPass(m_vkd->device(), &info, nullptr, &result) != VK_SUCCESS) if (m_vkd->vkCreateRenderPass(m_vkd->device(), &info, nullptr, &result) != VK_SUCCESS)