mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-28 09:26:52 +00:00
Check for created initial contents before handling MSAA. Refs #579
* In edge cases, MSAA textures can have no true initial contents and will need to be cleared.
This commit is contained in:
@@ -2072,88 +2072,6 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live,
|
||||
return;
|
||||
}
|
||||
|
||||
if(m_CreationInfo.m_Image[id].samples != VK_SAMPLE_COUNT_1_BIT)
|
||||
{
|
||||
VkCommandBuffer cmd = GetNextCmd();
|
||||
|
||||
vkr = ObjDisp(cmd)->BeginCommandBuffer(Unwrap(cmd), &beginInfo);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
|
||||
VulkanCreationInfo::Image &c = m_CreationInfo.m_Image[id];
|
||||
|
||||
VkFormat fmt = c.format;
|
||||
if(IsStencilOnlyFormat(fmt))
|
||||
aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
else if(IsDepthOrStencilFormat(fmt))
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
|
||||
if(aspectFlags == VK_IMAGE_ASPECT_DEPTH_BIT && !IsDepthOnlyFormat(fmt))
|
||||
aspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
|
||||
VkImageMemoryBarrier barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||
NULL,
|
||||
0,
|
||||
0,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_GENERAL,
|
||||
VK_QUEUE_FAMILY_IGNORED,
|
||||
VK_QUEUE_FAMILY_IGNORED,
|
||||
ToHandle<VkImage>(live),
|
||||
{aspectFlags, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS},
|
||||
};
|
||||
|
||||
barrier.srcAccessMask = VK_ACCESS_ALL_WRITE_BITS;
|
||||
barrier.dstAccessMask =
|
||||
VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
|
||||
for(size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++)
|
||||
{
|
||||
barrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange;
|
||||
barrier.oldLayout = m_ImageLayouts[id].subresourceStates[si].newLayout;
|
||||
DoPipelineBarrier(cmd, 1, &barrier);
|
||||
}
|
||||
|
||||
WrappedVkImage *arrayIm = (WrappedVkImage *)initial.resource;
|
||||
|
||||
vkr = ObjDisp(cmd)->EndCommandBuffer(Unwrap(cmd));
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
GetDebugManager()->CopyArrayToTex2DMS(ToHandle<VkImage>(live), arrayIm->real.As<VkImage>(),
|
||||
c.extent, (uint32_t)c.arrayLayers, (uint32_t)c.samples,
|
||||
fmt);
|
||||
|
||||
cmd = GetNextCmd();
|
||||
|
||||
vkr = ObjDisp(cmd)->BeginCommandBuffer(Unwrap(cmd), &beginInfo);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
|
||||
// complete copy before any other work
|
||||
barrier.srcAccessMask =
|
||||
VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
barrier.dstAccessMask = VK_ACCESS_ALL_READ_BITS;
|
||||
|
||||
for(size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++)
|
||||
{
|
||||
barrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange;
|
||||
barrier.newLayout = m_ImageLayouts[id].subresourceStates[si].newLayout;
|
||||
barrier.dstAccessMask |= MakeAccessMask(barrier.newLayout);
|
||||
DoPipelineBarrier(cmd, 1, &barrier);
|
||||
}
|
||||
|
||||
vkr = ObjDisp(cmd)->EndCommandBuffer(Unwrap(cmd));
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
#if ENABLED(SINGLE_FLUSH_VALIDATE)
|
||||
SubmitCmds();
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
// handle any 'created' initial states, without an actual image with contents
|
||||
if(initial.resource == NULL)
|
||||
{
|
||||
@@ -2295,6 +2213,88 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live,
|
||||
return;
|
||||
}
|
||||
|
||||
if(m_CreationInfo.m_Image[id].samples != VK_SAMPLE_COUNT_1_BIT)
|
||||
{
|
||||
VkCommandBuffer cmd = GetNextCmd();
|
||||
|
||||
vkr = ObjDisp(cmd)->BeginCommandBuffer(Unwrap(cmd), &beginInfo);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
|
||||
VulkanCreationInfo::Image &c = m_CreationInfo.m_Image[id];
|
||||
|
||||
VkFormat fmt = c.format;
|
||||
if(IsStencilOnlyFormat(fmt))
|
||||
aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
else if(IsDepthOrStencilFormat(fmt))
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
|
||||
if(aspectFlags == VK_IMAGE_ASPECT_DEPTH_BIT && !IsDepthOnlyFormat(fmt))
|
||||
aspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
|
||||
VkImageMemoryBarrier barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||
NULL,
|
||||
0,
|
||||
0,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_GENERAL,
|
||||
VK_QUEUE_FAMILY_IGNORED,
|
||||
VK_QUEUE_FAMILY_IGNORED,
|
||||
ToHandle<VkImage>(live),
|
||||
{aspectFlags, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS},
|
||||
};
|
||||
|
||||
barrier.srcAccessMask = VK_ACCESS_ALL_WRITE_BITS;
|
||||
barrier.dstAccessMask =
|
||||
VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
|
||||
for(size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++)
|
||||
{
|
||||
barrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange;
|
||||
barrier.oldLayout = m_ImageLayouts[id].subresourceStates[si].newLayout;
|
||||
DoPipelineBarrier(cmd, 1, &barrier);
|
||||
}
|
||||
|
||||
WrappedVkImage *arrayIm = (WrappedVkImage *)initial.resource;
|
||||
|
||||
vkr = ObjDisp(cmd)->EndCommandBuffer(Unwrap(cmd));
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
GetDebugManager()->CopyArrayToTex2DMS(ToHandle<VkImage>(live), arrayIm->real.As<VkImage>(),
|
||||
c.extent, (uint32_t)c.arrayLayers, (uint32_t)c.samples,
|
||||
fmt);
|
||||
|
||||
cmd = GetNextCmd();
|
||||
|
||||
vkr = ObjDisp(cmd)->BeginCommandBuffer(Unwrap(cmd), &beginInfo);
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
|
||||
// complete copy before any other work
|
||||
barrier.srcAccessMask =
|
||||
VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
barrier.dstAccessMask = VK_ACCESS_ALL_READ_BITS;
|
||||
|
||||
for(size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++)
|
||||
{
|
||||
barrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange;
|
||||
barrier.newLayout = m_ImageLayouts[id].subresourceStates[si].newLayout;
|
||||
barrier.dstAccessMask |= MakeAccessMask(barrier.newLayout);
|
||||
DoPipelineBarrier(cmd, 1, &barrier);
|
||||
}
|
||||
|
||||
vkr = ObjDisp(cmd)->EndCommandBuffer(Unwrap(cmd));
|
||||
RDCASSERTEQUAL(vkr, VK_SUCCESS);
|
||||
|
||||
#if ENABLED(SINGLE_FLUSH_VALIDATE)
|
||||
SubmitCmds();
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
WrappedVkBuffer *buf = (WrappedVkBuffer *)initial.resource;
|
||||
|
||||
VkCommandBuffer cmd = GetNextCmd();
|
||||
|
||||
Reference in New Issue
Block a user