diff --git a/renderdoc/core/resource_manager.cpp b/renderdoc/core/resource_manager.cpp index bede48614..cb44f83c8 100644 --- a/renderdoc/core/resource_manager.cpp +++ b/renderdoc/core/resource_manager.cpp @@ -83,16 +83,6 @@ void ResourceRecord::Delete(ResourceRecordHandler *mgr) DeleteChunks(); - for(int i=0; i < NumSubResources; i++) - { - for(auto it=SubResources[i]->m_Chunks.begin(); it != SubResources[i]->m_Chunks.end(); ++it) - SAFE_DELETE(it->second); - - SAFE_DELETE(SubResources[i]); - } - - SAFE_DELETE_ARRAY(SubResources); - if(ResID != ResourceId()) mgr->RemoveResourceRecord(ResID); diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index 4f2c5cd21..29b14de31 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -89,8 +89,7 @@ struct ResourceRecord ResourceRecord(ResourceId id, bool lock) : RefCount(1), ResID(id), UpdateCount(0), DataInSerialiser(false), DataPtr(NULL), DataOffset(0), - Length(-1), DataWritten(false), SpecialResource(false), - NumSubResources(0), SubResources(NULL) + Length(-1), DataWritten(false), SpecialResource(false) { m_ChunkLock = NULL; @@ -152,12 +151,7 @@ struct ResourceRecord } if(!dataWritten) - { recordlist.insert(m_Chunks.begin(), m_Chunks.end()); - - for(int i=0; i < NumSubResources; i++) - SubResources[i]->Insert(recordlist); - } } void AddRef() { RefCount++; } @@ -255,9 +249,6 @@ struct ResourceRecord void SetDataPtr(byte *ptr) { DataPtr = ptr; - - for(int i=0; i < NumSubResources; i++) - SubResources[i]->SetDataPtr(ptr); } void MarkResourceFrameReferenced(ResourceId id, FrameRefType refType); @@ -268,20 +259,16 @@ struct ResourceRecord ids.insert(it->first); } - int UpdateCount; - - bool DataInSerialiser; int32_t Length; - bool SpecialResource; // like the swap chain back buffers + int UpdateCount : 29; + bool DataInSerialiser : 1; + bool SpecialResource : 1; // like the swap chain back buffers + bool DataWritten : 1; - int NumSubResources; - ResourceRecord **SubResources; - protected: byte *DataPtr; uint64_t DataOffset; - bool DataWritten; int RefCount; diff --git a/renderdoc/driver/d3d11/d3d11_manager.h b/renderdoc/driver/d3d11/d3d11_manager.h index 441700161..6b9087fd6 100644 --- a/renderdoc/driver/d3d11/d3d11_manager.h +++ b/renderdoc/driver/d3d11/d3d11_manager.h @@ -46,7 +46,8 @@ struct D3D11ResourceRecord : public ResourceRecord static byte markerValue[32]; D3D11ResourceRecord(ResourceId id) - : ResourceRecord(id, true) + : ResourceRecord(id, true), + NumSubResources(0), SubResources(NULL) { RDCEraseEl(ShadowPtr); RDCEraseEl(contexts); @@ -55,6 +56,14 @@ struct D3D11ResourceRecord : public ResourceRecord ~D3D11ResourceRecord() { + for(int i=0; i < NumSubResources; i++) + { + SubResources[i]->DeleteChunks(); + SAFE_DELETE(SubResources[i]); + } + + SAFE_DELETE_ARRAY(SubResources); + FreeShadowStorage(); } @@ -123,8 +132,42 @@ struct D3D11ResourceRecord : public ResourceRecord contexts[ctx] = false; } - bool ignoreSerialise; + void SetDataPtr(byte *ptr) + { + DataPtr = ptr; + for(int i=0; i < NumSubResources; i++) + SubResources[i]->SetDataPtr(ptr); + } + + void Insert(map &recordlist) + { + bool dataWritten = DataWritten; + + DataWritten = true; + + for(auto it = Parents.begin(); it != Parents.end(); ++it) + { + if(!(*it)->DataWritten) + { + (*it)->Insert(recordlist); + } + } + + if(!dataWritten) + { + recordlist.insert(m_Chunks.begin(), m_Chunks.end()); + + for(int i=0; i < NumSubResources; i++) + SubResources[i]->Insert(recordlist); + } + } + + bool ignoreSerialise; + + int NumSubResources; + ResourceRecord **SubResources; + private: byte *ShadowPtr[32][2]; size_t ShadowSize[32]; diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 3608a2bab..7b8a00f2b 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -754,16 +754,12 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) m_DeviceRecord = GetResourceManager()->AddResourceRecord(m_DeviceResourceID); m_DeviceRecord->DataInSerialiser = false; m_DeviceRecord->Length = 0; - m_DeviceRecord->NumSubResources = 0; m_DeviceRecord->SpecialResource = true; - m_DeviceRecord->SubResources = NULL; m_ContextRecord = GetResourceManager()->AddResourceRecord(m_ContextResourceID); m_ContextRecord->DataInSerialiser = false; m_ContextRecord->Length = 0; - m_ContextRecord->NumSubResources = 0; m_ContextRecord->SpecialResource = true; - m_ContextRecord->SubResources = NULL; // register VAO 0 as a special VAO, so that it can be tracked if the app uses it // we immediately mark it dirty since the vertex array tracking functions expect a proper VAO diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index d5eb35f9f..1f4c9c18d 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -306,9 +306,7 @@ WrappedVulkan::WrappedVulkan(const char *logFilename) m_FrameCaptureRecord = GetResourceManager()->AddResourceRecord(ResourceIDGen::GetNewUniqueID()); m_FrameCaptureRecord->DataInSerialiser = false; m_FrameCaptureRecord->Length = 0; - m_FrameCaptureRecord->NumSubResources = 0; m_FrameCaptureRecord->SpecialResource = true; - m_FrameCaptureRecord->SubResources = NULL; } else {