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:
parent
b44cad4d32
commit
94beec0c13
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user