mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-04 09:00:44 +00:00
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:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user