Renderpass barriers apply to whole 3D texture even when using one slice

* When the renderpass has an initialLayout = UNDEFINED, that applies to the
  whole resource on 3D textures even if we're only rendering to a slice at a
  time
This commit is contained in:
baldurk
2019-12-12 17:58:51 +00:00
parent f8ff6b4f6c
commit 39793cf850
3 changed files with 40 additions and 19 deletions
@@ -179,6 +179,12 @@ std::vector<VkImageMemoryBarrier> WrappedVulkan::GetImplicitRenderPassBarriers(u
if(IsDepthAndStencilFormat(c.format))
barrier.subresourceRange.aspectMask = (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
if(c.type == VK_IMAGE_TYPE_3D)
{
barrier.subresourceRange.baseArrayLayer = 0;
barrier.subresourceRange.layerCount = 1;
}
barrier.newLayout = atts[i].layout;
// search back from this subpass to see which layout it was in before. If it's
@@ -694,6 +694,18 @@ VkResult WrappedVulkan::vkCreateFramebuffer(VkDevice device,
record->imageAttachments[i].barrier.image =
GetResourceManager()->GetCurrentHandle<VkImage>(attRecord->baseResource);
record->imageAttachments[i].barrier.subresourceRange = attRecord->viewRange;
ImageLayouts *layout = NULL;
{
SCOPED_LOCK(m_ImageLayoutsLock);
layout = &m_ImageLayouts[attRecord->GetResourceID()];
}
if(layout->imageInfo.extent.depth > 1)
{
record->imageAttachments[i].barrier.subresourceRange.baseArrayLayer = 0;
record->imageAttachments[i].barrier.subresourceRange.layerCount = 1;
}
}
}
}
+22 -19
View File
@@ -1077,6 +1077,7 @@ void main()
pipeCreateInfo.depthStencilState.depthCompareOp = VK_COMPARE_OP_ALWAYS;
pipeCreateInfo.depthStencilState.front.compareOp = VK_COMPARE_OP_ALWAYS;
renderPassCreateInfo.attachments[0].initialLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
renderPassCreateInfo.attachments[0].finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
VkPipelineShaderStageCreateInfo msps[(size_t)DataType::Count];
@@ -1103,18 +1104,32 @@ void main()
vkBeginCommandBuffer(cmd, vkh::CommandBufferBeginInfo());
VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
if(t.isDepth)
{
aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
if(t.fmt.viewFmt == VK_FORMAT_S8_UINT || t.fmt.viewFmt == VK_FORMAT_D16_UNORM_S8_UINT ||
t.fmt.viewFmt == VK_FORMAT_D24_UNORM_S8_UINT ||
t.fmt.viewFmt == VK_FORMAT_D32_SFLOAT_S8_UINT)
aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
}
vkh::cmdPipelineBarrier(
cmd, {
vkh::ImageMemoryBarrier(
0, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
t.res.image, vkh::ImageSubresourceRange(aspectMask)),
});
if(!t.canRender && !t.isDepth)
{
TEST_WARN("Need data for test %s %s, but it's not a renderable/depthable format",
t.fmt.name.c_str(), MakeName(t).c_str());
vkh::cmdPipelineBarrier(
cmd, {
vkh::ImageMemoryBarrier(0, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, t.res.image,
vkh::ImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT)),
});
vkEndCommandBuffer(cmd);
Submit(99, 99, {cmd});
@@ -1276,18 +1291,6 @@ void main()
if(viewType == VK_IMAGE_VIEW_TYPE_3D)
viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
if(t.isDepth)
{
aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
if(t.fmt.viewFmt == VK_FORMAT_S8_UINT || t.fmt.viewFmt == VK_FORMAT_D16_UNORM_S8_UINT ||
t.fmt.viewFmt == VK_FORMAT_D24_UNORM_S8_UINT ||
t.fmt.viewFmt == VK_FORMAT_D32_SFLOAT_S8_UINT)
aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
}
vkCreateImageView(
device, vkh::ImageViewCreateInfo(t.res.image, viewType, t.fmt.viewFmt, {},
vkh::ImageSubresourceRange(aspectMask, mp, 1, sl, 1)),