diff --git a/include/osg/DisplaySettings b/include/osg/DisplaySettings index 4318874c6..ad035304e 100644 --- a/include/osg/DisplaySettings +++ b/include/osg/DisplaySettings @@ -168,8 +168,8 @@ class OSG_EXPORT DisplaySettings : public osg::Referenced bool getAccumBuffer() const { return (_minimumNumberAccumRedBits+_minimumNumberAccumGreenBits+_minimumNumberAccumBlueBits+_minimumNumberAccumAlphaBits)!=0; } - void setMaxNumberOfGraphicsContexts(unsigned int num) { _maxNumOfGraphicsContexts = num; } - unsigned int getMaxNumberOfGraphicsContexts() const { return _maxNumOfGraphicsContexts; } + void setMaxNumberOfGraphicsContexts(unsigned int num); + unsigned int getMaxNumberOfGraphicsContexts() const; void setNumMultiSamples(unsigned int samples) { _numMultiSamples = samples; } unsigned int getNumMultiSamples() const { return _numMultiSamples; } diff --git a/include/osg/Texture b/include/osg/Texture index 8ba22880e..fca483562 100644 --- a/include/osg/Texture +++ b/include/osg/Texture @@ -719,7 +719,7 @@ class OSG_EXPORT Texture : public osg::StateAttribute }; typedef std::list< ref_ptr > TextureObjectList; - typedef std::map TextureObjectListMap; + typedef osg::buffered_object TextureObjectListMap; /** Takes the active texture objects from the Texture and places them * in the specified TextureObjectListMap. */ diff --git a/include/osg/buffered_value b/include/osg/buffered_value index 7eda1b55c..aad79b45b 100644 --- a/include/osg/buffered_value +++ b/include/osg/buffered_value @@ -31,6 +31,10 @@ class buffered_value _array(DisplaySettings::instance()->getMaxNumberOfGraphicsContexts(),0) {} + inline buffered_value(unsigned int size): + _array(size,0) + {} + buffered_value& operator = (const buffered_value& rhs) { _array = rhs._array; @@ -77,6 +81,10 @@ class buffered_object _array(DisplaySettings::instance()->getMaxNumberOfGraphicsContexts()) {} + inline buffered_object(unsigned int size): + _array(size) + {} + buffered_object& operator = (const buffered_object& rhs) { _array = rhs._array; diff --git a/src/osg/BufferObject.cpp b/src/osg/BufferObject.cpp index 88496a545..5aa7a132b 100644 --- a/src/osg/BufferObject.cpp +++ b/src/osg/BufferObject.cpp @@ -30,7 +30,7 @@ using namespace osg; // by completely deleted once the appropriate OpenGL context // is set. Used osg::BufferObject::deleteDisplayList(..) and flushDeletedBufferObjects(..) below. typedef std::multimap DisplayListMap; -typedef std::map DeletedBufferObjectCache; +typedef osg::buffered_object DeletedBufferObjectCache; static OpenThreads::Mutex s_mutex_deletedBufferObjectCache; static DeletedBufferObjectCache s_deletedBufferObjectCache; @@ -61,28 +61,24 @@ void BufferObject::flushDeletedBufferObjects(unsigned int contextID,double /*cur { OpenThreads::ScopedLock lock(s_mutex_deletedBufferObjectCache); - DeletedBufferObjectCache::iterator citr = s_deletedBufferObjectCache.find(contextID); - if (citr!=s_deletedBufferObjectCache.end()) + const Extensions* extensions = getExtensions(contextID,true); + + unsigned int noDeleted = 0; + + DisplayListMap& dll = s_deletedBufferObjectCache[contextID]; + + DisplayListMap::iterator ditr=dll.begin(); + for(; + ditr!=dll.end() && elapsedTimesecond; - - DisplayListMap::iterator ditr=dll.begin(); - for(; - ditr!=dll.end() && elapsedTimeglDeleteBuffers(1,&(ditr->second)); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - ++noDeleted; - } - if (ditr!=dll.begin()) dll.erase(dll.begin(),ditr); - - if (noDeleted!=0) notify(osg::INFO)<<"Number VBOs deleted = "<glDeleteBuffers(1,&(ditr->second)); + elapsedTime = timer.delta_s(start_tick,timer.tick()); + ++noDeleted; } + if (ditr!=dll.begin()) dll.erase(dll.begin(),ditr); + + if (noDeleted!=0) notify(osg::INFO)<<"Number VBOs deleted = "< #include #include +#include #include #include @@ -115,7 +116,7 @@ void DisplaySettings::setDefaults() _minimumNumberAccumBlueBits = 0; _minimumNumberAccumAlphaBits = 0; - _maxNumOfGraphicsContexts = 1; + _maxNumOfGraphicsContexts = 32; _numMultiSamples = 0; #ifdef __sgi @@ -124,6 +125,17 @@ void DisplaySettings::setDefaults() #endif } +void DisplaySettings::setMaxNumberOfGraphicsContexts(unsigned int num) +{ + _maxNumOfGraphicsContexts = num; +} + +unsigned int DisplaySettings::getMaxNumberOfGraphicsContexts() const +{ + // osg::notify(osg::NOTICE)<<"getMaxNumberOfGraphicsContexts()="<<_maxNumOfGraphicsContexts< DisplayListMap; -typedef std::map DeletedDisplayListCache; +typedef osg::buffered_object DeletedDisplayListCache; static OpenThreads::Mutex s_mutex_deletedDisplayListCache; static DeletedDisplayListCache s_deletedDisplayListCache; @@ -103,20 +103,16 @@ void Drawable::flushAllDeletedDisplayLists(unsigned int contextID) { OpenThreads::ScopedLock lock(s_mutex_deletedDisplayListCache); - DeletedDisplayListCache::iterator citr = s_deletedDisplayListCache.find(contextID); - if (citr!=s_deletedDisplayListCache.end()) - { - DisplayListMap& dll = citr->second; + DisplayListMap& dll = s_deletedDisplayListCache[contextID]; - for(DisplayListMap::iterator ditr=dll.begin(); - ditr!=dll.end(); - ++ditr) - { - glDeleteLists(ditr->second,1); - } - - dll.clear(); + for(DisplayListMap::iterator ditr=dll.begin(); + ditr!=dll.end(); + ++ditr) + { + glDeleteLists(ditr->second,1); } + + dll.clear(); } void Drawable::flushDeletedDisplayLists(unsigned int contextID, double& availableTime) @@ -133,63 +129,58 @@ void Drawable::flushDeletedDisplayLists(unsigned int contextID, double& availabl { OpenThreads::ScopedLock lock(s_mutex_deletedDisplayListCache); - DeletedDisplayListCache::iterator citr = s_deletedDisplayListCache.find(contextID); - if (citr!=s_deletedDisplayListCache.end()) + DisplayListMap& dll = s_deletedDisplayListCache[contextID]; + + bool trimFromFront = true; + if (trimFromFront) { - DisplayListMap& dll = citr->second; - - - bool trimFromFront = true; - if (trimFromFront) + unsigned int prev_size = dll.size(); + + DisplayListMap::iterator ditr=dll.begin(); + unsigned int maxNumToDelete = (dll.size() > s_minimumNumberOfDisplayListsToRetainInCache) ? dll.size()-s_minimumNumberOfDisplayListsToRetainInCache : 0; + for(; + ditr!=dll.end() && elapsedTime s_minimumNumberOfDisplayListsToRetainInCache) ? dll.size()-s_minimumNumberOfDisplayListsToRetainInCache : 0; - for(; - ditr!=dll.end() && elapsedTimesecond,1); + glDeleteLists(ditr->second,1); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - ++noDeleted; + elapsedTime = timer.delta_s(start_tick,timer.tick()); + ++noDeleted; - ++Drawable::s_numberDeletedDrawablesInLastFrame; - } + ++Drawable::s_numberDeletedDrawablesInLastFrame; + } - if (ditr!=dll.begin()) dll.erase(dll.begin(),ditr); + if (ditr!=dll.begin()) dll.erase(dll.begin(),ditr); - if (noDeleted+dll.size() != prev_size) - { - osg::notify(osg::WARN)<<"Error in delete"< s_minimumNumberOfDisplayListsToRetainInCache) ? dll.size()-s_minimumNumberOfDisplayListsToRetainInCache : 0; + for(; + ditr!=dll.rend() && elapsedTimesecond,1); - DisplayListMap::reverse_iterator ditr=dll.rbegin(); - unsigned int maxNumToDelete = (dll.size() > s_minimumNumberOfDisplayListsToRetainInCache) ? dll.size()-s_minimumNumberOfDisplayListsToRetainInCache : 0; - for(; - ditr!=dll.rend() && elapsedTimesecond,1); + elapsedTime = timer.delta_s(start_tick,timer.tick()); + ++noDeleted; - elapsedTime = timer.delta_s(start_tick,timer.tick()); - ++noDeleted; + ++Drawable::s_numberDeletedDrawablesInLastFrame; + } - ++Drawable::s_numberDeletedDrawablesInLastFrame; - } + if (ditr!=dll.rbegin()) dll.erase(ditr.base(),dll.end()); - if (ditr!=dll.rbegin()) dll.erase(ditr.base(),dll.end()); - - if (noDeleted+dll.size() != prev_size) - { - osg::notify(osg::WARN)<<"Error in delete"< lock(s_mutex_deletedVertexBufferObjectCache); - DeletedDisplayListCache::iterator citr = s_deletedVertexBufferObjectCache.find(contextID); - if (citr!=s_deletedVertexBufferObjectCache.end()) + const Extensions* extensions = getExtensions(contextID,true); + + unsigned int noDeleted = 0; + + DisplayListMap& dll = s_deletedVertexBufferObjectCache[contextID]; + + DisplayListMap::iterator ditr=dll.begin(); + for(; + ditr!=dll.end() && elapsedTimesecond; - - DisplayListMap::iterator ditr=dll.begin(); - for(; - ditr!=dll.end() && elapsedTimeglDeleteBuffers(1,&(ditr->second)); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - ++noDeleted; - } - if (ditr!=dll.begin()) dll.erase(dll.begin(),ditr); - - if (noDeleted!=0) notify(osg::INFO)<<"Number VBOs deleted = "<glDeleteBuffers(1,&(ditr->second)); + elapsedTime = timer.delta_s(start_tick,timer.tick()); + ++noDeleted; } + if (ditr!=dll.begin()) dll.erase(dll.begin(),ditr); + + if (noDeleted!=0) notify(osg::INFO)<<"Number VBOs deleted = "< FragmentProgramObjectList; -typedef std::map DeletedFragmentProgramObjectCache; +typedef osg::buffered_object DeletedFragmentProgramObjectCache; static OpenThreads::Mutex s_mutex_deletedFragmentProgramObjectCache; static DeletedFragmentProgramObjectCache s_deletedFragmentProgramObjectCache; @@ -56,21 +56,17 @@ void FragmentProgram::flushDeletedFragmentProgramObjects(unsigned int contextID, { OpenThreads::ScopedLock lock(s_mutex_deletedFragmentProgramObjectCache); - DeletedFragmentProgramObjectCache::iterator citr = s_deletedFragmentProgramObjectCache.find(contextID); - if (citr!=s_deletedFragmentProgramObjectCache.end()) + const Extensions* extensions = getExtensions(contextID,true); + + FragmentProgramObjectList& vpol = s_deletedFragmentProgramObjectCache[contextID]; + + for(FragmentProgramObjectList::iterator titr=vpol.begin(); + titr!=vpol.end() && elapsedTimesecond; - - for(FragmentProgramObjectList::iterator titr=vpol.begin(); - titr!=vpol.end() && elapsedTimeglDeletePrograms( 1L, &(*titr ) ); - titr = vpol.erase(titr); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - } + extensions->glDeletePrograms( 1L, &(*titr ) ); + titr = vpol.erase(titr); + elapsedTime = timer.delta_s(start_tick,timer.tick()); } } diff --git a/src/osg/FrameBufferObject.cpp b/src/osg/FrameBufferObject.cpp index 42da748b3..f52295251 100644 --- a/src/osg/FrameBufferObject.cpp +++ b/src/osg/FrameBufferObject.cpp @@ -85,7 +85,7 @@ FBOExtensions::FBOExtensions(unsigned int contextID) // be deleted in the correct GL context. typedef std::list RenderBufferHandleList; -typedef std::map DeletedRenderBufferCache; +typedef osg::buffered_object DeletedRenderBufferCache; static OpenThreads::Mutex s_mutex_deletedRenderBufferCache; static DeletedRenderBufferCache s_deletedRenderBufferCache; @@ -116,18 +116,14 @@ void RenderBuffer::flushDeletedRenderBuffers(unsigned int contextID,double /*cur { OpenThreads::ScopedLock lock(s_mutex_deletedRenderBufferCache); - DeletedRenderBufferCache::iterator citr = s_deletedRenderBufferCache.find(contextID); - if( citr != s_deletedRenderBufferCache.end() ) + RenderBufferHandleList& pList = s_deletedRenderBufferCache[contextID]; + for(RenderBufferHandleList::iterator titr=pList.begin(); + titr!=pList.end() && elapsedTimesecond; - for(RenderBufferHandleList::iterator titr=pList.begin(); - titr!=pList.end() && elapsedTimeglDeleteRenderbuffersEXT(1, &(*titr) ); - titr = pList.erase( titr ); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - } + extensions->glDeleteRenderbuffersEXT(1, &(*titr) ); + titr = pList.erase( titr ); + elapsedTime = timer.delta_s(start_tick,timer.tick()); } } @@ -469,7 +465,7 @@ int FrameBufferAttachment::compare(const FrameBufferAttachment &fa) const // be deleted in the correct GL context. typedef std::list FrameBufferObjectHandleList; -typedef std::map DeletedFrameBufferObjectCache; +typedef osg::buffered_object DeletedFrameBufferObjectCache; static OpenThreads::Mutex s_mutex_deletedFrameBufferObjectCache; static DeletedFrameBufferObjectCache s_deletedFrameBufferObjectCache; @@ -500,18 +496,14 @@ void FrameBufferObject::flushDeletedFrameBufferObjects(unsigned int contextID,do { OpenThreads::ScopedLock lock(s_mutex_deletedFrameBufferObjectCache); - DeletedFrameBufferObjectCache::iterator citr = s_deletedFrameBufferObjectCache.find(contextID); - if( citr != s_deletedFrameBufferObjectCache.end() ) + FrameBufferObjectHandleList& pList = s_deletedFrameBufferObjectCache[contextID]; + for(FrameBufferObjectHandleList::iterator titr=pList.begin(); + titr!=pList.end() && elapsedTimesecond; - for(FrameBufferObjectHandleList::iterator titr=pList.begin(); - titr!=pList.end() && elapsedTimeglDeleteFramebuffersEXT(1, &(*titr) ); - titr = pList.erase( titr ); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - } + extensions->glDeleteFramebuffersEXT(1, &(*titr) ); + titr = pList.erase( titr ); + elapsedTime = timer.delta_s(start_tick,timer.tick()); } } diff --git a/src/osg/Program.cpp b/src/osg/Program.cpp index 1b64c8f50..bb8893827 100644 --- a/src/osg/Program.cpp +++ b/src/osg/Program.cpp @@ -418,11 +418,10 @@ bool GL2Extensions::isGlslSupported() const /////////////////////////////////////////////////////////////////////////// // Static array of per-context osg::GL2Extensions instances -typedef osg::buffered_value< osg::ref_ptr > BufferedExtensions; +typedef osg::buffered_object< osg::ref_ptr > BufferedExtensions; static BufferedExtensions s_extensions; -GL2Extensions* -GL2Extensions::Get(unsigned int contextID, bool createIfNotInitalized) +GL2Extensions* GL2Extensions::Get(unsigned int contextID, bool createIfNotInitalized) { if (!s_extensions[contextID] && createIfNotInitalized) s_extensions[contextID] = new GL2Extensions(contextID); @@ -1872,7 +1871,7 @@ bool GL2Extensions::getAttribLocation( const char* attribName, GLuint& location // be deleted in the correct GL context. typedef std::list GlProgramHandleList; -typedef std::map DeletedGlProgramCache; +typedef osg::buffered_object DeletedGlProgramCache; static OpenThreads::Mutex s_mutex_deletedGlProgramCache; static DeletedGlProgramCache s_deletedGlProgramCache; @@ -1893,6 +1892,7 @@ void Program::flushDeletedGlPrograms(unsigned int contextID,double /*currentTime // if no time available don't try to flush objects. if (availableTime<=0.0) return; + OpenThreads::ScopedLock lock(s_mutex_deletedGlProgramCache); const GL2Extensions* extensions = GL2Extensions::Get(contextID,true); if( ! extensions->isGlslSupported() ) return; @@ -1901,20 +1901,15 @@ void Program::flushDeletedGlPrograms(unsigned int contextID,double /*currentTime double elapsedTime = 0.0; { - OpenThreads::ScopedLock lock(s_mutex_deletedGlProgramCache); - DeletedGlProgramCache::iterator citr = s_deletedGlProgramCache.find(contextID); - if( citr != s_deletedGlProgramCache.end() ) + GlProgramHandleList& pList = s_deletedGlProgramCache[contextID]; + for(GlProgramHandleList::iterator titr=pList.begin(); + titr!=pList.end() && elapsedTimesecond; - for(GlProgramHandleList::iterator titr=pList.begin(); - titr!=pList.end() && elapsedTimeglDeleteProgram( *titr ); - titr = pList.erase( titr ); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - } + extensions->glDeleteProgram( *titr ); + titr = pList.erase( titr ); + elapsedTime = timer.delta_s(start_tick,timer.tick()); } } diff --git a/src/osg/Shader.cpp b/src/osg/Shader.cpp index dea0c9c32..93f29ead6 100644 --- a/src/osg/Shader.cpp +++ b/src/osg/Shader.cpp @@ -38,7 +38,7 @@ using namespace osg; // be deleted in the correct GL context. typedef std::list GlShaderHandleList; -typedef std::map DeletedGlShaderCache; +typedef osg::buffered_object DeletedGlShaderCache; static OpenThreads::Mutex s_mutex_deletedGlShaderCache; static DeletedGlShaderCache s_deletedGlShaderCache; @@ -69,18 +69,14 @@ void Shader::flushDeletedGlShaders(unsigned int contextID,double /*currentTime*/ { OpenThreads::ScopedLock lock(s_mutex_deletedGlShaderCache); - DeletedGlShaderCache::iterator citr = s_deletedGlShaderCache.find(contextID); - if( citr != s_deletedGlShaderCache.end() ) + GlShaderHandleList& pList = s_deletedGlShaderCache[contextID]; + for(GlShaderHandleList::iterator titr=pList.begin(); + titr!=pList.end() && elapsedTimesecond; - for(GlShaderHandleList::iterator titr=pList.begin(); - titr!=pList.end() && elapsedTimeglDeleteShader( *titr ); - titr = pList.erase( titr ); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - } + extensions->glDeleteShader( *titr ); + titr = pList.erase( titr ); + elapsedTime = timer.delta_s(start_tick,timer.tick()); } } @@ -193,7 +189,7 @@ const char* Shader::getTypename() const } -/*static*/ Shader::Type Shader::getTypeId( const std::string& tname ) +Shader::Type Shader::getTypeId( const std::string& tname ) { if( tname == "VERTEX" ) return VERTEX; if( tname == "FRAGMENT" ) return FRAGMENT; diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index 0a3ff162a..da3d17f34 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -191,12 +191,10 @@ void TextureObjectManager::addTextureObjects(Texture::TextureObjectListMap& tobl { OpenThreads::ScopedLock lock(_mutex); - for(Texture::TextureObjectListMap::iterator itr = toblm.begin(); - itr != toblm.end(); - ++itr) + for(unsigned int i=0; i< toblm.size(); ++i) { - Texture::TextureObjectList& tol = _textureObjectListMap[itr->first]; - tol.insert(tol.end(),itr->second.begin(),itr->second.end()); + Texture::TextureObjectList& tol = _textureObjectListMap[i]; + tol.insert(tol.end(),toblm[i].begin(),toblm[i].end()); } } @@ -211,19 +209,15 @@ void TextureObjectManager::flushAllTextureObjects(unsigned int contextID) { OpenThreads::ScopedLock lock(_mutex); - Texture::TextureObjectListMap::iterator tmitr = _textureObjectListMap.find(contextID); - if (tmitr!=_textureObjectListMap.end()) - { - Texture::TextureObjectList& tol = tmitr->second; + Texture::TextureObjectList& tol = _textureObjectListMap[contextID]; - for(Texture::TextureObjectList::iterator itr=tol.begin(); - itr!=tol.end(); - ++itr) - { - glDeleteTextures( 1L, &((*itr)->_id)); - } - tol.clear(); + for(Texture::TextureObjectList::iterator itr=tol.begin(); + itr!=tol.end(); + ++itr) + { + glDeleteTextures( 1L, &((*itr)->_id)); } + tol.clear(); } void TextureObjectManager::flushTextureObjects(unsigned int contextID,double currentTime, double& availableTime) @@ -242,43 +236,38 @@ void TextureObjectManager::flushTextureObjects(unsigned int contextID,double cur { OpenThreads::ScopedLock lock(_mutex); - Texture::TextureObjectListMap::iterator tmitr = _textureObjectListMap.find(contextID); - if (tmitr!=_textureObjectListMap.end()) + Texture::TextureObjectList& tol = _textureObjectListMap[contextID]; + + // reset the time of any uninitialized objects. + Texture::TextureObjectList::iterator itr; + for(itr=tol.begin(); + itr!=tol.end(); + ++itr) { - Texture::TextureObjectList& tol = tmitr->second; + if ((*itr)->_timeStamp==0.0) (*itr)->_timeStamp=currentTime; + } - // reset the time of any uninitialized objects. - Texture::TextureObjectList::iterator itr; - for(itr=tol.begin(); - itr!=tol.end(); - ++itr) + double expiryTime = currentTime-_expiryDelay; + + for(itr=tol.begin(); + itr!=tol.end() && elapsedTimes_minimumNumberOfTextureObjectsToRetainInCache && numObjectsDeleted_timeStamp<=expiryTime) { - if ((*itr)->_timeStamp==0.0) (*itr)->_timeStamp=currentTime; + --s_number; + ++Texture::s_numberDeletedTextureInLastFrame; + + glDeleteTextures( 1L, &((*itr)->_id)); + itr = tol.erase(itr); + ++numTexturesDeleted; + ++numObjectsDeleted; } - - double expiryTime = currentTime-_expiryDelay; - - for(itr=tol.begin(); - itr!=tol.end() && elapsedTimes_minimumNumberOfTextureObjectsToRetainInCache && numObjectsDeleted_timeStamp<=expiryTime) - { - --s_number; - ++Texture::s_numberDeletedTextureInLastFrame; - - glDeleteTextures( 1L, &((*itr)->_id)); - itr = tol.erase(itr); - ++numTexturesDeleted; - ++numObjectsDeleted; - } - else - { - ++itr; - } - elapsedTime = timer.delta_s(start_tick,timer.tick()); + ++itr; } - + elapsedTime = timer.delta_s(start_tick,timer.tick()); } } elapsedTime = timer.delta_s(start_tick,timer.tick()); diff --git a/src/osg/VertexProgram.cpp b/src/osg/VertexProgram.cpp index a6c8e4e8f..0323d0f88 100644 --- a/src/osg/VertexProgram.cpp +++ b/src/osg/VertexProgram.cpp @@ -27,7 +27,7 @@ using namespace osg; // by completely deleted once the appropriate OpenGL context // is set. typedef std::list VertexProgramObjectList; -typedef std::map DeletedVertexProgramObjectCache; +typedef osg::buffered_object DeletedVertexProgramObjectCache; static OpenThreads::Mutex s_mutex_deletedVertexProgramObjectCache; static DeletedVertexProgramObjectCache s_deletedVertexProgramObjectCache; @@ -56,22 +56,17 @@ void VertexProgram::flushDeletedVertexProgramObjects(unsigned int contextID,doub { OpenThreads::ScopedLock lock(s_mutex_deletedVertexProgramObjectCache); - DeletedVertexProgramObjectCache::iterator citr = s_deletedVertexProgramObjectCache.find(contextID); - if (citr!=s_deletedVertexProgramObjectCache.end()) + const Extensions* extensions = getExtensions(contextID,true); + + VertexProgramObjectList& vpol = s_deletedVertexProgramObjectCache[contextID]; + + for(VertexProgramObjectList::iterator titr=vpol.begin(); + titr!=vpol.end() && elapsedTimesecond; - - for(VertexProgramObjectList::iterator titr=vpol.begin(); - titr!=vpol.end() && elapsedTimeglDeletePrograms( 1L, &(*titr ) ); - titr = vpol.erase(titr); - elapsedTime = timer.delta_s(start_tick,timer.tick()); - } + extensions->glDeletePrograms( 1L, &(*titr ) ); + titr = vpol.erase(titr); + elapsedTime = timer.delta_s(start_tick,timer.tick()); } } diff --git a/src/osgProducer/OsgCameraGroup.cpp b/src/osgProducer/OsgCameraGroup.cpp index cc1251a3f..e433a80b5 100644 --- a/src/osgProducer/OsgCameraGroup.cpp +++ b/src/osgProducer/OsgCameraGroup.cpp @@ -266,12 +266,7 @@ void OsgCameraGroup::_init() } - // initialize the number of graphics contexts to set up if there arn't already enough. - if (osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts() < numContexts) - { - osg::DisplaySettings::instance()->setMaxNumberOfGraphicsContexts(numContexts); - } - + osg::DisplaySettings::instance()->setMaxNumberOfGraphicsContexts(numContexts); if ((_threadModel==ThreadPerCamera || _threadModel==ThreadPerRenderSurface) && _cfg->getNumberOfCameras()>1) {