/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #include #include #include using namespace osg; static ref_ptr s_createGraphicsContextCallback; void GraphicsContext::setCreateGraphicsContextCallback(CreateGraphicContexCallback* callback) { s_createGraphicsContextCallback = callback; } GraphicsContext::CreateGraphicContexCallback* GraphicsContext::getCreateGraphicsContextCallback() { return s_createGraphicsContextCallback.get(); } GraphicsContext* GraphicsContext::createGraphicsContext(Traits* traits) { if (s_createGraphicsContextCallback.valid()) return s_createGraphicsContextCallback->createGraphicsContext(traits); else return 0; } typedef std::map ContextIDMap; static ContextIDMap s_contextIDMap; static OpenThreads::Mutex s_contextIDMapMutex; unsigned int GraphicsContext::createNewContextID() { OpenThreads::ScopedLock 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 == 0) { // reuse contextID; itr->second = 1; osg::notify(osg::NOTICE)<<"GraphicsContext::createNewContextID() reusing contextID="<first<first; } } unsigned int contextID = s_contextIDMap.size(); s_contextIDMap[contextID] = 1; osg::notify(osg::INFO)<<"GraphicsContext::createNewContextID() creating contextID="< osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts() ) { osg::notify(osg::INFO)<<"Updating the MaxNumberOfGraphicsContexts to "<setMaxNumberOfGraphicsContexts( contextID + 1 ); } return contextID; } void GraphicsContext::incrementContextIDUsageCount(unsigned int contextID) { OpenThreads::ScopedLock lock(s_contextIDMapMutex); osg::notify(osg::INFO)<<"GraphicsContext::incrementContextIDUsageCount("< lock(s_contextIDMapMutex); if (s_contextIDMap[contextID]!=0) { --s_contextIDMap[contextID]; } else { osg::notify(osg::NOTICE)<<"Warning: decrementContextIDUsageCount("<getContextID()); } if (_closeOnDestruction) { close(); } } /** Realise the GraphicsContext.*/ bool GraphicsContext::realize() { if (realizeImplementation()) { if (_graphicsThread.valid() && !_graphicsThread->isRunning()) { _graphicsThread->startThread(); } return true; } else { return false; } } void GraphicsContext::close() { // switch off the graphics thread... setGraphicsThread(0); closeImplementation(); } void GraphicsContext::makeCurrent() { osg::notify(osg::NOTICE)<<"Doing GraphicsContext::makeCurrent"<<(unsigned int)OpenThreads::Thread::CurrentThread()<add(rcbmco); } if (!isCurrent()) _mutex.lock(); osg::notify(osg::NOTICE)<<"Calling GraphicsContext::makeCurrentImplementation"<<(unsigned int)OpenThreads::Thread::CurrentThread()<release(); } osg::notify(osg::NOTICE)<<"Done GraphicsContext::makeCurrentImplementation"<<(unsigned int)OpenThreads::Thread::CurrentThread()<add(new SwapBuffersOperation); } else { osg::notify(osg::NOTICE)<<"Doing GraphicsContext::swapBuffers() makeCurrent;swapBuffersImplementation;releaseContext"<<(unsigned int)OpenThreads::Thread::CurrentThread()<cancel(); _graphicsThread->_graphicsContext = 0; } _graphicsThread = gt; if (_graphicsThread.valid()) { _graphicsThread->_graphicsContext = this; if (!_graphicsThread->isRunning() && isRealized()) { _graphicsThread->startThread(); } } }