mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-24 06:36:08 +00:00
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)),
|
||||
|
||||
Reference in New Issue
Block a user