From e63f696ddb29aacff76b9aef4405fe48310e7a74 Mon Sep 17 00:00:00 2001 From: David McFarland Date: Fri, 29 Dec 2017 23:35:22 -0400 Subject: [PATCH] gl: Delete context owned resources from resource manager. This fixes tracking problems when a context id is reused. --- renderdoc/driver/gl/gl_driver.cpp | 2 ++ renderdoc/driver/gl/gl_manager.h | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) 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++)