diff --git a/renderdoc/core/resource_manager.cpp b/renderdoc/core/resource_manager.cpp index 15603b17c..96444769a 100644 --- a/renderdoc/core/resource_manager.cpp +++ b/renderdoc/core/resource_manager.cpp @@ -95,7 +95,7 @@ void ResourceRecord::Delete(ResourceRecordHandler *mgr) if(ResID != ResourceId()) mgr->RemoveResourceRecord(ResID); - delete this; + mgr->DestroyResourceRecord(this); } } diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index 622e4f0c4..efae121a3 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -61,6 +61,8 @@ namespace ResourceIDGen void SetReplayResourceIDs(); }; +struct ResourceRecord; + class ResourceRecordHandler { public: @@ -68,6 +70,7 @@ class ResourceRecordHandler virtual void MarkPendingDirty(ResourceId id) = 0; virtual void RemoveResourceRecord(ResourceId id) = 0; virtual void MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) = 0; + virtual void DestroyResourceRecord(ResourceRecord *record) = 0; }; // This is a generic resource record, that APIs can inherit from and use. @@ -324,6 +327,7 @@ class ResourceManager : public ResourceRecordHandler bool HasResourceRecord(ResourceId id); RecordType *AddResourceRecord(ResourceId id); inline void RemoveResourceRecord(ResourceId id); + void DestroyResourceRecord(ResourceRecord *record); // while capturing or replaying, resources and their live IDs void AddCurrentResource(ResourceId id, WrappedResourceType res); @@ -1096,6 +1100,12 @@ void ResourceManager::RemoveR m_ResourceRecords.erase(id); } +template +void ResourceManager::DestroyResourceRecord(ResourceRecord *record) +{ + delete (RecordType *)record; +} + template bool ResourceManager::AddWrapper(WrappedResourceType wrap, RealResourceType real) {