From bc4a80360548cdb74e178f49e65e16c298306647 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 7 Jul 2020 17:00:23 +0100 Subject: [PATCH] Add usage entries for discards. Closes #1951 --- qrenderdoc/Code/QRDUtils.cpp | 14 +++-- qrenderdoc/Windows/TimelineBar.cpp | 2 +- renderdoc/api/replay/renderdoc_tostr.inl | 1 + renderdoc/api/replay/replay_enums.h | 7 ++- .../driver/d3d11/d3d11_context1_wrap.cpp | 18 +++---- .../driver/d3d12/d3d12_command_list_wrap.cpp | 17 ++++++ .../gl/wrappers/gl_framebuffer_funcs.cpp | 37 +++++++++++++ .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 53 ++++++++++++++++--- .../driver/vulkan/wrappers/vk_sync_funcs.cpp | 11 ++++ renderdoc/replay/replay_controller.cpp | 4 ++ 10 files changed, 143 insertions(+), 21 deletions(-) diff --git a/qrenderdoc/Code/QRDUtils.cpp b/qrenderdoc/Code/QRDUtils.cpp index ce15aa201..724109b22 100644 --- a/qrenderdoc/Code/QRDUtils.cpp +++ b/qrenderdoc/Code/QRDUtils.cpp @@ -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 &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 &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; diff --git a/qrenderdoc/Windows/TimelineBar.cpp b/qrenderdoc/Windows/TimelineBar.cpp index 18ea8065c..2dbecfed7 100644 --- a/qrenderdoc/Windows/TimelineBar.cpp +++ b/qrenderdoc/Windows/TimelineBar.cpp @@ -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); } diff --git a/renderdoc/api/replay/renderdoc_tostr.inl b/renderdoc/api/replay/renderdoc_tostr.inl index de12ba0fb..d829b502a 100644 --- a/renderdoc/api/replay/renderdoc_tostr.inl +++ b/renderdoc/api/replay/renderdoc_tostr.inl @@ -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"); diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 2e9695a0c..0b002d846 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -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, diff --git a/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp index e2cef91ce..1619a6b35 100644 --- a/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp @@ -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; diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index af1cd8d35..9ac14fba9 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -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))); + } } } diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 22509a577..c2574cf35 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -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; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 1a673462f..e11c09121 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -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) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp index fe35aa570..0287378fe 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp @@ -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); diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index 85e74893c..8773f0077 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -1491,6 +1491,10 @@ rdcarray 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: