From 94beec0c130c8260f3439e1b7005301ab51456cb Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 18 Apr 2019 12:08:27 +0200 Subject: [PATCH] [dxvk] Fix subresources in barriers for 2D views of 3D images The array layers passed during framebuffer creation are the selected 3D slices in this case, the image actually only has one array layer. We should account for that when recording barriers. --- src/dxvk/dxvk_context.cpp | 20 ++++++++++---------- src/dxvk/dxvk_image.h | 31 +++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 98e5f4abd..0e606dcdc 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -629,7 +629,7 @@ namespace dxvk { if (m_barriers.isImageDirty( imageView->image(), - imageView->subresources(), + imageView->imageSubresources(), DxvkAccess::Write)) m_barriers.recordCommands(m_cmd); @@ -656,7 +656,7 @@ namespace dxvk { m_barriers.accessImage( imageView->image(), - imageView->subresources(), + imageView->imageSubresources(), imageView->imageInfo().layout, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, imageView->imageInfo().layout, @@ -2158,7 +2158,7 @@ namespace dxvk { if (m_barriers.isImageDirty( imageView->image(), - imageView->subresources(), + imageView->imageSubresources(), DxvkAccess::Write)) m_barriers.recordCommands(m_cmd); @@ -2194,7 +2194,7 @@ namespace dxvk { m_barriers.accessImage( imageView->image(), - imageView->subresources(), + imageView->imageSubresources(), imageView->imageInfo().layout, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, imageView->imageInfo().layout, @@ -2237,7 +2237,7 @@ namespace dxvk { if (m_barriers.isImageDirty( imageView->image(), - imageView->subresources(), + imageView->imageSubresources(), DxvkAccess::Write)) m_barriers.recordCommands(m_cmd); @@ -2298,7 +2298,7 @@ namespace dxvk { m_barriers.accessImage( imageView->image(), - imageView->subresources(), + imageView->imageSubresources(), imageView->imageInfo().layout, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_SHADER_WRITE_BIT, @@ -2883,7 +2883,7 @@ namespace dxvk { flushBarriers |= m_barriers.isImageDirty( attachment.view->image(), - attachment.view->subresources(), + attachment.view->imageSubresources(), DxvkAccess::Write); } @@ -2907,7 +2907,7 @@ namespace dxvk { m_barriers.accessImage( attachment.view->image(), - attachment.view->subresources(), + attachment.view->imageSubresources(), attachment.view->imageInfo().layout, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, attachment.view->imageInfo().layout, @@ -3827,7 +3827,7 @@ namespace dxvk { case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: srcAccess = m_barriers.getImageAccess( slot.imageView->image(), - slot.imageView->subresources()); + slot.imageView->imageSubresources()); break; default: @@ -3902,7 +3902,7 @@ namespace dxvk { case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: m_barriers.accessImage( slot.imageView->image(), - slot.imageView->subresources(), + slot.imageView->imageSubresources(), slot.imageView->imageInfo().layout, stages, access, slot.imageView->imageInfo().layout, diff --git a/src/dxvk/dxvk_image.h b/src/dxvk/dxvk_image.h index 200548681..f55ae42d1 100644 --- a/src/dxvk/dxvk_image.h +++ b/src/dxvk/dxvk_image.h @@ -372,8 +372,12 @@ namespace dxvk { } /** - * \brief Subresource range - * \returns Subresource range + * \brief View subresource range + * + * Returns the subresource range from the image + * description. For 2D views of 3D images, this + * will return the viewed 3D slices. + * \returns View subresource range */ VkImageSubresourceRange subresources() const { VkImageSubresourceRange result; @@ -384,6 +388,29 @@ namespace dxvk { result.layerCount = m_info.numLayers; return result; } + + /** + * \brief Actual image subresource range + * + * Handles 3D images correctly in that it only + * returns one single array layer. Use this for + * barriers. + * \returns Image subresource range + */ + VkImageSubresourceRange imageSubresources() const { + VkImageSubresourceRange result; + result.aspectMask = m_info.aspect; + result.baseMipLevel = m_info.minLevel; + result.levelCount = m_info.numLevels; + if (likely(m_image->info().type != VK_IMAGE_TYPE_3D)) { + result.baseArrayLayer = m_info.minLayer; + result.layerCount = m_info.numLayers; + } else { + result.baseArrayLayer = 0; + result.layerCount = 1; + } + return result; + } /** * \brief Picks an image layout