1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-21 21:57:39 +01:00

[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.
This commit is contained in:
Philip Rebohle 2019-04-18 12:08:27 +02:00
parent b44cad4d32
commit 94beec0c13
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 39 additions and 12 deletions

View File

@ -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,

View File

@ -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