From 736d991d6a239a4c5266779f8bc9aa3c09ca1cf2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 25 Jan 2018 11:30:25 +0000 Subject: [PATCH] Pass configuration parameters to ResourceManager in struct * Otherwise adding new parameters becomes impractical --- renderdoc/core/resource_manager.cpp | 43 ++++- renderdoc/core/resource_manager.h | 246 ++++++++++--------------- renderdoc/driver/d3d11/d3d11_manager.h | 10 +- renderdoc/driver/d3d12/d3d12_manager.h | 10 +- renderdoc/driver/d3d8/d3d8_manager.h | 9 +- renderdoc/driver/gl/gl_manager.h | 9 +- renderdoc/driver/vulkan/vk_manager.h | 10 +- 7 files changed, 184 insertions(+), 153 deletions(-) diff --git a/renderdoc/core/resource_manager.cpp b/renderdoc/core/resource_manager.cpp index ec73cc716..3df752acf 100644 --- a/renderdoc/core/resource_manager.cpp +++ b/renderdoc/core/resource_manager.cpp @@ -51,11 +51,52 @@ void SetReplayResourceIDs() INSTANTIATE_SERIALISE_TYPE(ResourceManagerInternal::WrittenRecord); +bool MarkReferenced(std::map &refs, ResourceId id, FrameRefType refType) +{ + if(refs.find(id) == refs.end()) + { + if(refType == eFrameRef_Read) + refs[id] = eFrameRef_ReadOnly; + else if(refType == eFrameRef_Write) + refs[id] = eFrameRef_ReadAndWrite; + else // unknown or existing state + refs[id] = refType; + + return true; + } + else + { + if(refType == eFrameRef_Unknown) + { + // nothing + } + else if(refType == eFrameRef_ReadBeforeWrite) + { + // special case, explicitly set to ReadBeforeWrite for when + // we know that this use will likely be a partial-write + refs[id] = eFrameRef_ReadBeforeWrite; + } + else if(refs[id] == eFrameRef_Unknown) + { + if(refType == eFrameRef_Read || refType == eFrameRef_ReadOnly) + refs[id] = eFrameRef_ReadOnly; + else + refs[id] = eFrameRef_ReadAndWrite; + } + else if(refs[id] == eFrameRef_ReadOnly && refType == eFrameRef_Write) + { + refs[id] = eFrameRef_ReadBeforeWrite; + } + } + + return false; +} + bool ResourceRecord::MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) { if(id == ResourceId()) return false; - return ResourceManager::MarkReferenced(m_FrameRefs, id, refType); + return MarkReferenced(m_FrameRefs, id, refType); } void ResourceRecord::AddResourceReferences(ResourceRecordHandler *mgr) diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index 728123245..571d673ea 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -53,6 +53,9 @@ enum FrameRefType eFrameRef_ReadBeforeWrite, }; +// handle marking a resource referenced for read or write and storing RAW access etc. +bool MarkReferenced(std::map &refs, ResourceId id, FrameRefType refType); + // verbose prints with IDs of each dirty resource and whether it was prepared, // and whether it was serialised. #define VERBOSE_DIRTY_RESOURCES OPTION_OFF @@ -292,10 +295,14 @@ protected: // In the replay application it will also track which 'live' resources are representing which // 'original' // resources from the application when it was captured. -template +template class ResourceManager : public ResourceRecordHandler { public: + typedef typename Configuration::WrappedResourceType WrappedResourceType; + typedef typename Configuration::RealResourceType RealResourceType; + typedef typename Configuration::RecordType RecordType; + ResourceManager(); virtual ~ResourceManager(); @@ -378,10 +385,6 @@ public: // cleared on frame init). void Serialise_InitialContentsNeeded(WriteSerialiser &ser); - // handle marking a resource referenced for read or write and storing RAW access etc. - static bool MarkReferenced(map &refs, ResourceId id, - FrameRefType refType); - // mark resource referenced somewhere in the main frame-affecting calls. // That means this resource should be included in the final serialise out inline void MarkResourceFrameReferenced(ResourceId id, FrameRefType refType); @@ -487,19 +490,15 @@ protected: map m_Replacements; }; -// this is just a couple of convenience macros to reduce the amount of visual noise on the -// implementations -#define ResourceManagerType ResourceManager - -template -ResourceManagerType::ResourceManager() +template +ResourceManager::ResourceManager() { if(RenderDoc::Inst().GetCrashHandler()) RenderDoc::Inst().GetCrashHandler()->RegisterMemoryRegion(this, sizeof(ResourceManager)); } -template -void ResourceManagerType::Shutdown() +template +void ResourceManager::Shutdown() { while(!m_LiveResourceMap.empty()) { @@ -517,8 +516,8 @@ void ResourceManagerType::Shutdown() RDCASSERT(m_ResourceRecords.empty()); } -template -ResourceManagerType::~ResourceManager() +template +ResourceManager::~ResourceManager() { RDCASSERT(m_LiveResourceMap.empty()); RDCASSERT(m_InitialContents.empty()); @@ -528,51 +527,8 @@ ResourceManagerType::~ResourceManager() RenderDoc::Inst().GetCrashHandler()->UnregisterMemoryRegion(this); } -template -bool ResourceManagerType::MarkReferenced(map &refs, ResourceId id, - FrameRefType refType) -{ - if(refs.find(id) == refs.end()) - { - if(refType == eFrameRef_Read) - refs[id] = eFrameRef_ReadOnly; - else if(refType == eFrameRef_Write) - refs[id] = eFrameRef_ReadAndWrite; - else // unknown or existing state - refs[id] = refType; - - return true; - } - else - { - if(refType == eFrameRef_Unknown) - { - // nothing - } - else if(refType == eFrameRef_ReadBeforeWrite) - { - // special case, explicitly set to ReadBeforeWrite for when - // we know that this use will likely be a partial-write - refs[id] = eFrameRef_ReadBeforeWrite; - } - else if(refs[id] == eFrameRef_Unknown) - { - if(refType == eFrameRef_Read || refType == eFrameRef_ReadOnly) - refs[id] = eFrameRef_ReadOnly; - else - refs[id] = eFrameRef_ReadAndWrite; - } - else if(refs[id] == eFrameRef_ReadOnly && refType == eFrameRef_Write) - { - refs[id] = eFrameRef_ReadBeforeWrite; - } - } - - return false; -} - -template -void ResourceManagerType::MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) +template +void ResourceManager::MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) { SCOPED_LOCK(m_Lock); @@ -590,8 +546,8 @@ void ResourceManagerType::MarkResourceFrameReferenced(ResourceId id, FrameRefTyp } } -template -bool ResourceManagerType::ReadBeforeWrite(ResourceId id) +template +bool ResourceManager::ReadBeforeWrite(ResourceId id) { if(m_FrameReferencedResources.find(id) != m_FrameReferencedResources.end()) return m_FrameReferencedResources[id] == eFrameRef_ReadBeforeWrite || @@ -600,8 +556,8 @@ bool ResourceManagerType::ReadBeforeWrite(ResourceId id) return false; } -template -void ResourceManagerType::MarkDirtyResource(ResourceId res) +template +void ResourceManager::MarkDirtyResource(ResourceId res) { SCOPED_LOCK(m_Lock); @@ -611,8 +567,8 @@ void ResourceManagerType::MarkDirtyResource(ResourceId res) m_DirtyResources.insert(res); } -template -void ResourceManagerType::MarkPendingDirty(ResourceId res) +template +void ResourceManager::MarkPendingDirty(ResourceId res) { SCOPED_LOCK(m_Lock); @@ -622,8 +578,8 @@ void ResourceManagerType::MarkPendingDirty(ResourceId res) m_PendingDirtyResources.insert(res); } -template -void ResourceManagerType::FlushPendingDirty() +template +void ResourceManager::FlushPendingDirty() { SCOPED_LOCK(m_Lock); @@ -631,8 +587,8 @@ void ResourceManagerType::FlushPendingDirty() m_PendingDirtyResources.clear(); } -template -bool ResourceManagerType::IsResourceDirty(ResourceId res) +template +bool ResourceManager::IsResourceDirty(ResourceId res) { SCOPED_LOCK(m_Lock); @@ -642,8 +598,8 @@ bool ResourceManagerType::IsResourceDirty(ResourceId res) return m_DirtyResources.find(res) != m_DirtyResources.end(); } -template -void ResourceManagerType::MarkCleanResource(ResourceId res) +template +void ResourceManager::MarkCleanResource(ResourceId res) { SCOPED_LOCK(m_Lock); @@ -656,8 +612,8 @@ void ResourceManagerType::MarkCleanResource(ResourceId res) } } -template -void ResourceManagerType::SetInitialContents(ResourceId id, InitialContentData contents) +template +void ResourceManager::SetInitialContents(ResourceId id, InitialContentData contents) { SCOPED_LOCK(m_Lock); @@ -675,8 +631,8 @@ void ResourceManagerType::SetInitialContents(ResourceId id, InitialContentData c m_InitialContents[id] = contents; } -template -void ResourceManagerType::SetInitialChunk(ResourceId id, Chunk *chunk) +template +void ResourceManager::SetInitialChunk(ResourceId id, Chunk *chunk) { SCOPED_LOCK(m_Lock); @@ -696,8 +652,9 @@ void ResourceManagerType::SetInitialChunk(ResourceId id, Chunk *chunk) m_InitialChunks[id] = chunk; } -template -typename ResourceManagerType::InitialContentData ResourceManagerType::GetInitialContents(ResourceId id) +template +typename ResourceManager::InitialContentData ResourceManager< + Configuration>::GetInitialContents(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -729,8 +686,8 @@ void DoSerialise(SerialiserType &ser, ResourceManagerInternal::WrittenRecord &el SERIALISE_MEMBER(written); } -template -void ResourceManagerType::Serialise_InitialContentsNeeded(WriteSerialiser &ser) +template +void ResourceManager::Serialise_InitialContentsNeeded(WriteSerialiser &ser) { using namespace ResourceManagerInternal; @@ -771,8 +728,8 @@ void ResourceManagerType::Serialise_InitialContentsNeeded(WriteSerialiser &ser) SERIALISE_ELEMENT(WrittenRecords); } -template -void ResourceManagerType::FreeInitialContents() +template +void ResourceManager::FreeInitialContents() { while(!m_InitialContents.empty()) { @@ -784,8 +741,8 @@ void ResourceManagerType::FreeInitialContents() } } -template -void ResourceManagerType::CreateInitialContents(ReadSerialiser &ser) +template +void ResourceManager::CreateInitialContents(ReadSerialiser &ser) { using namespace ResourceManagerInternal; @@ -822,8 +779,8 @@ void ResourceManagerType::CreateInitialContents(ReadSerialiser &ser) } } -template -void ResourceManagerType::ApplyInitialContents() +template +void ResourceManager::ApplyInitialContents() { RDCDEBUG("Applying initial contents"); uint32_t numContents = 0; @@ -843,8 +800,8 @@ void ResourceManagerType::ApplyInitialContents() RDCDEBUG("Applied %d", numContents); } -template -void ResourceManagerType::MarkUnwrittenResources() +template +void ResourceManager::MarkUnwrittenResources() { SCOPED_LOCK(m_Lock); @@ -854,8 +811,8 @@ void ResourceManagerType::MarkUnwrittenResources() } } -template -void ResourceManagerType::InsertReferencedChunks(WriteSerialiser &ser) +template +void ResourceManager::InsertReferencedChunks(WriteSerialiser &ser) { map sortedChunks; @@ -903,8 +860,8 @@ void ResourceManagerType::InsertReferencedChunks(WriteSerialiser &ser) RDCDEBUG("inserted to serialiser"); } -template -void ResourceManagerType::PrepareInitialContents() +template +void ResourceManager::PrepareInitialContents() { SCOPED_LOCK(m_Lock); @@ -958,8 +915,8 @@ void ResourceManagerType::PrepareInitialContents() RDCDEBUG("Force-prepared %u dirty resources", prepared); } -template -void ResourceManagerType::InsertInitialContentsChunks(WriteSerialiser &ser) +template +void ResourceManager::InsertInitialContentsChunks(WriteSerialiser &ser) { SCOPED_LOCK(m_Lock); @@ -1089,8 +1046,8 @@ void ResourceManagerType::InsertInitialContentsChunks(WriteSerialiser &ser) m_InitialChunks.clear(); } -template -void ResourceManagerType::ApplyInitialContentsNonChunks(WriteSerialiser &ser) +template +void ResourceManager::ApplyInitialContentsNonChunks(WriteSerialiser &ser) { SCOPED_LOCK(m_Lock); @@ -1123,8 +1080,8 @@ void ResourceManagerType::ApplyInitialContentsNonChunks(WriteSerialiser &ser) } } -template -void ResourceManagerType::ClearReferencedResources() +template +void ResourceManager::ClearReferencedResources() { SCOPED_LOCK(m_Lock); @@ -1139,8 +1096,8 @@ void ResourceManagerType::ClearReferencedResources() m_FrameReferencedResources.clear(); } -template -void ResourceManagerType::ReplaceResource(ResourceId from, ResourceId to) +template +void ResourceManager::ReplaceResource(ResourceId from, ResourceId to) { SCOPED_LOCK(m_Lock); @@ -1148,16 +1105,16 @@ void ResourceManagerType::ReplaceResource(ResourceId from, ResourceId to) m_Replacements[from] = to; } -template -bool ResourceManagerType::HasReplacement(ResourceId from) +template +bool ResourceManager::HasReplacement(ResourceId from) { SCOPED_LOCK(m_Lock); return m_Replacements.find(from) != m_Replacements.end(); } -template -void ResourceManagerType::RemoveReplacement(ResourceId id) +template +void ResourceManager::RemoveReplacement(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1169,8 +1126,8 @@ void ResourceManagerType::RemoveReplacement(ResourceId id) m_Replacements.erase(it); } -template -RecordType *ResourceManagerType::GetResourceRecord(ResourceId id) +template +typename Configuration::RecordType *ResourceManager::GetResourceRecord(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1182,8 +1139,8 @@ RecordType *ResourceManagerType::GetResourceRecord(ResourceId id) return it->second; } -template -bool ResourceManagerType::HasResourceRecord(ResourceId id) +template +bool ResourceManager::HasResourceRecord(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1195,8 +1152,8 @@ bool ResourceManagerType::HasResourceRecord(ResourceId id) return true; } -template -RecordType *ResourceManagerType::AddResourceRecord(ResourceId id) +template +typename Configuration::RecordType *ResourceManager::AddResourceRecord(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1205,8 +1162,8 @@ RecordType *ResourceManagerType::AddResourceRecord(ResourceId id) return (m_ResourceRecords[id] = new RecordType(id)); } -template -void ResourceManagerType::RemoveResourceRecord(ResourceId id) +template +void ResourceManager::RemoveResourceRecord(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1215,14 +1172,14 @@ void ResourceManagerType::RemoveResourceRecord(ResourceId id) m_ResourceRecords.erase(id); } -template -void ResourceManagerType::DestroyResourceRecord(ResourceRecord *record) +template +void ResourceManager::DestroyResourceRecord(ResourceRecord *record) { delete(RecordType *)record; } -template -bool ResourceManagerType::AddWrapper(WrappedResourceType wrap, RealResourceType real) +template +bool ResourceManager::AddWrapper(WrappedResourceType wrap, RealResourceType real) { SCOPED_LOCK(m_Lock); @@ -1246,8 +1203,8 @@ bool ResourceManagerType::AddWrapper(WrappedResourceType wrap, RealResourceType return ret; } -template -void ResourceManagerType::RemoveWrapper(RealResourceType real) +template +void ResourceManager::RemoveWrapper(RealResourceType real) { SCOPED_LOCK(m_Lock); @@ -1261,8 +1218,8 @@ void ResourceManagerType::RemoveWrapper(RealResourceType real) m_WrapperMap.erase(m_WrapperMap.find(real)); } -template -bool ResourceManagerType::HasWrapper(RealResourceType real) +template +bool ResourceManager::HasWrapper(RealResourceType real) { SCOPED_LOCK(m_Lock); @@ -1272,8 +1229,9 @@ bool ResourceManagerType::HasWrapper(RealResourceType real) return (m_WrapperMap.find(real) != m_WrapperMap.end()); } -template -WrappedResourceType ResourceManagerType::GetWrapper(RealResourceType real) +template +typename Configuration::WrappedResourceType ResourceManager::GetWrapper( + RealResourceType real) { SCOPED_LOCK(m_Lock); @@ -1290,8 +1248,8 @@ WrappedResourceType ResourceManagerType::GetWrapper(RealResourceType real) return m_WrapperMap[real]; } -template -void ResourceManagerType::AddLiveResource(ResourceId origid, WrappedResourceType livePtr) +template +void ResourceManager::AddLiveResource(ResourceId origid, WrappedResourceType livePtr) { SCOPED_LOCK(m_Lock); @@ -1313,8 +1271,8 @@ void ResourceManagerType::AddLiveResource(ResourceId origid, WrappedResourceType m_LiveResourceMap[origid] = livePtr; } -template -bool ResourceManagerType::HasLiveResource(ResourceId origid) +template +bool ResourceManager::HasLiveResource(ResourceId origid) { SCOPED_LOCK(m_Lock); @@ -1325,8 +1283,9 @@ bool ResourceManagerType::HasLiveResource(ResourceId origid) m_LiveResourceMap.find(origid) != m_LiveResourceMap.end()); } -template -WrappedResourceType ResourceManagerType::GetLiveResource(ResourceId origid) +template +typename Configuration::WrappedResourceType ResourceManager::GetLiveResource( + ResourceId origid) { SCOPED_LOCK(m_Lock); @@ -1344,8 +1303,8 @@ WrappedResourceType ResourceManagerType::GetLiveResource(ResourceId origid) return (WrappedResourceType)RecordType::NullResource; } -template -void ResourceManagerType::EraseLiveResource(ResourceId origid) +template +void ResourceManager::EraseLiveResource(ResourceId origid) { SCOPED_LOCK(m_Lock); @@ -1354,8 +1313,8 @@ void ResourceManagerType::EraseLiveResource(ResourceId origid) m_LiveResourceMap.erase(origid); } -template -void ResourceManagerType::AddCurrentResource(ResourceId id, WrappedResourceType res) +template +void ResourceManager::AddCurrentResource(ResourceId id, WrappedResourceType res) { SCOPED_LOCK(m_Lock); @@ -1363,16 +1322,17 @@ void ResourceManagerType::AddCurrentResource(ResourceId id, WrappedResourceType m_CurrentResourceMap[id] = res; } -template -bool ResourceManagerType::HasCurrentResource(ResourceId id) +template +bool ResourceManager::HasCurrentResource(ResourceId id) { SCOPED_LOCK(m_Lock); return m_CurrentResourceMap.find(id) != m_CurrentResourceMap.end(); } -template -WrappedResourceType ResourceManagerType::GetCurrentResource(ResourceId id) +template +typename Configuration::WrappedResourceType ResourceManager::GetCurrentResource( + ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1383,8 +1343,8 @@ WrappedResourceType ResourceManagerType::GetCurrentResource(ResourceId id) return m_CurrentResourceMap[id]; } -template -void ResourceManagerType::ReleaseCurrentResource(ResourceId id) +template +void ResourceManager::ReleaseCurrentResource(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1392,8 +1352,8 @@ void ResourceManagerType::ReleaseCurrentResource(ResourceId id) m_CurrentResourceMap.erase(id); } -template -ResourceId ResourceManagerType::GetOriginalID(ResourceId id) +template +ResourceId ResourceManager::GetOriginalID(ResourceId id) { if(id == ResourceId()) return id; @@ -1402,8 +1362,8 @@ ResourceId ResourceManagerType::GetOriginalID(ResourceId id) return m_OriginalIDs[id]; } -template -ResourceId ResourceManagerType::GetLiveID(ResourceId id) +template +ResourceId ResourceManager::GetLiveID(ResourceId id) { if(id == ResourceId()) return id; @@ -1411,5 +1371,3 @@ ResourceId ResourceManagerType::GetLiveID(ResourceId id) RDCASSERT(m_LiveIDs.find(id) != m_LiveIDs.end(), id); return m_LiveIDs[id]; } - -#undef ResourceManagerType diff --git a/renderdoc/driver/d3d11/d3d11_manager.h b/renderdoc/driver/d3d11/d3d11_manager.h index 319ccd305..d87ec8dad 100644 --- a/renderdoc/driver/d3d11/d3d11_manager.h +++ b/renderdoc/driver/d3d11/d3d11_manager.h @@ -166,8 +166,14 @@ private: bool contexts[32]; }; -class D3D11ResourceManager - : public ResourceManager +struct D3D11ResourceManagerConfiguration +{ + typedef ID3D11DeviceChild *WrappedResourceType; + typedef ID3D11DeviceChild *RealResourceType; + typedef D3D11ResourceRecord RecordType; +}; + +class D3D11ResourceManager : public ResourceManager { public: D3D11ResourceManager(WrappedID3D11Device *dev) : m_Device(dev) {} diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index 2fdfcceba..e34a3d435 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -439,8 +439,14 @@ struct D3D12ResourceRecord : public ResourceRecord typedef vector SubresourceStateVector; -class D3D12ResourceManager - : public ResourceManager +struct D3D12ResourceManagerConfiguration +{ + typedef ID3D12DeviceChild *WrappedResourceType; + typedef ID3D12DeviceChild *RealResourceType; + typedef D3D12ResourceRecord RecordType; +}; + +class D3D12ResourceManager : public ResourceManager { public: D3D12ResourceManager(CaptureState state, WrappedID3D12Device *dev) diff --git a/renderdoc/driver/d3d8/d3d8_manager.h b/renderdoc/driver/d3d8/d3d8_manager.h index d29584ee3..ec571ba82 100644 --- a/renderdoc/driver/d3d8/d3d8_manager.h +++ b/renderdoc/driver/d3d8/d3d8_manager.h @@ -48,7 +48,14 @@ struct D3D8ResourceRecord : public ResourceRecord D3D8ResourceRecord(ResourceId id) : ResourceRecord(id, true) {} }; -class D3D8ResourceManager : public ResourceManager +struct D3D8ResourceManagerConfiguration +{ + typedef IUnknown *WrappedResourceType; + typedef IUnknown *RealResourceType; + typedef D3D8ResourceRecord RecordType; +}; + +class D3D8ResourceManager : public ResourceManager { public: D3D8ResourceManager(WrappedD3DDevice8 *dev) : m_Device(dev) {} diff --git a/renderdoc/driver/gl/gl_manager.h b/renderdoc/driver/gl/gl_manager.h index 8eb9688ef..55a98c2e1 100644 --- a/renderdoc/driver/gl/gl_manager.h +++ b/renderdoc/driver/gl/gl_manager.h @@ -30,7 +30,14 @@ class WrappedOpenGL; -class GLResourceManager : public ResourceManager +struct GLResourceManagerConfiguration +{ + typedef GLResource WrappedResourceType; + typedef GLResource RealResourceType; + typedef GLResourceRecord RecordType; +}; + +class GLResourceManager : public ResourceManager { public: GLResourceManager(WrappedOpenGL *gl); diff --git a/renderdoc/driver/vulkan/vk_manager.h b/renderdoc/driver/vulkan/vk_manager.h index c08b9d334..0bdd38097 100644 --- a/renderdoc/driver/vulkan/vk_manager.h +++ b/renderdoc/driver/vulkan/vk_manager.h @@ -33,8 +33,14 @@ using std::pair; class WrappedVulkan; -class VulkanResourceManager - : public ResourceManager +struct VulkanResourceManagerConfiguration +{ + typedef WrappedVkRes *WrappedResourceType; + typedef TypedRealHandle RealResourceType; + typedef VkResourceRecord RecordType; +}; + +class VulkanResourceManager : public ResourceManager { public: VulkanResourceManager(CaptureState state, WrappedVulkan *core)