From 8245b99b56b96ba3437aa3faa7ce2744f5c78418 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 19 Oct 2021 18:12:19 +0100 Subject: [PATCH] Avoid some redundant checks in GetLiveResource * Historically we always expected a live resource, but with descriptors that can be stale we can have a lot of queries where it's fine to just get NULL back if the resource doesn't exist. --- renderdoc/core/resource_manager.h | 25 +++++++++++++++++------- renderdoc/driver/d3d12/d3d12_manager.cpp | 6 ++---- renderdoc/driver/d3d12/d3d12_manager.h | 4 ++-- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index f153e7156..a25cc27d8 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -638,7 +638,7 @@ public: // Live resources to replace serialised IDs void AddLiveResource(ResourceId origid, WrappedResourceType livePtr); bool HasLiveResource(ResourceId origid); - WrappedResourceType GetLiveResource(ResourceId origid); + WrappedResourceType GetLiveResource(ResourceId origid, bool optional = false); void EraseLiveResource(ResourceId origid); // when asked for a given id, return the resource for a replacement id @@ -1816,20 +1816,31 @@ bool ResourceManager::HasLiveResource(ResourceId origid) template typename Configuration::WrappedResourceType ResourceManager::GetLiveResource( - ResourceId origid) + ResourceId origid, bool optional) { SCOPED_LOCK_OPTIONAL(m_Lock, m_Capturing); if(origid == ResourceId()) return (WrappedResourceType)RecordType::NullResource; - RDCASSERT(HasLiveResource(origid), origid); +#if DISABLED(RDOC_RELEASE) + if(!optional) + { + RDCASSERT(HasLiveResource(origid), origid); + } +#endif - if(m_Replacements.find(origid) != m_Replacements.end()) - return GetLiveResource(m_Replacements[origid]); + { + auto it = m_Replacements.find(origid); + if(it != m_Replacements.end()) + return GetLiveResource(it->second); + } - if(m_LiveResourceMap.find(origid) != m_LiveResourceMap.end()) - return m_LiveResourceMap[origid]; + { + auto it = m_LiveResourceMap.find(origid); + if(it != m_LiveResourceMap.end()) + return it->second; + } return (WrappedResourceType)RecordType::NullResource; } diff --git a/renderdoc/driver/d3d12/d3d12_manager.cpp b/renderdoc/driver/d3d12/d3d12_manager.cpp index baa35cb0e..04f71cffc 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.cpp +++ b/renderdoc/driver/d3d12/d3d12_manager.cpp @@ -629,10 +629,8 @@ D3D12Descriptor *DescriptorFromPortableHandle(D3D12ResourceManager *manager, Por if(handle.heap == ResourceId()) return NULL; - if(!manager->HasLiveResource(handle.heap)) - return NULL; - - WrappedID3D12DescriptorHeap *heap = manager->GetLiveAs(handle.heap); + WrappedID3D12DescriptorHeap *heap = + manager->GetLiveAs(handle.heap, true); if(heap) return heap->GetDescriptors() + handle.index; diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index aca09f375..9d32b4c97 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -693,9 +693,9 @@ public: { } template - T *GetLiveAs(ResourceId id) + T *GetLiveAs(ResourceId id, bool optional = false) { - return (T *)GetLiveResource(id); + return (T *)GetLiveResource(id, optional); } template