unsigned int GraphicsContext::createNewContextID() { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_contextIDMapMutex); // first check to see if we can reuse contextID; for(ContextIDMap::iterator itr = s_contextIDMap.begin(); itr != s_contextIDMap.end(); ++itr) { if (itr->second._numContexts == 0) { // reuse contextID; itr->second._numContexts = 1; OSG_INFO<<"GraphicsContext::createNewContextID() reusing contextID="<<itr->first<<std::endl; return itr->first; } } unsigned int contextID = s_contextIDMap.size(); s_contextIDMap[contextID]._numContexts = 1; OSG_INFO<<"GraphicsContext::createNewContextID() creating contextID="<<contextID<<std::endl; OSG_INFO<<"Updating the MaxNumberOfGraphicsContexts to "<<contextID+1<<std::endl; // update the the maximum number of graphics contexts, // to ensure that texture objects and display buffers are configured to the correct size. osg::DisplaySettings::instance()->setMaxNumberOfGraphicsContexts( contextID + 1 ); return contextID; }
GraphicsContext* GraphicsContext::getCompileContext(unsigned int contextID) { // OSG_NOTICE<<"GraphicsContext::getCompileContext "<<contextID<<std::endl; OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_contextIDMapMutex); ContextIDMap::iterator itr = s_contextIDMap.find(contextID); if (itr != s_contextIDMap.end()) return itr->second._compileContext.get(); else return 0; }
unsigned int GraphicsContext::getMaxContextID() { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_contextIDMapMutex); unsigned int maxContextID = 0; for(ContextIDMap::iterator itr = s_contextIDMap.begin(); itr != s_contextIDMap.end(); ++itr) { if (itr->first > maxContextID) maxContextID = itr->first; } return maxContextID; }
ContextData* osg::getContextData(unsigned int contextID) { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_contextIDMapMutex); ContextIDMap::iterator itr = s_contextIDMap.find(contextID); return (itr!=s_contextIDMap.end()) ? itr->second.get() : 0; }