diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 9cdcd10cb..2bc19228b 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -821,6 +821,8 @@ void WrappedOpenGL::DeleteContext(void *contextHandle) RenderDoc::Inst().RemoveDeviceFrameCapturer(ctxdata.ctx); + GetResourceManager()->DeleteContext(contextHandle); + if(ctxdata.built && ctxdata.ready) { if(ctxdata.Program) diff --git a/renderdoc/driver/gl/gl_manager.h b/renderdoc/driver/gl/gl_manager.h index 6fcc7fc88..4c82d1d40 100644 --- a/renderdoc/driver/gl/gl_manager.h +++ b/renderdoc/driver/gl/gl_manager.h @@ -92,6 +92,26 @@ public: ResourceManager::Shutdown(); } + void DeleteContext(void *context) + { + size_t count = 0; + for(auto it = m_CurrentResourceIds.begin(); it != m_CurrentResourceIds.end(); it++) + { + if(it->first.Context == context) + { + ++count; + ResourceId res = it->second; + MarkCleanResource(res); + if(HasResourceRecord(res)) + GetResourceRecord(res)->Delete(this); + ReleaseCurrentResource(it->second); + it = m_CurrentResourceIds.erase(it); + } + } + RDCDEBUG("Removed %zu/%zu resources belonging to context %p", count, + m_CurrentResourceIds.size(), context); + } + inline void RemoveResourceRecord(ResourceId id) { for(auto it = m_GLResourceRecords.begin(); it != m_GLResourceRecords.end(); it++)