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