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.
This commit is contained in:
baldurk
2022-02-09 13:02:15 +00:00
parent b05830d668
commit 574d87e72a
6 changed files with 34 additions and 2 deletions
+6
View File
@@ -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,
+3
View File
@@ -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
{
+1
View File
@@ -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)
{
@@ -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)
{
+1
View File
@@ -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)
{
@@ -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));