void GLBufferObjectSet::flushDeletedGLBufferObjects(double /*currentTime*/, double& availableTime) { { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); if (!_pendingOrphanedGLBufferObjects.empty()) { // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl; handlePendingOrphandedGLBufferObjects(); } } if (_parent->getCurrGLBufferObjectPoolSize()<=_parent->getMaxGLBufferObjectPoolSize()) { OSG_INFO<<"Plenty of space in GLBufferObject pool"<<std::endl; return; } // if nothing to delete return if (_orphanedGLBufferObjects.empty()) return; // if no time available don't try to flush objects. if (availableTime<=0.0) return; unsigned int numDeleted = 0; unsigned int sizeRequired = _parent->getCurrGLBufferObjectPoolSize() - _parent->getMaxGLBufferObjectPoolSize(); unsigned int maxNumObjectsToDelete = static_cast<unsigned int>(ceil(double(sizeRequired) / double(_profile._size))); OSG_INFO<<"_parent->getCurrGLBufferObjectPoolSize()="<<_parent->getCurrGLBufferObjectPoolSize() <<" _parent->getMaxGLBufferObjectPoolSize()="<< _parent->getMaxGLBufferObjectPoolSize()<<std::endl; OSG_INFO<<"Looking to reclaim "<<sizeRequired<<", going to look to remove "<<maxNumObjectsToDelete<<" from "<<_orphanedGLBufferObjects.size()<<" orphans"<<std::endl; ElapsedTime timer; GLBufferObjectList::iterator itr = _orphanedGLBufferObjects.begin(); for(; itr != _orphanedGLBufferObjects.end() && timer.elapsedTime()<availableTime && numDeleted<maxNumObjectsToDelete; ++itr) { (*itr)->deleteGLObject(); ++numDeleted; } // OSG_NOTICE<<"Size before = "<<_orphanedGLBufferObjects.size(); _orphanedGLBufferObjects.erase(_orphanedGLBufferObjects.begin(), itr); // OSG_NOTICE<<", after = "<<_orphanedGLBufferObjects.size()<<" numDeleted = "<<numDeleted<<std::endl; // update the number of TO's in this GLBufferObjectSet _numOfGLBufferObjects -= numDeleted; _parent->setCurrGLBufferObjectPoolSize( _parent->getCurrGLBufferObjectPoolSize() - numDeleted*_profile._size ); // update the number of active and orphaned TextureObjects _parent->getNumberOrphanedGLBufferObjects() -= numDeleted; _parent->getNumberDeleted() += numDeleted; availableTime -= timer.elapsedTime(); }
void GLBufferObjectSet::flushDeletedGLBufferObjects(double currentTime, double& availableTime) { // if nothing to delete return if (_orphanedGLBufferObjects.empty()) return; // if no time available don't try to flush objects. if (availableTime<=0.0) return; // if we don't have too many orphaned texture objects then don't bother deleting them, as we can potentially reuse them later. if (_parent->getNumberOrphanedGLBufferObjects()<=s_minimumNumberOfGLBufferObjectsToRetainInCache) return; unsigned int numDeleted = 0; unsigned int maxNumObjectsToDelete = _parent->getNumberOrphanedGLBufferObjects()-s_minimumNumberOfGLBufferObjectsToRetainInCache; if (maxNumObjectsToDelete>4) maxNumObjectsToDelete = 4; ElapsedTime timer; GLBufferObjectList::iterator itr = _orphanedGLBufferObjects.begin(); for(; itr != _orphanedGLBufferObjects.end() && timer.elapsedTime()<availableTime && numDeleted<maxNumObjectsToDelete; ++itr) { (*itr)->deleteGLObject(); ++numDeleted; } // OSG_NOTIFY(osg::NOTICE)<<"Size before = "<<_orphanedGLBufferObjects.size(); _orphanedGLBufferObjects.erase(_orphanedGLBufferObjects.begin(), itr); //OSG_NOTIFY(osg::NOTICE)<<", after = "<<_orphanedGLBufferObjects.size()<<" numDeleted = "<<numDeleted<<std::endl; // update the number of TO's in this GLBufferObjectSet _numOfGLBufferObjects -= numDeleted; _parent->setCurrGLBufferObjectPoolSize( _parent->getCurrGLBufferObjectPoolSize() - numDeleted*_profile._size ); // update the number of active and orphaned TextureOjects _parent->getNumberOrphanedGLBufferObjects() -= numDeleted; _parent->getNumberActiveGLBufferObjects() += numDeleted; _parent->getNumberDeleted() += numDeleted; availableTime -= timer.elapsedTime(); }