diff --git a/qrenderdoc/Windows/ResourceInspector.cpp b/qrenderdoc/Windows/ResourceInspector.cpp index 20aacdccb..1dc8023bb 100644 --- a/qrenderdoc/Windows/ResourceInspector.cpp +++ b/qrenderdoc/Windows/ResourceInspector.cpp @@ -285,6 +285,7 @@ void ResourceInspector::Inspect(ResourceId id) ui->initChunks->setUpdatesEnabled(false); ui->resourceUsage->clear(); + ui->resourceUsage->setEnabled(true); const SDFile &file = m_Ctx.GetStructuredFile(); const ResourceDescription *desc = m_Ctx.GetResource(id); @@ -303,21 +304,37 @@ void ResourceInspector::Inspect(ResourceId id) ui->resourceUsage->beginUpdate(); - CombineUsageEvents(m_Ctx, usage, [this](uint32_t startEID, uint32_t endEID, ResourceUsage use) { - QString text; + if(usage.size() == 1 && usage[0].eventId == 0 && usage[0].usage == ResourceUsage::Unused) + { + ui->resourceUsage->setEnabled(false); - if(startEID == endEID) - text = QFormatStr("EID %1").arg(startEID); - else - text = QFormatStr("EID %1-%2").arg(startEID).arg(endEID); + ui->resourceUsage->addTopLevelItem(new RDTreeWidgetItem( + {QString(), tr("Resource usage not tracked for this type of resource")})); + } + else if(usage.empty()) + { + ui->resourceUsage->addTopLevelItem( + new RDTreeWidgetItem({QString(), tr("No static usage observed for this resource")})); + } + else + { + CombineUsageEvents( + m_Ctx, usage, [this](uint32_t startEID, uint32_t endEID, ResourceUsage use) { + QString text; - RDTreeWidgetItem *item = - new RDTreeWidgetItem({text, ToQStr(use, m_Ctx.APIProps().pipelineType)}); - item->setData(0, ResourceIdRole, QVariant(endEID)); - item->setData(1, ResourceIdRole, QVariant(endEID)); + if(startEID == endEID) + text = QFormatStr("EID %1").arg(startEID); + else + text = QFormatStr("EID %1-%2").arg(startEID).arg(endEID); - ui->resourceUsage->addTopLevelItem(item); - }); + RDTreeWidgetItem *item = + new RDTreeWidgetItem({text, ToQStr(use, m_Ctx.APIProps().pipelineType)}); + item->setData(0, ResourceIdRole, QVariant(endEID)); + item->setData(1, ResourceIdRole, QVariant(endEID)); + + ui->resourceUsage->addTopLevelItem(item); + }); + } ui->resourceUsage->endUpdate(); }); @@ -474,6 +491,7 @@ void ResourceInspector::OnCaptureClosed() ui->initChunks->clearInternalExpansions(); ui->relatedResources->clear(); ui->resourceUsage->clear(); + ui->resourceUsage->setEnabled(true); } void ResourceInspector::OnEventChanged(uint32_t eventId) @@ -560,7 +578,8 @@ void ResourceInspector::on_resourceListFilter_textChanged(const QString &text) void ResourceInspector::resource_doubleClicked(const QModelIndex &index) { ResourceId id = index.model()->data(index, ResourceIdRole).value(); - Inspect(id); + if(id != ResourceId()) + Inspect(id); HighlightUsage(); } @@ -631,7 +650,8 @@ void ResourceInspector::on_viewContents_clicked() void ResourceInspector::on_resourceUsage_doubleClicked(const QModelIndex &index) { uint32_t eid = index.model()->data(index, ResourceIdRole).value(); - m_Ctx.SetEventID({}, eid, eid); + if(eid != 0) + m_Ctx.SetEventID({}, eid, eid); } void ResourceInspector::enterEvent(QEvent *event) diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 6f8516b72..62263c45e 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -371,6 +371,14 @@ void D3D11Replay::FreeCustomShader(ResourceId id) rdcarray D3D11Replay::GetUsage(ResourceId id) { + if(WrappedID3D11Buffer::m_BufferList.find(id) == WrappedID3D11Buffer::m_BufferList.end() && + WrappedID3D11Texture1D::m_TextureList.find(id) == WrappedID3D11Texture1D::m_TextureList.end() && + WrappedID3D11Texture2D1::m_TextureList.find(id) == WrappedID3D11Texture2D1::m_TextureList.end() && + WrappedID3D11Texture3D1::m_TextureList.find(id) == WrappedID3D11Texture3D1::m_TextureList.end()) + { + return {EventUsage(0, ResourceUsage::Unused)}; + } + return m_pDevice->GetImmediateContext()->GetUsage(id); } diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 80ad8eb2b..a1918f6dc 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -734,6 +734,11 @@ ResourceId D3D12Replay::GetLiveID(ResourceId id) rdcarray D3D12Replay::GetUsage(ResourceId id) { + if(m_pDevice->GetResourceList().find(id) == m_pDevice->GetResourceList().end()) + { + return {EventUsage(0, ResourceUsage::Unused)}; + } + return m_pDevice->GetQueue()->GetUsage(id); } diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 070bed061..eb01b1105 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -4281,6 +4281,14 @@ void GLReplay::SetProxyBufferData(ResourceId bufid, byte *data, size_t dataSize) rdcarray GLReplay::GetUsage(ResourceId id) { + if((m_pDriver->m_Textures.find(id) == m_pDriver->m_Textures.end() || + m_pDriver->m_Textures[id].resource.Namespace == eResUnknown) && + (m_pDriver->m_Buffers.find(id) == m_pDriver->m_Buffers.end() || + m_pDriver->m_Buffers[id].resource.Namespace == eResUnknown)) + { + return {EventUsage(0, ResourceUsage::Unused)}; + } + return m_pDriver->GetUsage(id); } diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 1b919d48c..add445d73 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -4002,6 +4002,12 @@ bool VulkanReplay::GetHistogram(ResourceId texid, const Subresource &sub, CompTy rdcarray VulkanReplay::GetUsage(ResourceId id) { + if(m_pDriver->m_CreationInfo.m_Image.find(id) == m_pDriver->m_CreationInfo.m_Image.end() && + m_pDriver->m_CreationInfo.m_Buffer.find(id) == m_pDriver->m_CreationInfo.m_Buffer.end()) + { + return {EventUsage(0, ResourceUsage::Unused)}; + } + return m_pDriver->GetUsage(id); } diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index 648e5800a..f8e28b208 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -529,7 +529,7 @@ rdcarray ReplayController::GetUsage(ResourceId id) id = m_pDevice->GetLiveID(id); if(id == ResourceId()) - return rdcarray(); + return {EventUsage(0, ResourceUsage::Unused)}; return m_pDevice->GetUsage(id); }