diff --git a/renderdoc/core/resource_manager.cpp b/renderdoc/core/resource_manager.cpp index c4ee57dd7..15603b17c 100644 --- a/renderdoc/core/resource_manager.cpp +++ b/renderdoc/core/resource_manager.cpp @@ -45,7 +45,7 @@ namespace ResourceIDGen void ResourceRecord::MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) { - ResourceManager::MarkReferenced(m_FrameRefs, id, refType); + ResourceManager::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 0a985368d..513ee0b16 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -298,7 +298,7 @@ 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: @@ -309,9 +309,9 @@ class ResourceManager : public ResourceRecordHandler struct InitialContentData { - InitialContentData(ResourceType r, uint32_t n, byte *b) : resource(r), num(n), blob(b) {} - InitialContentData() : resource((ResourceType)RecordType::NullResource), num(0), blob(NULL) {} - ResourceType resource; + InitialContentData(WrappedResourceType r, uint32_t n, byte *b) : resource(r), num(n), blob(b) {} + InitialContentData() : resource((WrappedResourceType)RecordType::NullResource), num(0), blob(NULL) {} + WrappedResourceType resource; uint32_t num; byte *blob; }; @@ -326,9 +326,9 @@ class ResourceManager : public ResourceRecordHandler inline void RemoveResourceRecord(ResourceId id); // while capturing or replaying, resources and their live IDs - void AddCurrentResource(ResourceId id, ResourceType res); + void AddCurrentResource(ResourceId id, WrappedResourceType res); bool HasCurrentResource(ResourceId id); - ResourceType GetCurrentResource(ResourceId id); + WrappedResourceType GetCurrentResource(ResourceId id); void ReleaseCurrentResource(ResourceId id); void MarkInFrame(bool inFrame) { m_InFrame = inFrame; } @@ -391,9 +391,9 @@ class ResourceManager : public ResourceRecordHandler // Replay-side methods // Live resources to replace serialised IDs - void AddLiveResource(ResourceId origid, ResourceType livePtr); + void AddLiveResource(ResourceId origid, WrappedResourceType livePtr); bool HasLiveResource(ResourceId origid); - ResourceType GetLiveResource(ResourceId origid); + WrappedResourceType GetLiveResource(ResourceId origid); void EraseLiveResource(ResourceId origid); // when asked for a given id, return the resource for a replacement id @@ -411,24 +411,24 @@ class ResourceManager : public ResourceRecordHandler void ApplyInitialContents(); // Resource wrapping, allows for querying and adding/removing of wrapper layers around resources - bool AddWrapper(ResourceType wrap, ResourceType real); - bool HasWrapper(ResourceType real); - ResourceType GetWrapper(ResourceType real); - void RemoveWrapper(ResourceType real); + bool AddWrapper(WrappedResourceType wrap, RealResourceType real); + bool HasWrapper(RealResourceType real); + WrappedResourceType GetWrapper(RealResourceType real); + void RemoveWrapper(RealResourceType real); protected: // 'interface' to implement by derived classes virtual bool SerialisableResource(ResourceId id, RecordType *record) = 0; - virtual ResourceId GetID(ResourceType res) = 0; + virtual ResourceId GetID(WrappedResourceType res) = 0; - virtual bool ResourceTypeRelease(ResourceType res) = 0; + virtual bool ResourceTypeRelease(WrappedResourceType res) = 0; - virtual bool Force_InitialState(ResourceType res) = 0; - virtual bool Need_InitialStateChunk(ResourceType res) = 0; - virtual bool Prepare_InitialState(ResourceType res) = 0; - virtual bool Serialise_InitialState(ResourceType res) = 0; - virtual void Create_InitialState(ResourceId id, ResourceType live, bool hasData) = 0; - virtual void Apply_InitialState(ResourceType live, InitialContentData initial) = 0; + virtual bool Force_InitialState(WrappedResourceType res) = 0; + virtual bool Need_InitialStateChunk(WrappedResourceType res) = 0; + virtual bool Prepare_InitialState(WrappedResourceType res) = 0; + virtual bool Serialise_InitialState(WrappedResourceType res) = 0; + virtual void Create_InitialState(ResourceId id, WrappedResourceType live, bool hasData) = 0; + virtual void Apply_InitialState(WrappedResourceType live, InitialContentData initial) = 0; LogState m_State; Serialiser *m_pSerialiser; @@ -445,7 +445,7 @@ class ResourceManager : public ResourceRecordHandler // likely prove that some or all of these could be a problem // used during capture - map from real resource to its wrapper (other way can be done just with an Unwrap) - map m_WrapperMap; + map m_WrapperMap; // used during capture - holds resources referenced in current frame (and how they're referenced) map m_FrameReferencedResources; @@ -461,14 +461,14 @@ class ResourceManager : public ResourceRecordHandler map m_InitialChunks; // used during capture or replay - map of resources currently alive with their real IDs, used in capture and replay. - map m_CurrentResourceMap; + map m_CurrentResourceMap; // used during replay - maps back and forth from original id to live id and vice-versa map m_OriginalIDs, m_LiveIDs; // used during replay - holds resources allocated and the original id that they represent // for a) in-frame creations and b) pre-frame creations respectively. - map m_InframeResourceMap, m_LiveResourceMap; + map m_InframeResourceMap, m_LiveResourceMap; // used during capture - holds resource records by id. map m_ResourceRecords; @@ -477,8 +477,8 @@ class ResourceManager : public ResourceRecordHandler map m_Replacements; }; -template -ResourceManager::ResourceManager(LogState state, Serialiser *ser) +template +ResourceManager::ResourceManager(LogState state, Serialiser *ser) { if(RenderDoc::Inst().GetCrashHandler()) RenderDoc::Inst().GetCrashHandler()->RegisterMemoryRegion(this, sizeof(ResourceManager)); @@ -489,8 +489,8 @@ ResourceManager::ResourceManager(LogState state, Seria m_InFrame = false; } -template -void ResourceManager::Shutdown() +template +void ResourceManager::Shutdown() { while(!m_LiveResourceMap.empty()) { @@ -520,8 +520,8 @@ void ResourceManager::Shutdown() RDCASSERT(m_ResourceRecords.empty()); } -template -ResourceManager::~ResourceManager() +template +ResourceManager::~ResourceManager() { RDCASSERT(m_LiveResourceMap.empty()); RDCASSERT(m_InframeResourceMap.empty()); @@ -532,8 +532,8 @@ ResourceManager::~ResourceManager() RenderDoc::Inst().GetCrashHandler()->UnregisterMemoryRegion(this); } -template -bool ResourceManager::MarkReferenced(map &refs, ResourceId id, FrameRefType refType) +template +bool ResourceManager::MarkReferenced(map &refs, ResourceId id, FrameRefType refType) { if(refs.find(id) == refs.end()) { @@ -576,8 +576,8 @@ bool ResourceManager::MarkReferenced(map -void ResourceManager::MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) +template +void ResourceManager::MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) { SCOPED_LOCK(m_Lock); @@ -595,8 +595,8 @@ void ResourceManager::MarkResourceFrameReferenced(Reso } } -template -bool ResourceManager::ReadBeforeWrite(ResourceId id) +template +bool ResourceManager::ReadBeforeWrite(ResourceId id) { if(m_FrameReferencedResources.find(id) != m_FrameReferencedResources.end()) return m_FrameReferencedResources[id] == eFrameRef_ReadBeforeWrite || @@ -605,8 +605,8 @@ bool ResourceManager::ReadBeforeWrite(ResourceId id) return false; } -template -void ResourceManager::MarkDirtyResource(ResourceId res) +template +void ResourceManager::MarkDirtyResource(ResourceId res) { SCOPED_LOCK(m_Lock); @@ -616,8 +616,8 @@ void ResourceManager::MarkDirtyResource(ResourceId res m_DirtyResources.insert(res); } -template -void ResourceManager::MarkPendingDirty(ResourceId res) +template +void ResourceManager::MarkPendingDirty(ResourceId res) { SCOPED_LOCK(m_Lock); @@ -627,8 +627,8 @@ void ResourceManager::MarkPendingDirty(ResourceId res) m_PendingDirtyResources.insert(res); } -template -void ResourceManager::FlushPendingDirty() +template +void ResourceManager::FlushPendingDirty() { SCOPED_LOCK(m_Lock); @@ -636,8 +636,8 @@ void ResourceManager::FlushPendingDirty() m_PendingDirtyResources.clear(); } -template -bool ResourceManager::IsResourceDirty(ResourceId res) +template +bool ResourceManager::IsResourceDirty(ResourceId res) { SCOPED_LOCK(m_Lock); @@ -647,8 +647,8 @@ bool ResourceManager::IsResourceDirty(ResourceId res) return m_DirtyResources.find(res) != m_DirtyResources.end(); } -template -void ResourceManager::MarkCleanResource(ResourceId res) +template +void ResourceManager::MarkCleanResource(ResourceId res) { SCOPED_LOCK(m_Lock); @@ -661,8 +661,8 @@ void ResourceManager::MarkCleanResource(ResourceId res } } -template -void ResourceManager::SetInitialContents(ResourceId id, InitialContentData contents) +template +void ResourceManager::SetInitialContents(ResourceId id, InitialContentData contents) { SCOPED_LOCK(m_Lock); @@ -680,8 +680,8 @@ void ResourceManager::SetInitialContents(ResourceId id m_InitialContents[id] = contents; } -template -void ResourceManager::SetInitialChunk(ResourceId id, Chunk *chunk) +template +void ResourceManager::SetInitialChunk(ResourceId id, Chunk *chunk) { SCOPED_LOCK(m_Lock); @@ -701,8 +701,8 @@ void ResourceManager::SetInitialChunk(ResourceId id, C m_InitialChunks[id] = chunk; } -template -typename ResourceManager::InitialContentData ResourceManager::GetInitialContents(ResourceId id) +template +typename ResourceManager::InitialContentData ResourceManager::GetInitialContents(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -715,8 +715,8 @@ typename ResourceManager::InitialContentData ResourceM return InitialContentData(); } -template -void ResourceManager::Serialise_InitialContentsNeeded() +template +void ResourceManager::Serialise_InitialContentsNeeded() { SCOPED_LOCK(m_Lock); @@ -760,8 +760,8 @@ void ResourceManager::Serialise_InitialContentsNeeded( } } -template -void ResourceManager::CreateInitialContents() +template +void ResourceManager::CreateInitialContents() { set neededInitials; @@ -800,8 +800,8 @@ void ResourceManager::CreateInitialContents() } } -template -void ResourceManager::ApplyInitialContents() +template +void ResourceManager::ApplyInitialContents() { RDCDEBUG("Applying initial contents"); uint32_t numContents = 0; @@ -811,7 +811,7 @@ void ResourceManager::ApplyInitialContents() if(HasLiveResource(id)) { - ResourceType live = GetLiveResource(id); + WrappedResourceType live = GetLiveResource(id); numContents++; @@ -821,8 +821,8 @@ void ResourceManager::ApplyInitialContents() RDCDEBUG("Applied %d", numContents); } -template -void ResourceManager::MarkUnwrittenResources() +template +void ResourceManager::MarkUnwrittenResources() { SCOPED_LOCK(m_Lock); @@ -832,8 +832,8 @@ void ResourceManager::MarkUnwrittenResources() } } -template -void ResourceManager::InsertReferencedChunks(Serialiser *fileSer) +template +void ResourceManager::InsertReferencedChunks(Serialiser *fileSer) { map sortedChunks; @@ -871,8 +871,8 @@ void ResourceManager::InsertReferencedChunks(Serialise RDCDEBUG("inserted to serialiser"); } -template -void ResourceManager::PrepareInitialContents() +template +void ResourceManager::PrepareInitialContents() { for(auto it=m_DirtyResources.begin(); it != m_DirtyResources.end(); ++it) { @@ -881,7 +881,7 @@ void ResourceManager::PrepareInitialContents() if(!HasCurrentResource(id)) continue; RecordType *record = GetResourceRecord(id); - ResourceType res = GetCurrentResource(id); + WrappedResourceType res = GetCurrentResource(id); if(record == NULL || record->SpecialResource) continue; @@ -892,7 +892,7 @@ void ResourceManager::PrepareInitialContents() for(auto it=m_CurrentResourceMap.begin(); it != m_CurrentResourceMap.end(); ++it) { - if(it->second == (ResourceType)RecordType::NullResource) continue; + if(it->second == (WrappedResourceType)RecordType::NullResource) continue; if(Force_InitialState(it->second)) { @@ -901,8 +901,8 @@ void ResourceManager::PrepareInitialContents() } } -template -void ResourceManager::InsertInitialContentsChunks(Serialiser *fileSerialiser) +template +void ResourceManager::InsertInitialContentsChunks(Serialiser *fileSerialiser) { SCOPED_LOCK(m_Lock); @@ -920,7 +920,7 @@ void ResourceManager::InsertInitialContentsChunks(Seri if(!HasCurrentResource(id)) continue; RecordType *record = GetResourceRecord(id); - ResourceType res = GetCurrentResource(id); + WrappedResourceType res = GetCurrentResource(id); if(record == NULL || record->SpecialResource) continue; @@ -951,7 +951,7 @@ void ResourceManager::InsertInitialContentsChunks(Seri for(auto it=m_CurrentResourceMap.begin(); it != m_CurrentResourceMap.end(); ++it) { - if(it->second == (ResourceType)RecordType::NullResource) continue; + if(it->second == (WrappedResourceType)RecordType::NullResource) continue; if(Force_InitialState(it->second)) { @@ -980,8 +980,8 @@ void ResourceManager::InsertInitialContentsChunks(Seri m_InitialChunks.clear(); } -template -void ResourceManager::ReleaseInFrameResources() +template +void ResourceManager::ReleaseInFrameResources() { SCOPED_LOCK(m_Lock); @@ -995,8 +995,8 @@ void ResourceManager::ReleaseInFrameResources() m_InframeResourceMap.clear(); } -template -void ResourceManager::ClearReferencedResources() +template +void ResourceManager::ClearReferencedResources() { SCOPED_LOCK(m_Lock); @@ -1011,8 +1011,8 @@ void ResourceManager::ClearReferencedResources() m_FrameReferencedResources.clear(); } -template -void ResourceManager::ReplaceResource(ResourceId from, ResourceId to) +template +void ResourceManager::ReplaceResource(ResourceId from, ResourceId to) { SCOPED_LOCK(m_Lock); @@ -1020,8 +1020,8 @@ void ResourceManager::ReplaceResource(ResourceId from, m_Replacements[from] = to; } -template -void ResourceManager::RemoveReplacement(ResourceId id) +template +void ResourceManager::RemoveReplacement(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1033,8 +1033,8 @@ void ResourceManager::RemoveReplacement(ResourceId id) m_Replacements.erase(it); } -template -RecordType *ResourceManager::GetResourceRecord(ResourceId id) +template +RecordType *ResourceManager::GetResourceRecord(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1046,8 +1046,8 @@ RecordType *ResourceManager::GetResourceRecord(Resourc return it->second; } -template -bool ResourceManager::HasResourceRecord(ResourceId id) +template +bool ResourceManager::HasResourceRecord(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1059,8 +1059,8 @@ bool ResourceManager::HasResourceRecord(ResourceId id) return true; } -template -RecordType *ResourceManager::AddResourceRecord(ResourceId id) +template +RecordType *ResourceManager::AddResourceRecord(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1069,8 +1069,8 @@ RecordType *ResourceManager::AddResourceRecord(Resourc return (m_ResourceRecords[id] = new RecordType(id)); } -template -void ResourceManager::RemoveResourceRecord(ResourceId id) +template +void ResourceManager::RemoveResourceRecord(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1079,20 +1079,20 @@ void ResourceManager::RemoveResourceRecord(ResourceId m_ResourceRecords.erase(id); } -template -bool ResourceManager::AddWrapper(ResourceType wrap, ResourceType real) +template +bool ResourceManager::AddWrapper(WrappedResourceType wrap, RealResourceType real) { SCOPED_LOCK(m_Lock); bool ret = true; - if(wrap == (ResourceType)RecordType::NullResource || real == (ResourceType)RecordType::NullResource) + if(wrap == (WrappedResourceType)RecordType::NullResource || real == (RealResourceType)RecordType::NullResource) { RDCERR("Invalid state creating resource wrapper - wrapped or real resource is NULL"); ret = false; } - if(m_WrapperMap[real] != (ResourceType)RecordType::NullResource) + if(m_WrapperMap[real] != (WrappedResourceType)RecordType::NullResource) { RDCERR("Overriding wrapper for resource"); ret = false; @@ -1103,12 +1103,12 @@ bool ResourceManager::AddWrapper(ResourceType wrap, Re return ret; } -template -void ResourceManager::RemoveWrapper(ResourceType real) +template +void ResourceManager::RemoveWrapper(RealResourceType real) { SCOPED_LOCK(m_Lock); - if(real == (ResourceType)RecordType::NullResource || !HasWrapper(real)) + if(real == (RealResourceType)RecordType::NullResource || !HasWrapper(real)) { RDCERR("Invalid state removing resource wrapper - real resource is NULL or doesn't have wrapper"); return; @@ -1117,26 +1117,26 @@ void ResourceManager::RemoveWrapper(ResourceType real) m_WrapperMap.erase( m_WrapperMap.find(real) ); } -template -bool ResourceManager::HasWrapper(ResourceType real) +template +bool ResourceManager::HasWrapper(RealResourceType real) { SCOPED_LOCK(m_Lock); - if(real == (ResourceType)RecordType::NullResource) + if(real == (RealResourceType)RecordType::NullResource) return false; return (m_WrapperMap.find(real) != m_WrapperMap.end()); } -template -ResourceType ResourceManager::GetWrapper(ResourceType real) +template +WrappedResourceType ResourceManager::GetWrapper(RealResourceType real) { SCOPED_LOCK(m_Lock); - if(real == (ResourceType)RecordType::NullResource) - return (ResourceType)RecordType::NullResource; + if(real == (RealResourceType)RecordType::NullResource) + return (RealResourceType)RecordType::NullResource; - if(real != (ResourceType)RecordType::NullResource && !HasWrapper(real)) + if(real != (RealResourceType)RecordType::NullResource && !HasWrapper(real)) { RDCERR("Invalid state removing resource wrapper - real resource isn't NULL and doesn't have wrapper"); } @@ -1144,12 +1144,12 @@ ResourceType ResourceManager::GetWrapper(ResourceType return m_WrapperMap[real]; } -template -void ResourceManager::AddLiveResource(ResourceId origid, ResourceType livePtr) +template +void ResourceManager::AddLiveResource(ResourceId origid, WrappedResourceType livePtr) { SCOPED_LOCK(m_Lock); - if(origid == ResourceId() || livePtr == (ResourceType)RecordType::NullResource) + if(origid == ResourceId() || livePtr == (WrappedResourceType)RecordType::NullResource) { RDCERR("Invalid state adding resource mapping - id is invalid or live pointer is NULL"); } @@ -1175,8 +1175,8 @@ void ResourceManager::AddLiveResource(ResourceId origi m_LiveResourceMap[origid] = livePtr; } -template -bool ResourceManager::HasLiveResource(ResourceId origid) +template +bool ResourceManager::HasLiveResource(ResourceId origid) { SCOPED_LOCK(m_Lock); @@ -1188,13 +1188,13 @@ bool ResourceManager::HasLiveResource(ResourceId origi m_LiveResourceMap.find(origid) != m_LiveResourceMap.end()); } -template -ResourceType ResourceManager::GetLiveResource(ResourceId origid) +template +WrappedResourceType ResourceManager::GetLiveResource(ResourceId origid) { SCOPED_LOCK(m_Lock); if(origid == ResourceId()) - return (ResourceType)RecordType::NullResource; + return (WrappedResourceType)RecordType::NullResource; RDCASSERT(HasLiveResource(origid)); @@ -1207,11 +1207,11 @@ ResourceType ResourceManager::GetLiveResource(Resource if(m_LiveResourceMap.find(origid) != m_LiveResourceMap.end()) return m_LiveResourceMap[origid]; - return (ResourceType)RecordType::NullResource; + return (WrappedResourceType)RecordType::NullResource; } -template -void ResourceManager::EraseLiveResource(ResourceId origid) +template +void ResourceManager::EraseLiveResource(ResourceId origid) { SCOPED_LOCK(m_Lock); @@ -1227,8 +1227,8 @@ void ResourceManager::EraseLiveResource(ResourceId ori } } -template -void ResourceManager::AddCurrentResource(ResourceId id, ResourceType res) +template +void ResourceManager::AddCurrentResource(ResourceId id, WrappedResourceType res) { SCOPED_LOCK(m_Lock); @@ -1236,16 +1236,16 @@ void ResourceManager::AddCurrentResource(ResourceId id m_CurrentResourceMap[id] = res; } -template -bool ResourceManager::HasCurrentResource(ResourceId id) +template +bool ResourceManager::HasCurrentResource(ResourceId id) { SCOPED_LOCK(m_Lock); return m_CurrentResourceMap.find(id) != m_CurrentResourceMap.end(); } -template -ResourceType ResourceManager::GetCurrentResource(ResourceId id) +template +WrappedResourceType ResourceManager::GetCurrentResource(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1253,8 +1253,8 @@ ResourceType ResourceManager::GetCurrentResource(Resou return m_CurrentResourceMap[id]; } -template -void ResourceManager::ReleaseCurrentResource(ResourceId id) +template +void ResourceManager::ReleaseCurrentResource(ResourceId id) { SCOPED_LOCK(m_Lock); @@ -1262,8 +1262,8 @@ void ResourceManager::ReleaseCurrentResource(ResourceI m_CurrentResourceMap.erase(id); } -template -ResourceId ResourceManager::GetOriginalID(ResourceId id) +template +ResourceId ResourceManager::GetOriginalID(ResourceId id) { if(id == ResourceId()) return id; @@ -1272,8 +1272,8 @@ ResourceId ResourceManager::GetOriginalID(ResourceId i return m_OriginalIDs[id]; } -template -ResourceId ResourceManager::GetLiveID(ResourceId id) +template +ResourceId ResourceManager::GetLiveID(ResourceId id) { if(id == ResourceId()) return id; diff --git a/renderdoc/driver/d3d11/d3d11_manager.h b/renderdoc/driver/d3d11/d3d11_manager.h index d3946e7b2..441700161 100644 --- a/renderdoc/driver/d3d11/d3d11_manager.h +++ b/renderdoc/driver/d3d11/d3d11_manager.h @@ -132,7 +132,7 @@ private: bool contexts[32]; }; -class D3D11ResourceManager : public ResourceManager +class D3D11ResourceManager : public ResourceManager { public: D3D11ResourceManager(LogState state, Serialiser *ser, WrappedID3D11Device *dev) diff --git a/renderdoc/driver/gl/gl_manager.h b/renderdoc/driver/gl/gl_manager.h index fcc315108..ad83fa6ea 100644 --- a/renderdoc/driver/gl/gl_manager.h +++ b/renderdoc/driver/gl/gl_manager.h @@ -31,7 +31,7 @@ class WrappedOpenGL; -class GLResourceManager : public ResourceManager +class GLResourceManager : public ResourceManager { public: GLResourceManager(LogState state, Serialiser *ser, WrappedOpenGL *gl) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 64f44a775..81b50a3a5 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1083,7 +1083,7 @@ VkResult WrappedVulkan::vkGetGlobalExtensionProperties( GetResourceManager()->ReleaseCurrentResource(wrapped->id); \ if(wrapped->record) wrapped->record->Delete(GetResourceManager()); \ if(m_ImageInfo.find(wrapped->id) != m_ImageInfo.end()) m_ImageInfo.erase(wrapped->id); \ - return ObjDisp(device)->func(Unwrap(device), type(wrapped->real)); \ + return ObjDisp(device)->func(Unwrap(device), wrapped->real.As()); \ } DESTROY_IMPL(VkBuffer, DestroyBuffer) @@ -1117,7 +1117,7 @@ VkResult WrappedVulkan::vkDestroyCommandBuffer(VkDevice device, VkCmdBuffer obj) WrappedVkDispRes *wrapped = (WrappedVkDispRes *)GetWrapped(obj); GetResourceManager()->MarkCleanResource(wrapped->id); if(wrapped->record) wrapped->record->Delete(GetResourceManager()); - return ObjDisp(device)->DestroyCommandBuffer(Unwrap(device), (VkCmdBuffer)(uintptr_t)wrapped->real); + return ObjDisp(device)->DestroyCommandBuffer(Unwrap(device), wrapped->real.As()); } @@ -1664,7 +1664,7 @@ VkResult WrappedVulkan::vkFreeMemory( if(wrapped->record) wrapped->record->Delete(GetResourceManager()); GetResourceManager()->ReleaseCurrentResource(wrapped->id); - return ObjDisp(device)->FreeMemory(Unwrap(device), VkDeviceMemory(wrapped->real)); + return ObjDisp(device)->FreeMemory(Unwrap(device), wrapped->real.As()); } VkResult WrappedVulkan::vkMapMemory( @@ -5669,87 +5669,87 @@ bool WrappedVulkan::ReleaseResource(WrappedVkRes *res) case eResInstance: { - VkInstance instance = (VkInstance)disp->real; + VkInstance instance = disp->real.As(); dispatch_key key = get_dispatch_key(instance); ObjDisp(instance)->DestroyInstance(instance); destroy_instance_dispatch_table(key); break; } case eResDevice: - vt->DestroyDevice((VkDevice)disp->real); + vt->DestroyDevice(disp->real.As()); break; case eResDeviceMemory: - vt->FreeMemory(dev, (VkDeviceMemory)nondisp->real); + vt->FreeMemory(dev, nondisp->real.As()); break; case eResBuffer: - vt->DestroyBuffer(dev, (VkBuffer)nondisp->real); + vt->DestroyBuffer(dev, nondisp->real.As()); break; case eResBufferView: - vt->DestroyBufferView(dev, (VkBufferView)nondisp->real); + vt->DestroyBufferView(dev, nondisp->real.As()); break; case eResImage: - vt->DestroyImage(dev, (VkImage)nondisp->real); + vt->DestroyImage(dev, nondisp->real.As()); break; case eResImageView: - vt->DestroyImageView(dev, (VkImageView)nondisp->real); + vt->DestroyImageView(dev, nondisp->real.As()); break; case eResAttachmentView: - vt->DestroyAttachmentView(dev, (VkAttachmentView)nondisp->real); + vt->DestroyAttachmentView(dev, nondisp->real.As()); break; case eResFramebuffer: - vt->DestroyFramebuffer(dev, (VkFramebuffer)nondisp->real); + vt->DestroyFramebuffer(dev, nondisp->real.As()); break; case eResRenderPass: - vt->DestroyRenderPass(dev, (VkRenderPass)nondisp->real); + vt->DestroyRenderPass(dev, nondisp->real.As()); break; case eResShaderModule: - vt->DestroyShaderModule(dev, (VkShaderModule)nondisp->real); + vt->DestroyShaderModule(dev, nondisp->real.As()); break; case eResShader: - vt->DestroyShader(dev, (VkShader)nondisp->real); + vt->DestroyShader(dev, nondisp->real.As()); break; case eResPipelineCache: - vt->DestroyPipelineCache(dev, (VkPipelineCache)nondisp->real); + vt->DestroyPipelineCache(dev, nondisp->real.As()); break; case eResPipelineLayout: - vt->DestroyPipelineLayout(dev, (VkPipelineLayout)nondisp->real); + vt->DestroyPipelineLayout(dev, nondisp->real.As()); break; case eResPipeline: - vt->DestroyPipeline(dev, (VkPipeline)nondisp->real); + vt->DestroyPipeline(dev, nondisp->real.As()); break; case eResSampler: - vt->DestroySampler(dev, (VkSampler)nondisp->real); + vt->DestroySampler(dev, nondisp->real.As()); break; case eResDescriptorPool: - vt->DestroyDescriptorPool(dev, (VkDescriptorPool)nondisp->real); + vt->DestroyDescriptorPool(dev, nondisp->real.As()); break; case eResDescriptorSetLayout: - vt->DestroyDescriptorSetLayout(dev, (VkDescriptorSetLayout)nondisp->real); + vt->DestroyDescriptorSetLayout(dev, nondisp->real.As()); break; case eResViewportState: - vt->DestroyDynamicViewportState(dev, (VkDynamicViewportState)nondisp->real); + vt->DestroyDynamicViewportState(dev, nondisp->real.As()); break; case eResRasterState: - vt->DestroyDynamicViewportState(dev, (VkDynamicViewportState)nondisp->real); + vt->DestroyDynamicViewportState(dev, nondisp->real.As()); break; case eResColorBlendState: - vt->DestroyDynamicColorBlendState(dev, (VkDynamicColorBlendState)nondisp->real); + vt->DestroyDynamicColorBlendState(dev, nondisp->real.As()); break; case eResDepthStencilState: - vt->DestroyDynamicDepthStencilState(dev, (VkDynamicDepthStencilState)nondisp->real); + vt->DestroyDynamicDepthStencilState(dev, nondisp->real.As()); break; case eResCmdPool: - vt->DestroyCommandPool(dev, (VkCmdPool)nondisp->real); + vt->DestroyCommandPool(dev, nondisp->real.As()); break; case eResCmdBuffer: - vt->DestroyCommandBuffer(dev, (VkCmdBuffer)disp->real); + vt->DestroyCommandBuffer(dev, disp->real.As()); break; case eResFence: // VKTODOLOW - //vt->DestroyFence(dev, (VkFence)nondisp->real); + //vt->DestroyFence(dev, nondisp->real.As()); break; case eResSemaphore: - vt->DestroySemaphore(dev, (VkSemaphore)nondisp->real); + vt->DestroySemaphore(dev, nondisp->real.As()); break; } @@ -7731,8 +7731,8 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager MemState &meminfo = m_MemoryInfo[id]; - VkBuffer srcBuf = (VkBuffer)(uintptr_t)initial.resource; - VkDeviceMemory dstMem = (VkDeviceMemory)(uintptr_t)live; // maintain the wrapping, for consistency + VkBuffer srcBuf = (VkBuffer)(uint64_t)initial.resource; + VkDeviceMemory dstMem = (VkDeviceMemory)(uint64_t)live; // maintain the wrapping, for consistency VkResult vkr = VK_SUCCESS; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 428876642..ae4039a13 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -57,8 +57,8 @@ void SetDispatchTable(bool writing, wrappedtype *wrapped) if(writing) { wrapped->table = wrappedtype::UseInstanceDispatchTable - ? (uintptr_t)instance_dispatch_table((void *)wrapped->real) - : (uintptr_t)device_dispatch_table((void *)wrapped->real); + ? (uintptr_t)instance_dispatch_table((void *)wrapped->real.handle) + : (uintptr_t)device_dispatch_table((void *)wrapped->real.handle); } else { diff --git a/renderdoc/driver/vulkan/vk_manager.h b/renderdoc/driver/vulkan/vk_manager.h index b67a5c5f2..2c5dabcf2 100644 --- a/renderdoc/driver/vulkan/vk_manager.h +++ b/renderdoc/driver/vulkan/vk_manager.h @@ -35,7 +35,7 @@ using std::pair; class WrappedVulkan; -class VulkanResourceManager : public ResourceManager +class VulkanResourceManager : public ResourceManager { public: VulkanResourceManager(LogState s, Serialiser *ser, WrappedVulkan *core) @@ -72,13 +72,13 @@ class VulkanResourceManager : public ResourceManager realtype GetLiveHandle(ResourceId origid) { - return UnwrapHelper::ToHandle( ((typename UnwrapHelper::ParentType *)ResourceManager::GetLiveResource(origid))->real ); + return ((typename UnwrapHelper::ParentType *)ResourceManager::GetLiveResource(origid))->real.As(); } template realtype GetCurrentHandle(ResourceId id) { - return UnwrapHelper::ToHandle( ((typename UnwrapHelper::ParentType *)ResourceManager::GetCurrentResource(id))->real ); + return ((typename UnwrapHelper::ParentType *)ResourceManager::GetCurrentResource(id))->real.As(); } // handling memory & image transitions @@ -111,7 +111,9 @@ class VulkanResourceManager : public ResourceManager::ToHandle((uint64_t)(uintptr_t)wrapped); + AddWrapper(wrapped, UnwrapHelper::ToRealRes(obj)); + + obj = realtype((uint64_t)wrapped); return id; } diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 4823bd681..b68c8e7be 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -45,11 +45,27 @@ struct WrappedVkRes { }; +// dummy standin for a typeless real resource +// stored in a uint64_t, with function to cast back +// if we know what type it is +struct RealVkRes +{ + RealVkRes() : handle(VK_NULL_HANDLE) {} + RealVkRes(void *disp) : handle((uint64_t)disp) {} + RealVkRes(uint64_t nondisp) : handle(nondisp) {} + + bool operator ==(const RealVkRes o) const { return handle == o.handle; } + bool operator < (const RealVkRes o) const { return handle < o.handle; } + + uint64_t handle; + template T As() { return (T)handle; } +}; + struct WrappedVkNonDispRes : public WrappedVkRes { template WrappedVkNonDispRes(T obj, ResourceId objId) : real(obj.handle), id(objId), record(NULL) {} - uint64_t real; + RealVkRes real; ResourceId id; union { @@ -61,26 +77,26 @@ struct WrappedVkNonDispRes : public WrappedVkRes struct WrappedVkDispRes : public WrappedVkRes { - WrappedVkDispRes(VkInstance obj, ResourceId objId) : table(0), real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) + WrappedVkDispRes(VkInstance obj, ResourceId objId) : table(0), real((void *)obj), id(objId), record(NULL) { loaderTable = *(uintptr_t*)obj; } - WrappedVkDispRes(VkPhysicalDevice obj, ResourceId objId) : table(0), real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) + WrappedVkDispRes(VkPhysicalDevice obj, ResourceId objId) : table(0), real((void *)obj), id(objId), record(NULL) { loaderTable = *(uintptr_t*)obj; } - WrappedVkDispRes(VkDevice obj, ResourceId objId) : table(0), real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) + WrappedVkDispRes(VkDevice obj, ResourceId objId) : table(0), real((void *)obj), id(objId), record(NULL) { loaderTable = *(uintptr_t*)obj; } - WrappedVkDispRes(VkQueue obj, ResourceId objId) : table(0), real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) + WrappedVkDispRes(VkQueue obj, ResourceId objId) : table(0), real((void *)obj), id(objId), record(NULL) { loaderTable = *(uintptr_t*)obj; } - WrappedVkDispRes(VkCmdBuffer obj, ResourceId objId) : table(0), real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) + WrappedVkDispRes(VkCmdBuffer obj, ResourceId objId) : table(0), real((void *)obj), id(objId), record(NULL) { loaderTable = *(uintptr_t*)obj; } // VKTODOLOW there's padding here on 32-bit but I don't know if I really care about 32-bit. // preserve dispatch table pointer in dispatchable objects uintptr_t loaderTable, table; - uint64_t real; + RealVkRes real; ResourceId id; union { @@ -91,7 +107,7 @@ struct WrappedVkDispRes : public WrappedVkRes }; // ensure the structs don't accidentally get made larger -RDCCOMPILE_ASSERT(sizeof(WrappedVkDispRes) == sizeof(uint64_t)*5, "Wrapped resource struct has changed size! This is bad"); +RDCCOMPILE_ASSERT(sizeof(WrappedVkDispRes) == (sizeof(uint64_t)*3 + sizeof(uintptr_t)*2), "Wrapped resource struct has changed size! This is bad"); RDCCOMPILE_ASSERT(sizeof(WrappedVkNonDispRes) == sizeof(uint64_t)*3, "Wrapped resource struct has changed size! This is bad"); // VKTODOLOW check that the pool counts approximated below are good for typical applications @@ -312,7 +328,7 @@ template struct UnwrapHelper {}; { \ typedef WrappedVkDispRes ParentType; \ typedef CONCAT(Wrapped, vulkantype) Outer; \ - static vulkantype ToHandle(uint64_t real) { return (vulkantype) (uintptr_t)real; } \ + static RealVkRes ToRealRes(vulkantype real) { return RealVkRes((void *)real); } \ static Outer *FromHandle(vulkantype wrapped) { return (Outer *) wrapped; } \ }; @@ -321,7 +337,7 @@ template struct UnwrapHelper {}; { \ typedef WrappedVkNonDispRes ParentType; \ typedef CONCAT(Wrapped, vulkantype) Outer; \ - static vulkantype ToHandle(uint64_t real) { return vulkantype(real); } \ + static RealVkRes ToRealRes(vulkantype real) { return RealVkRes(real.handle); } \ static Outer *FromHandle(vulkantype wrapped) { return (Outer *) (uintptr_t)wrapped.handle; } \ }; @@ -389,7 +405,7 @@ RealType Unwrap(RealType obj) { if(obj == VK_NULL_HANDLE) return VK_NULL_HANDLE; - return UnwrapHelper::ToHandle(GetWrapped(obj)->real); + return GetWrapped(obj)->real.As(); } template @@ -411,7 +427,7 @@ VkResourceRecord *GetRecord(RealType obj) template RealType ToHandle(WrappedVkRes *ptr) { - return UnwrapHelper::ToHandle( ((typename UnwrapHelper::Outer *)ptr)->real ); + return ((typename UnwrapHelper::Outer *)ptr)->real.As(); } enum VkResourceType