Add usage entries for discards. Closes #1951

This commit is contained in:
baldurk
2020-07-12 10:52:10 +01:00
parent 0d026a43d6
commit bc4a803605
10 changed files with 143 additions and 21 deletions
+11 -3
View File
@@ -998,6 +998,7 @@ QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype)
case ResourceUsage::Indirect: return lit("Indirect argument");
case ResourceUsage::Clear: return lit("Clear");
case ResourceUsage::Discard: return lit("Discard");
case ResourceUsage::GenMips: return lit("Generate Mips");
case ResourceUsage::Resolve: return lit("Resolve");
@@ -1056,6 +1057,7 @@ QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype)
case ResourceUsage::Indirect: return lit("Indirect argument");
case ResourceUsage::Clear: return lit("Clear");
case ResourceUsage::Discard: return lit("Discard");
case ResourceUsage::GenMips: return lit("Generate Mips");
case ResourceUsage::Resolve: return vk ? lit("Resolve") : lit("Framebuffer blit");
@@ -1247,7 +1249,6 @@ void CombineUsageEvents(ICaptureContext &ctx, const rdcarray<EventUsage> &usage,
{
start = end = u.eventId;
us = u.usage;
continue;
}
const DrawcallDescription *draw = ctx.GetDrawcall(u.eventId);
@@ -1288,8 +1289,15 @@ void CombineUsageEvents(ICaptureContext &ctx, const rdcarray<EventUsage> &usage,
if(distinct)
{
callback(start, end, us);
start = end = u.eventId;
us = u.usage;
if(end == u.eventId && us == u.usage)
{
start = 0;
}
else
{
start = end = u.eventId;
us = u.usage;
}
}
end = u.eventId;
+1 -1
View File
@@ -817,7 +817,7 @@ void TimelineBar::paintEvent(QPaintEvent *e)
{
pipranges[WriteUsage].push(pos, triRadius);
}
else if(use.usage == ResourceUsage::Clear)
else if(use.usage == ResourceUsage::Clear || use.usage == ResourceUsage::Discard)
{
pipranges[ClearUsage].push(pos, triRadius);
}
+1
View File
@@ -799,6 +799,7 @@ rdcstr DoStringise(const ResourceUsage &el)
STRINGISE_ENUM_CLASS_NAMED(Indirect, "Indirect parameters");
STRINGISE_ENUM_CLASS_NAMED(Clear, "Clear");
STRINGISE_ENUM_CLASS_NAMED(Discard, "Discard");
STRINGISE_ENUM_CLASS_NAMED(GenMips, "Mip Generation");
STRINGISE_ENUM_CLASS_NAMED(Resolve, "Resolve - Source&Dest");
+6 -1
View File
@@ -2393,7 +2393,11 @@ Note that a resource may be used for more than one thing in one event, see :clas
.. data:: Clear
The resource is being cleared
The resource is being cleared.
.. data:: Discard
The resource contents are discarded explicitly or implicitly.
.. data:: GenMips
@@ -2470,6 +2474,7 @@ enum class ResourceUsage : uint32_t
Indirect,
Clear,
Discard,
GenMips,
Resolve,
@@ -1810,7 +1810,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardResource(SerialiserType &ser,
AddDrawcall(draw, true);
if(pResource)
m_ResourceUses[dstLiveID].push_back(EventUsage(m_CurEventID, ResourceUsage::Clear));
m_ResourceUses[dstLiveID].push_back(EventUsage(m_CurEventID, ResourceUsage::Discard));
}
}
@@ -1904,7 +1904,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardView(SerialiserType &ser, ID3D
{
WrappedID3D11RenderTargetView1 *view = (WrappedID3D11RenderTargetView1 *)pResourceView;
m_ResourceUses[view->GetResourceResID()].push_back(
EventUsage(m_CurEventID, ResourceUsage::Clear, view->GetResourceID()));
EventUsage(m_CurEventID, ResourceUsage::Discard, view->GetResourceID()));
draw.copyDestination =
m_pDevice->GetResourceManager()->GetOriginalID(view->GetResourceResID());
D3D11_RENDER_TARGET_VIEW_DESC viewDesc;
@@ -1916,7 +1916,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardView(SerialiserType &ser, ID3D
{
WrappedID3D11DepthStencilView *view = (WrappedID3D11DepthStencilView *)pResourceView;
m_ResourceUses[view->GetResourceResID()].push_back(
EventUsage(m_CurEventID, ResourceUsage::Clear, view->GetResourceID()));
EventUsage(m_CurEventID, ResourceUsage::Discard, view->GetResourceID()));
draw.copyDestination =
m_pDevice->GetResourceManager()->GetOriginalID(view->GetResourceResID());
D3D11_DEPTH_STENCIL_VIEW_DESC viewDesc;
@@ -1928,7 +1928,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardView(SerialiserType &ser, ID3D
{
WrappedID3D11ShaderResourceView1 *view = (WrappedID3D11ShaderResourceView1 *)pResourceView;
m_ResourceUses[view->GetResourceResID()].push_back(
EventUsage(m_CurEventID, ResourceUsage::Clear, view->GetResourceID()));
EventUsage(m_CurEventID, ResourceUsage::Discard, view->GetResourceID()));
draw.copyDestination =
m_pDevice->GetResourceManager()->GetOriginalID(view->GetResourceResID());
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
@@ -1941,7 +1941,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardView(SerialiserType &ser, ID3D
WrappedID3D11UnorderedAccessView1 *view =
(WrappedID3D11UnorderedAccessView1 *)pResourceView;
m_ResourceUses[view->GetResourceResID()].push_back(
EventUsage(m_CurEventID, ResourceUsage::Clear, view->GetResourceID()));
EventUsage(m_CurEventID, ResourceUsage::Discard, view->GetResourceID()));
draw.copyDestination =
m_pDevice->GetResourceManager()->GetOriginalID(view->GetResourceResID());
D3D11_UNORDERED_ACCESS_VIEW_DESC viewDesc;
@@ -2087,7 +2087,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardView1(SerialiserType &ser,
{
WrappedID3D11RenderTargetView1 *view = (WrappedID3D11RenderTargetView1 *)pResourceView;
m_ResourceUses[view->GetResourceResID()].push_back(
EventUsage(m_CurEventID, ResourceUsage::Clear, view->GetResourceID()));
EventUsage(m_CurEventID, ResourceUsage::Discard, view->GetResourceID()));
draw.copyDestination =
m_pDevice->GetResourceManager()->GetOriginalID(view->GetResourceResID());
D3D11_RENDER_TARGET_VIEW_DESC viewDesc;
@@ -2099,7 +2099,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardView1(SerialiserType &ser,
{
WrappedID3D11DepthStencilView *view = (WrappedID3D11DepthStencilView *)pResourceView;
m_ResourceUses[view->GetResourceResID()].push_back(
EventUsage(m_CurEventID, ResourceUsage::Clear, view->GetResourceID()));
EventUsage(m_CurEventID, ResourceUsage::Discard, view->GetResourceID()));
draw.copyDestination =
m_pDevice->GetResourceManager()->GetOriginalID(view->GetResourceResID());
D3D11_DEPTH_STENCIL_VIEW_DESC viewDesc;
@@ -2111,7 +2111,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardView1(SerialiserType &ser,
{
WrappedID3D11ShaderResourceView1 *view = (WrappedID3D11ShaderResourceView1 *)pResourceView;
m_ResourceUses[view->GetResourceResID()].push_back(
EventUsage(m_CurEventID, ResourceUsage::Clear, view->GetResourceID()));
EventUsage(m_CurEventID, ResourceUsage::Discard, view->GetResourceID()));
draw.copyDestination =
m_pDevice->GetResourceManager()->GetOriginalID(view->GetResourceResID());
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
@@ -2124,7 +2124,7 @@ bool WrappedID3D11DeviceContext::Serialise_DiscardView1(SerialiserType &ser,
WrappedID3D11UnorderedAccessView1 *view =
(WrappedID3D11UnorderedAccessView1 *)pResourceView;
m_ResourceUses[view->GetResourceResID()].push_back(
EventUsage(m_CurEventID, ResourceUsage::Clear, view->GetResourceID()));
EventUsage(m_CurEventID, ResourceUsage::Discard, view->GetResourceID()));
draw.copyDestination =
m_pDevice->GetResourceManager()->GetOriginalID(view->GetResourceResID());
D3D11_UNORDERED_ACCESS_VIEW_DESC viewDesc;
@@ -4878,6 +4878,23 @@ bool WrappedID3D12GraphicsCommandList::Serialise_DiscardResource(SerialiserType
{
Unwrap(pCommandList)->DiscardResource(Unwrap(pResource), pRegion);
GetCrackedList()->DiscardResource(Unwrap(pResource), pRegion);
{
m_Cmd->AddEvent();
DrawcallDescription draw;
draw.flags |= DrawFlags::Clear;
draw.copyDestination = GetResourceManager()->GetOriginalID(GetResID(pResource));
draw.copyDestinationSubresource = Subresource();
draw.name = StringFormat::Fmt("DiscardResource(%s)", ToStr(draw.copyDestination).c_str());
m_Cmd->AddDrawcall(draw, true);
D3D12DrawcallTreeNode &drawNode = m_Cmd->GetDrawcallStack().back()->children.back();
drawNode.resourceUsage.push_back(make_rdcpair(
GetResID(pResource), EventUsage(drawNode.draw.eventId, ResourceUsage::Discard)));
}
}
}
@@ -1766,6 +1766,43 @@ bool WrappedOpenGL::Serialise_glInvalidateNamedFramebufferData(SerialiserType &s
}
GL.glInvalidateNamedFramebufferData(framebuffer.name, numAttachments, attachments);
if(IsLoading(m_State))
{
AddEvent();
ResourceId fbid = GetResourceManager()->GetID(framebuffer);
DrawcallDescription draw;
draw.name = StringFormat::Fmt("%s(%s)", ToStr(gl_CurChunk).c_str(),
ToStr(GetResourceManager()->GetOriginalID(fbid)).c_str());
draw.flags |= DrawFlags::Clear;
for(GLsizei i = 0; i < numAttachments; i++)
{
GLuint obj = 0;
GLenum objtype = eGL_TEXTURE;
GL.glGetNamedFramebufferAttachmentParameterivEXT(
framebuffer.name, att[i], eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint *)&obj);
GL.glGetNamedFramebufferAttachmentParameterivEXT(
framebuffer.name, att[i], eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint *)&objtype);
ResourceId id;
if(objtype == eGL_TEXTURE)
id = GetResourceManager()->GetID(TextureRes(GetCtx(), obj));
else
id = GetResourceManager()->GetID(RenderbufferRes(GetCtx(), obj));
if(draw.copyDestination == ResourceId())
draw.copyDestination = GetResourceManager()->GetOriginalID(id);
m_ResourceUses[id].push_back(EventUsage(m_CurEventID, ResourceUsage::Discard));
}
AddDrawcall(draw, true);
}
}
return true;
@@ -67,7 +67,27 @@ void WrappedVulkan::AddImplicitResolveResourceUsage(uint32_t subpass)
ResourceId image = m_CreationInfo.m_ImageView[fbattachments[attIdx]].image;
m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair(
image,
EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, ResourceUsage::Resolve)));
EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, ResourceUsage::ResolveDst)));
attIdx = rpinfo.subpasses[subpass].colorAttachments[i];
if(attIdx == VK_ATTACHMENT_UNUSED)
continue;
image = m_CreationInfo.m_ImageView[fbattachments[attIdx]].image;
m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair(
image,
EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, ResourceUsage::ResolveSrc)));
}
// also add any discards
for(size_t i = 0; i < rpinfo.attachments.size(); i++)
{
if(rpinfo.attachments[i].storeOp == VK_ATTACHMENT_STORE_OP_DONT_CARE)
{
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::Discard)));
}
}
}
@@ -1434,12 +1454,15 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(SerialiserType &ser, VkComman
m_BakedCmdBufferInfo[m_LastCmdBufferID].state.GetFramebufferAttachments();
for(size_t i = 0; i < rpinfo.attachments.size(); i++)
{
if(rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
if(rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR ||
rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
{
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)));
image, EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID,
rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR
? ResourceUsage::Clear
: ResourceUsage::Discard)));
}
}
@@ -1925,12 +1948,15 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass2(SerialiserType &ser,
m_BakedCmdBufferInfo[m_LastCmdBufferID].state.GetFramebufferAttachments();
for(size_t i = 0; i < rpinfo.attachments.size(); i++)
{
if(rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
if(rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR ||
rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
{
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)));
image, EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID,
rpinfo.attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR
? ResourceUsage::Clear
: ResourceUsage::Discard)));
}
}
@@ -3177,6 +3203,19 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier(
else
commandBuffer = VK_NULL_HANDLE;
}
else
{
for(uint32_t i = 0; i < imageMemoryBarrierCount; i++)
{
const VkImageMemoryBarrier &b = pImageMemoryBarriers[i];
if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED)
{
m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair(
GetResID(b.image), EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID,
ResourceUsage::Discard)));
}
}
}
if(commandBuffer != VK_NULL_HANDLE)
{
@@ -838,6 +838,17 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents(
// since we cache and replay this command buffer we can't clean up this event just when we're
// done replaying this section. We have to keep this event until shutdown
m_PersistentEvents.push_back(ev);
for(uint32_t i = 0; i < imageMemoryBarrierCount; i++)
{
const VkImageMemoryBarrier &b = pImageMemoryBarriers[i];
if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED)
{
m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair(
GetResID(b.image), EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID,
ResourceUsage::Discard)));
}
}
}
ResourceId cmd = GetResID(commandBuffer);
+4
View File
@@ -1491,6 +1491,10 @@ rdcarray<PixelModification> ReplayController::PixelHistory(ResourceId target, ui
// writing but CPU-only, don't include
continue;
case ResourceUsage::Discard:
// writing but not something pixel history should handle
continue;
case ResourceUsage::Unused:
case ResourceUsage::StreamOut:
case ResourceUsage::VS_RWResource: