From 574d87e72a064eb31277cb140465ebe0cfc48cea Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 9 Feb 2022 13:02:15 +0000 Subject: [PATCH] Force use of load RPs/FBs for pixel history * When we're splitting every draw and execute to get pre- and post-mod colours, we resume renderpasses with load RPs for obvious reasons. The inheritance info needs to match in secondary command buffers, so we force it over conditionally. --- renderdoc/driver/vulkan/vk_core.h | 6 ++++++ renderdoc/driver/vulkan/vk_counters.cpp | 3 +++ renderdoc/driver/vulkan/vk_overlay.cpp | 1 + renderdoc/driver/vulkan/vk_pixelhistory.cpp | 5 +++++ renderdoc/driver/vulkan/vk_postvs.cpp | 1 + .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 20 +++++++++++++++++-- 6 files changed, 34 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index b3a29fc64..70acce052 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -240,6 +240,12 @@ struct VulkanActionCallback // command buffer in pCommandBuffers. virtual bool SplitSecondary() = 0; + // Returns true if secondary command buffer inheritance info should be modified so + // it uses the load FB/RP instead of the original FB/RP. This is mostly used when a callback is + // starting/stopping RPs around every execute, so it resumes with the load RP which must + // match. + virtual bool ForceLoadRPs() = 0; + // called before vkCmdExecuteCommands with a range for the draws inside the // secondary command buffer. virtual void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, diff --git a/renderdoc/driver/vulkan/vk_counters.cpp b/renderdoc/driver/vulkan/vk_counters.cpp index 7c60aaa73..95d507506 100644 --- a/renderdoc/driver/vulkan/vk_counters.cpp +++ b/renderdoc/driver/vulkan/vk_counters.cpp @@ -408,6 +408,7 @@ struct VulkanAMDActionCallback : public VulkanActionCallback m_AliasEvents.push_back(make_rdcpair(primary, alias)); } bool SplitSecondary() override { return false; } + bool ForceLoadRPs() override { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) override { @@ -564,6 +565,7 @@ struct VulkanKHRCallback : public VulkanActionCallback m_AliasEvents.push_back(std::make_pair(primary, alias)); } bool SplitSecondary() override { return false; } + bool ForceLoadRPs() override { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) override { @@ -778,6 +780,7 @@ struct VulkanGPUTimerCallback : public VulkanActionCallback m_AliasEvents.push_back(make_rdcpair(primary, alias)); } bool SplitSecondary() override { return false; } + bool ForceLoadRPs() override { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) override { diff --git a/renderdoc/driver/vulkan/vk_overlay.cpp b/renderdoc/driver/vulkan/vk_overlay.cpp index 11f218003..1c2b681c2 100644 --- a/renderdoc/driver/vulkan/vk_overlay.cpp +++ b/renderdoc/driver/vulkan/vk_overlay.cpp @@ -267,6 +267,7 @@ struct VulkanQuadOverdrawCallback : public VulkanActionCallback // don't care } bool SplitSecondary() { return false; } + bool ForceLoadRPs() override { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) { diff --git a/renderdoc/driver/vulkan/vk_pixelhistory.cpp b/renderdoc/driver/vulkan/vk_pixelhistory.cpp index 9db8f09e8..59483ebf1 100644 --- a/renderdoc/driver/vulkan/vk_pixelhistory.cpp +++ b/renderdoc/driver/vulkan/vk_pixelhistory.cpp @@ -1315,6 +1315,7 @@ struct VulkanOcclusionCallback : public VulkanPixelHistoryCallback void PreEndCommandBuffer(VkCommandBuffer cmd) {} void AliasEvent(uint32_t primary, uint32_t alias) {} bool SplitSecondary() { return false; } + bool ForceLoadRPs() { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) { @@ -1701,6 +1702,7 @@ struct VulkanColorAndStencilCallback : public VulkanPixelHistoryCallback } bool SplitSecondary() { return true; } + bool ForceLoadRPs() { return true; } void PostRemisc(uint32_t eid, ActionFlags flags, VkCommandBuffer cmd) {} void PreEndCommandBuffer(VkCommandBuffer cmd) {} void AliasEvent(uint32_t primary, uint32_t alias) @@ -1947,6 +1949,7 @@ struct TestsFailedCallback : public VulkanPixelHistoryCallback bool PostMisc(uint32_t eid, ActionFlags flags, VkCommandBuffer cmd) { return false; } void PostRemisc(uint32_t eid, ActionFlags flags, VkCommandBuffer cmd) {} bool SplitSecondary() { return false; } + bool ForceLoadRPs() { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) { @@ -2967,6 +2970,7 @@ struct VulkanPixelHistoryPerFragmentCallback : VulkanPixelHistoryCallback void PreEndCommandBuffer(VkCommandBuffer cmd) {} void AliasEvent(uint32_t primary, uint32_t alias) {} bool SplitSecondary() { return false; } + bool ForceLoadRPs() { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) { @@ -3110,6 +3114,7 @@ struct VulkanPixelHistoryDiscardedFragmentsCallback : VulkanPixelHistoryCallback void PreEndCommandBuffer(VkCommandBuffer cmd) {} void AliasEvent(uint32_t primary, uint32_t alias) {} bool SplitSecondary() { return false; } + bool ForceLoadRPs() { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) { diff --git a/renderdoc/driver/vulkan/vk_postvs.cpp b/renderdoc/driver/vulkan/vk_postvs.cpp index d36c5ab40..598428160 100644 --- a/renderdoc/driver/vulkan/vk_postvs.cpp +++ b/renderdoc/driver/vulkan/vk_postvs.cpp @@ -3458,6 +3458,7 @@ struct VulkanInitPostVSCallback : public VulkanActionCallback m_pDriver->GetReplay()->AliasPostVSBuffers(primary, alias); } bool SplitSecondary() { return false; } + bool ForceLoadRPs() { return false; } void PreCmdExecute(uint32_t baseEid, uint32_t secondaryFirst, uint32_t secondaryLast, VkCommandBuffer cmd) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 941572167..d5f94f8f6 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1018,8 +1018,22 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman if(BeginInfo.pInheritanceInfo) { unwrappedInheritInfo = *BeginInfo.pInheritanceInfo; - unwrappedInheritInfo.framebuffer = Unwrap(unwrappedInheritInfo.framebuffer); - unwrappedInheritInfo.renderPass = Unwrap(unwrappedInheritInfo.renderPass); + + if(m_ActionCallback && m_ActionCallback->ForceLoadRPs()) + { + const VulkanCreationInfo::RenderPass &rpinfo = + m_CreationInfo.m_RenderPass[GetResID(unwrappedInheritInfo.renderPass)]; + const VulkanCreationInfo::Framebuffer &fbinfo = + m_CreationInfo.m_Framebuffer[GetResID(unwrappedInheritInfo.framebuffer)]; + + unwrappedInheritInfo.framebuffer = Unwrap(fbinfo.loadFBs[unwrappedInheritInfo.subpass]); + unwrappedInheritInfo.renderPass = Unwrap(rpinfo.loadRPs[unwrappedInheritInfo.subpass]); + } + else + { + unwrappedInheritInfo.framebuffer = Unwrap(unwrappedInheritInfo.framebuffer); + unwrappedInheritInfo.renderPass = Unwrap(unwrappedInheritInfo.renderPass); + } unwrappedBeginInfo.pInheritanceInfo = &unwrappedInheritInfo; @@ -1132,6 +1146,8 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman if(BeginInfo.pInheritanceInfo->renderPass != VK_NULL_HANDLE) m_BakedCmdBufferInfo[BakedCommandBuffer].state.SetRenderPass( GetResID(BeginInfo.pInheritanceInfo->renderPass)); + m_BakedCmdBufferInfo[BakedCommandBuffer].state.subpass = + BeginInfo.pInheritanceInfo->subpass; if(BeginInfo.pInheritanceInfo->framebuffer != VK_NULL_HANDLE) m_BakedCmdBufferInfo[BakedCommandBuffer].state.SetFramebuffer( this, GetResID(BeginInfo.pInheritanceInfo->framebuffer));