mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-22 14:36:35 +00:00
Add usage entries for discards. Closes #1951
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user