From f95cd087ee0463ec864694d7fcb7e9fdc0058aad Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 9 Jan 2020 17:00:12 +0000 Subject: [PATCH] Fix replay of vkCmdBeginRenderPass as a lone event * We need to substitute it for the loadRP version. --- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 48 +++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 1f014b948..e83227ee2 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1233,13 +1233,33 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(SerialiserType &ser, VkComman m_RenderState.renderArea = RenderPassBegin.renderArea; } - ObjDisp(commandBuffer)->CmdBeginRenderPass(Unwrap(commandBuffer), &unwrappedInfo, contents); - rdcarray imgBarriers = GetImplicitRenderPassBarriers(); + // if we're just replaying the vkCmdBeginRenderPass on its own, we use the first loadRP + // instead of the real thing. This still does the clears that we want but then doesn't + // require us to finish off any subpasses etc. + // we need to manually do the subpass 0 barriers, since loadRP expects the image to already + // be in subpass 0's layout + if(m_FirstEventID == m_LastEventID) + { + VulkanCreationInfo::Framebuffer fbinfo = m_CreationInfo.m_Framebuffer[fb]; + VulkanCreationInfo::RenderPass rpinfo = + m_CreationInfo.m_RenderPass[m_RenderState.renderPass]; + unwrappedInfo.renderPass = Unwrap(rpinfo.loadRPs[0]); + unwrappedInfo.framebuffer = Unwrap(fbinfo.loadFBs[0]); + + DoPipelineBarrier(commandBuffer, imgBarriers.size(), imgBarriers.data()); + } + + ObjDisp(commandBuffer)->CmdBeginRenderPass(Unwrap(commandBuffer), &unwrappedInfo, contents); + ResourceId cmd = GetResID(commandBuffer); GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts, (uint32_t)imgBarriers.size(), imgBarriers.data()); + + if(m_FirstEventID == m_LastEventID) + GetResourceManager()->ApplyBarriers( + m_QueueFamilyIdx, m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts); } } else @@ -1648,14 +1668,34 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass2KHR(SerialiserType &ser, m_RenderState.renderArea = RenderPassBegin.renderArea; } + rdcarray imgBarriers = GetImplicitRenderPassBarriers(); + + // if we're just replaying the vkCmdBeginRenderPass on its own, we use the first loadRP + // instead of the real thing. This still does the clears that we want but then doesn't + // require us to finish off any subpasses etc. + // we need to manually do the subpass 0 barriers, since loadRP expects the image to already + // be in subpass 0's layout + if(m_FirstEventID == m_LastEventID) + { + VulkanCreationInfo::Framebuffer fbinfo = m_CreationInfo.m_Framebuffer[fb]; + VulkanCreationInfo::RenderPass rpinfo = + m_CreationInfo.m_RenderPass[m_RenderState.renderPass]; + unwrappedInfo.renderPass = Unwrap(rpinfo.loadRPs[0]); + unwrappedInfo.framebuffer = Unwrap(fbinfo.loadFBs[0]); + + DoPipelineBarrier(commandBuffer, imgBarriers.size(), imgBarriers.data()); + } + ObjDisp(commandBuffer) ->CmdBeginRenderPass2KHR(Unwrap(commandBuffer), &unwrappedInfo, &unwrappedBeginInfo); - rdcarray imgBarriers = GetImplicitRenderPassBarriers(); - ResourceId cmd = GetResID(commandBuffer); GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts, (uint32_t)imgBarriers.size(), imgBarriers.data()); + + if(m_FirstEventID == m_LastEventID) + GetResourceManager()->ApplyBarriers( + m_QueueFamilyIdx, m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts); } } else