2525#include < osg/PrimitiveSet>
2626#include < osg/Array>
2727#include < osg/ContextData>
28+ #include < osg/Stats>
2829
2930#include < OpenThreads/ScopedLock>
3031#include < OpenThreads/Mutex>
3738
3839using namespace osg ;
3940
41+ namespace
42+ {
43+
44+ template <class Iterator , class Map >
45+ Iterator eraseIfEmpty (Iterator it, Map& map)
46+ {
47+ if (it->second ->getNumOfGLBufferObjects () == 0 )
48+ return map.erase (it);
49+ return ++it;
50+ }
51+
52+ }
53+
4054// ////////////////////////////////////////////////////////////////////////////////////////////////////
4155//
4256// GLBufferObject::BufferEntry
@@ -351,7 +365,7 @@ void GLBufferObjectSet::handlePendingOrphandedGLBufferObjects()
351365
352366 unsigned int numOrphaned = _pendingOrphanedGLBufferObjects.size ();
353367
354- for (GLBufferObjectList ::iterator itr = _pendingOrphanedGLBufferObjects.begin ();
368+ for (GLBufferObjectVector ::iterator itr = _pendingOrphanedGLBufferObjects.begin ();
355369 itr != _pendingOrphanedGLBufferObjects.end ();
356370 ++itr)
357371 {
@@ -368,6 +382,7 @@ void GLBufferObjectSet::handlePendingOrphandedGLBufferObjects()
368382 _parent->getNumberActiveGLBufferObjects () -= numOrphaned;
369383
370384 _pendingOrphanedGLBufferObjects.clear ();
385+ _pendingOrphanedGLBufferObjectsSize.exchange (0 );
371386
372387 CHECK_CONSISTENCY
373388}
@@ -376,13 +391,11 @@ void GLBufferObjectSet::deleteAllGLBufferObjects()
376391{
377392 // OSG_NOTICE<<"GLBufferObjectSet::deleteAllGLBufferObjects()"<<std::endl;
378393
394+ if (_pendingOrphanedGLBufferObjectsSize != 0 )
379395 {
380396 OpenThreads::ScopedLock<OpenThreads::Mutex> lock (_mutex);
381- if (!_pendingOrphanedGLBufferObjects.empty ())
382- {
383- // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl;
384- handlePendingOrphandedGLBufferObjects ();
385- }
397+ // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl;
398+ handlePendingOrphandedGLBufferObjects ();
386399 }
387400
388401 CHECK_CONSISTENCY
@@ -455,13 +468,11 @@ void GLBufferObjectSet::discardAllGLBufferObjects()
455468
456469void GLBufferObjectSet::flushAllDeletedGLBufferObjects ()
457470{
471+ if (_pendingOrphanedGLBufferObjectsSize != 0 )
458472 {
459473 OpenThreads::ScopedLock<OpenThreads::Mutex> lock (_mutex);
460- if (!_pendingOrphanedGLBufferObjects.empty ())
461- {
462- // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl;
463- handlePendingOrphandedGLBufferObjects ();
464- }
474+ // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl;
475+ handlePendingOrphandedGLBufferObjects ();
465476 }
466477
467478 for (GLBufferObjectList::iterator itr = _orphanedGLBufferObjects.begin ();
@@ -487,13 +498,11 @@ void GLBufferObjectSet::discardAllDeletedGLBufferObjects()
487498 // OSG_NOTICE<<"GLBufferObjectSet::discardAllDeletedGLBufferObjects()"<<std::endl;
488499
489500 // clean up the pending orphans.
501+ if (_pendingOrphanedGLBufferObjectsSize != 0 )
490502 {
491503 OpenThreads::ScopedLock<OpenThreads::Mutex> lock (_mutex);
492- if (!_pendingOrphanedGLBufferObjects.empty ())
493- {
494- // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl;
495- handlePendingOrphandedGLBufferObjects ();
496- }
504+ // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl;
505+ handlePendingOrphandedGLBufferObjects ();
497506 }
498507
499508 unsigned int numDiscarded = _orphanedGLBufferObjects.size ();
@@ -514,13 +523,11 @@ void GLBufferObjectSet::discardAllDeletedGLBufferObjects()
514523
515524void GLBufferObjectSet::flushDeletedGLBufferObjects (double /* currentTime*/ , double & availableTime)
516525{
526+ if (_pendingOrphanedGLBufferObjectsSize != 0 )
517527 {
518528 OpenThreads::ScopedLock<OpenThreads::Mutex> lock (_mutex);
519- if (!_pendingOrphanedGLBufferObjects.empty ())
520- {
521- // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl;
522- handlePendingOrphandedGLBufferObjects ();
523- }
529+ // OSG_NOTICE<<"GLBufferObjectSet::flushDeletedGLBufferObjects(..) handling orphans"<<std::endl;
530+ handlePendingOrphandedGLBufferObjects ();
524531 }
525532
526533 if (_parent->getCurrGLBufferObjectPoolSize ()<=_parent->getMaxGLBufferObjectPoolSize ())
@@ -574,11 +581,8 @@ bool GLBufferObjectSet::makeSpace(unsigned int& size)
574581{
575582 {
576583 OpenThreads::ScopedLock<OpenThreads::Mutex> lock (_mutex);
577- if (!_pendingOrphanedGLBufferObjects.empty ())
578- {
579- // OSG_NOTICE<<"GLBufferSet::::makeSpace(..) handling orphans"<<std::endl;
580- handlePendingOrphandedGLBufferObjects ();
581- }
584+ // OSG_NOTICE<<"GLBufferSet::::makeSpace(..) handling orphans"<<std::endl;
585+ handlePendingOrphandedGLBufferObjects ();
582586 }
583587
584588 if (!_orphanedGLBufferObjects.empty ())
@@ -795,6 +799,7 @@ void GLBufferObjectSet::orphan(GLBufferObject* to)
795799 // list. This double buffered approach to handling orphaned TO's is used
796800 // to avoid having to mutex the process of appling active TO's.
797801 _pendingOrphanedGLBufferObjects.push_back (to);
802+ ++_pendingOrphanedGLBufferObjectsSize;
798803}
799804
800805void GLBufferObjectSet::remove (GLBufferObject* to)
@@ -936,10 +941,10 @@ void GLBufferObjectManager::deleteAllGLObjects()
936941 ElapsedTime elapsedTime (&(getDeleteTime ()));
937942
938943 for (GLBufferObjectSetMap::iterator itr = _glBufferObjectSetMap.begin ();
939- itr != _glBufferObjectSetMap.end ();
940- ++itr)
944+ itr != _glBufferObjectSetMap.end ();)
941945 {
942946 (*itr).second ->deleteAllGLBufferObjects ();
947+ itr = eraseIfEmpty (itr, _glBufferObjectSetMap);
943948 }
944949}
945950
@@ -951,27 +956,28 @@ void GLBufferObjectManager::discardAllGLObjects()
951956 {
952957 (*itr).second ->discardAllGLBufferObjects ();
953958 }
959+ _glBufferObjectSetMap.clear ();
954960}
955961
956962void GLBufferObjectManager::flushAllDeletedGLObjects ()
957963{
958964 ElapsedTime elapsedTime (&(getDeleteTime ()));
959965
960966 for (GLBufferObjectSetMap::iterator itr = _glBufferObjectSetMap.begin ();
961- itr != _glBufferObjectSetMap.end ();
962- ++itr)
967+ itr != _glBufferObjectSetMap.end ();)
963968 {
964969 (*itr).second ->flushAllDeletedGLBufferObjects ();
970+ itr = eraseIfEmpty (itr, _glBufferObjectSetMap);
965971 }
966972}
967973
968974void GLBufferObjectManager::discardAllDeletedGLObjects ()
969975{
970976 for (GLBufferObjectSetMap::iterator itr = _glBufferObjectSetMap.begin ();
971- itr != _glBufferObjectSetMap.end ();
972- ++itr)
977+ itr != _glBufferObjectSetMap.end ();)
973978 {
974979 (*itr).second ->discardAllDeletedGLBufferObjects ();
980+ itr = eraseIfEmpty (itr, _glBufferObjectSetMap);
975981 }
976982}
977983
@@ -980,10 +986,10 @@ void GLBufferObjectManager::flushDeletedGLObjects(double currentTime, double& av
980986 ElapsedTime elapsedTime (&(getDeleteTime ()));
981987
982988 for (GLBufferObjectSetMap::iterator itr = _glBufferObjectSetMap.begin ();
983- (itr != _glBufferObjectSetMap.end ()) && (availableTime > 0.0 );
984- ++itr)
989+ (itr != _glBufferObjectSetMap.end ()) && (availableTime > 0.0 );)
985990 {
986991 (*itr).second ->flushDeletedGLBufferObjects (currentTime, availableTime);
992+ itr = eraseIfEmpty (itr, _glBufferObjectSetMap);
987993 }
988994}
989995
@@ -1051,6 +1057,11 @@ void GLBufferObjectManager::recomputeStats(std::ostream& out) const
10511057 out<<" getMaxGLBufferObjectPoolSize()=" <<getMaxGLBufferObjectPoolSize ()<<" current/max size = " <<double (currentSize)/double (getMaxGLBufferObjectPoolSize ())<<std::endl;
10521058}
10531059
1060+ void GLBufferObjectManager::reportStats (unsigned frameNumber, Stats& stats) const
1061+ {
1062+ stats.setAttribute (frameNumber, " GLBufferObjectManager" + std::to_string (_contextID), static_cast <double >(_glBufferObjectSetMap.size ()));
1063+ }
1064+
10541065// ////////////////////////////////////////////////////////////////////////////////////////////////////
10551066//
10561067// BufferObject
0 commit comments