Add drawcall callbacks to end and next renderpass cmds

For Vulkan pixel history vkCmdEndRenderPass and vkCmdNextSubpass
can represent a modification, since it might be doing an implicit
image resolve. Pixel history is using drawcall callbacks to figure
out values pre- post- events, and vkCmdEndRenderPass and
vkCmdNextSubpass might be such events.

Also adds clear image usage to vkCmdBeginRenderPass(2) for images that
have VK_ATTACHMENT_LOAD_OP_CLEAR.
This commit is contained in:
Aliya Pazylbekova authored and Baldur Karlsson committed 2020-01-16 23:04:53 +00:00
1 parent 1403162a39
commit 791d1089b0
2 files changed
+115 -3

No files matched your search

+30 -3
View File
@@ -399,13 +399,22 @@ struct VulkanAMDDrawCallback : public VulkanDrawcallCallback
void PreDispatch(uint32_t eid, VkCommandBuffer cmd) override { PreDraw(eid, cmd); }
bool PostDispatch(uint32_t eid, VkCommandBuffer cmd) override { return PostDraw(eid, cmd); }
void PostRedispatch(uint32_t eid, VkCommandBuffer cmd) override { PostRedraw(eid, cmd); }
void PreMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override { PreDraw(eid, cmd); }
void PreMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return;
PreDraw(eid, cmd);
}
bool PostMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return false;
return PostDraw(eid, cmd);
}
void PostRemisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return;
PostRedraw(eid, cmd);
}
@@ -547,13 +556,22 @@ struct VulkanKHRCallback : public VulkanDrawcallCallback
void PreDispatch(uint32_t eid, VkCommandBuffer cmd) override { PreDraw(eid, cmd); }
bool PostDispatch(uint32_t eid, VkCommandBuffer cmd) override { return PostDraw(eid, cmd); }
void PostRedispatch(uint32_t eid, VkCommandBuffer cmd) override { PostRedraw(eid, cmd); }
void PreMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override { PreDraw(eid, cmd); }
void PreMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return;
PreDraw(eid, cmd);
}
bool PostMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return false;
return PostDraw(eid, cmd);
}
void PostRemisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return;
PostRedraw(eid, cmd);
}
void AliasEvent(uint32_t primary, uint32_t alias) override
@@ -740,13 +758,22 @@ struct VulkanGPUTimerCallback : public VulkanDrawcallCallback
void PreDispatch(uint32_t eid, VkCommandBuffer cmd) override { PreDraw(eid, cmd); }
bool PostDispatch(uint32_t eid, VkCommandBuffer cmd) override { return PostDraw(eid, cmd); }
void PostRedispatch(uint32_t eid, VkCommandBuffer cmd) override { PostRedraw(eid, cmd); }
void PreMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override { PreDraw(eid, cmd); }
void PreMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return;
PreDraw(eid, cmd);
}
bool PostMisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return false;
return PostDraw(eid, cmd);
}
void PostRemisc(uint32_t eid, DrawFlags flags, VkCommandBuffer cmd) override
{
if(flags & DrawFlags::PassBoundary)
return;
PostRedraw(eid, cmd);
}
void AliasEvent(uint32_t primary, uint32_t alias) override
@@ -1303,8 +1303,17 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(SerialiserType &ser, VkComman
DoPipelineBarrier(commandBuffer, imgBarriers.size(), imgBarriers.data());
}
DrawFlags drawFlags = DrawFlags::PassBoundary | DrawFlags::BeginPass;
uint32_t eventId = HandlePreCallback(commandBuffer, drawFlags);
ObjDisp(commandBuffer)->CmdBeginRenderPass(Unwrap(commandBuffer), &unwrappedInfo, contents);
if(eventId && m_DrawcallCallback->PostMisc(eventId, drawFlags, commandBuffer))
{
// Do not call vkCmdBeginRenderPass again.
m_DrawcallCallback->PostRemisc(eventId, drawFlags, commandBuffer);
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts,
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -1349,6 +1358,22 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(SerialiserType &ser, VkComman
}
}
// Record image usage for images cleared in the beginning of the render pass.
const VulkanCreationInfo::RenderPass &rpinfo =
m_CreationInfo.m_RenderPass[GetResID(RenderPassBegin.renderPass)];
const rdcarray<ResourceId> &fbattachments =
m_BakedCmdBufferInfo[m_LastCmdBufferID].state.fbattachments;
for(size_t i = 0; i < rpinfo.attachments.size(); i++)
{
if(rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
{
ResourceId image = m_CreationInfo.m_ImageView[fbattachments[i]].image;
m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair(
image,
EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, ResourceUsage::Clear)));
}
}
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
@@ -1478,8 +1503,17 @@ bool WrappedVulkan::Serialise_vkCmdNextSubpass(SerialiserType &ser, VkCommandBuf
if(ShouldUpdateRenderState(m_LastCmdBufferID, true))
m_RenderState.subpass++;
DrawFlags drawFlags = DrawFlags::PassBoundary | DrawFlags::BeginPass | DrawFlags::EndPass;
uint32_t eventId = HandlePreCallback(commandBuffer, drawFlags);
ObjDisp(commandBuffer)->CmdNextSubpass(Unwrap(commandBuffer), contents);
if(eventId && m_DrawcallCallback->PostMisc(eventId, drawFlags, commandBuffer))
{
// Do not call vkCmdNextSubpass again.
m_DrawcallCallback->PostRemisc(eventId, drawFlags, commandBuffer);
}
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
@@ -1565,8 +1599,17 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass(SerialiserType &ser, VkCommandB
m_Partial[Primary].renderPassActive = false;
}
DrawFlags drawFlags = DrawFlags::PassBoundary | DrawFlags::EndPass;
uint32_t eventId = HandlePreCallback(commandBuffer, drawFlags);
ObjDisp(commandBuffer)->CmdEndRenderPass(Unwrap(commandBuffer));
if(eventId && m_DrawcallCallback->PostMisc(eventId, drawFlags, commandBuffer))
{
// Do not call vkCmdEndRenderPass again.
m_DrawcallCallback->PostRemisc(eventId, drawFlags, commandBuffer);
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts,
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -1737,9 +1780,18 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass2(SerialiserType &ser,
DoPipelineBarrier(commandBuffer, imgBarriers.size(), imgBarriers.data());
}
DrawFlags drawFlags = DrawFlags::PassBoundary | DrawFlags::BeginPass;
uint32_t eventId = HandlePreCallback(commandBuffer, drawFlags);
ObjDisp(commandBuffer)
->CmdBeginRenderPass2(Unwrap(commandBuffer), &unwrappedInfo, &unwrappedBeginInfo);
if(eventId && m_DrawcallCallback->PostMisc(eventId, drawFlags, commandBuffer))
{
// Do not call vkCmdBeginRenderPass2 again.
m_DrawcallCallback->PostRemisc(eventId, drawFlags, commandBuffer);
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts,
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -1785,6 +1837,22 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass2(SerialiserType &ser,
}
}
// Record image usage for images cleared in the beginning of the render pass.
const VulkanCreationInfo::RenderPass &rpinfo =
m_CreationInfo.m_RenderPass[GetResID(RenderPassBegin.renderPass)];
const rdcarray<ResourceId> &fbattachments =
m_BakedCmdBufferInfo[m_LastCmdBufferID].state.fbattachments;
for(size_t i = 0; i < rpinfo.attachments.size(); i++)
{
if(rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
{
ResourceId image = m_CreationInfo.m_ImageView[fbattachments[i]].image;
m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair(
image,
EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, ResourceUsage::Clear)));
}
}
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
@@ -1930,9 +1998,18 @@ bool WrappedVulkan::Serialise_vkCmdNextSubpass2(SerialiserType &ser, VkCommandBu
if(ShouldUpdateRenderState(m_LastCmdBufferID, true))
m_RenderState.subpass++;
DrawFlags drawFlags = DrawFlags::PassBoundary | DrawFlags::BeginPass | DrawFlags::EndPass;
uint32_t eventId = HandlePreCallback(commandBuffer, drawFlags);
ObjDisp(commandBuffer)
->CmdNextSubpass2(Unwrap(commandBuffer), &unwrappedBeginInfo, &unwrappedEndInfo);
if(eventId && m_DrawcallCallback->PostMisc(eventId, drawFlags, commandBuffer))
{
// Do not call vkCmdNextSubpass2 again.
m_DrawcallCallback->PostRemisc(eventId, drawFlags, commandBuffer);
}
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
@@ -2039,8 +2116,16 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass2(SerialiserType &ser, VkCommand
m_Partial[Primary].renderPassActive = false;
}
DrawFlags drawFlags = DrawFlags::PassBoundary | DrawFlags::EndPass;
uint32_t eventId = HandlePreCallback(commandBuffer, drawFlags);
ObjDisp(commandBuffer)->CmdEndRenderPass2(Unwrap(commandBuffer), &unwrappedEndInfo);
if(eventId && m_DrawcallCallback->PostMisc(eventId, drawFlags, commandBuffer))
{
// Do not call vkCmdEndRenderPass2 again.
m_DrawcallCallback->PostRemisc(eventId, drawFlags, commandBuffer);
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts,
(uint32_t)imgBarriers.size(), imgBarriers.data());