From baea067fd945382c37d337c11affdf65abb9a3fd Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 20 Apr 2017 10:49:07 +0100 Subject: [PATCH] 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. --- renderdoc/driver/vulkan/vk_initstate.cpp | 164 +++++++++++------------ 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index 554c65d6f..648a4debd 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -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(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(live), arrayIm->real.As(), - 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(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(live), arrayIm->real.As(), + 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();