Cleaned up per context buffers support
This commit is contained in:
@@ -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; }
|
||||
|
||||
@@ -719,7 +719,7 @@ class OSG_EXPORT Texture : public osg::StateAttribute
|
||||
};
|
||||
|
||||
typedef std::list< ref_ptr<TextureObject> > TextureObjectList;
|
||||
typedef std::map<unsigned int, TextureObjectList > TextureObjectListMap;
|
||||
typedef osg::buffered_object<TextureObjectList> TextureObjectListMap;
|
||||
|
||||
/** Takes the active texture objects from the Texture and places them
|
||||
* in the specified TextureObjectListMap. */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<unsigned int,GLuint> DisplayListMap;
|
||||
typedef std::map<unsigned int,DisplayListMap> DeletedBufferObjectCache;
|
||||
typedef osg::buffered_object<DisplayListMap> 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<OpenThreads::Mutex> 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() && elapsedTime<availableTime;
|
||||
++ditr)
|
||||
{
|
||||
const Extensions* extensions = getExtensions(contextID,true);
|
||||
|
||||
unsigned int noDeleted = 0;
|
||||
|
||||
DisplayListMap& dll = citr->second;
|
||||
|
||||
DisplayListMap::iterator ditr=dll.begin();
|
||||
for(;
|
||||
ditr!=dll.end() && elapsedTime<availableTime;
|
||||
++ditr)
|
||||
{
|
||||
extensions->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 = "<<noDeleted<<std::endl;
|
||||
extensions->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 = "<<noDeleted<<std::endl;
|
||||
}
|
||||
|
||||
availableTime -= elapsedTime;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <osg/DisplaySettings>
|
||||
#include <osg/ArgumentParser>
|
||||
#include <osg/ApplicationUsage>
|
||||
#include <osg/Notify>
|
||||
#include <osg/ref_ptr>
|
||||
|
||||
#include <algorithm>
|
||||
@@ -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<<std::endl;
|
||||
return _maxNumOfGraphicsContexts;
|
||||
}
|
||||
|
||||
void DisplaySettings::setMinimumNumAccumBits(unsigned int red, unsigned int green, unsigned int blue, unsigned int alpha)
|
||||
{
|
||||
_minimumNumberAccumRedBits = red;
|
||||
|
||||
@@ -39,7 +39,7 @@ unsigned int Drawable::s_numberDeletedDrawablesInLastFrame = 0;
|
||||
// by completely deleted once the appropriate OpenGL context
|
||||
// is set. Used osg::Drawable::deleteDisplayList(..) and flushDeletedDisplayLists(..) below.
|
||||
typedef std::multimap<unsigned int,GLuint> DisplayListMap;
|
||||
typedef std::map<unsigned int,DisplayListMap> DeletedDisplayListCache;
|
||||
typedef osg::buffered_object<DisplayListMap> DeletedDisplayListCache;
|
||||
|
||||
static OpenThreads::Mutex s_mutex_deletedDisplayListCache;
|
||||
static DeletedDisplayListCache s_deletedDisplayListCache;
|
||||
@@ -103,20 +103,16 @@ void Drawable::flushAllDeletedDisplayLists(unsigned int contextID)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> 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<OpenThreads::Mutex> 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<availableTime && noDeleted<maxNumToDelete;
|
||||
++ditr)
|
||||
{
|
||||
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<availableTime && noDeleted<maxNumToDelete;
|
||||
++ditr)
|
||||
{
|
||||
glDeleteLists(ditr->second,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"<<std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (noDeleted+dll.size() != prev_size)
|
||||
{
|
||||
osg::notify(osg::WARN)<<"Error in delete"<<std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int prev_size = dll.size();
|
||||
|
||||
DisplayListMap::reverse_iterator ditr=dll.rbegin();
|
||||
unsigned int maxNumToDelete = (dll.size() > s_minimumNumberOfDisplayListsToRetainInCache) ? dll.size()-s_minimumNumberOfDisplayListsToRetainInCache : 0;
|
||||
for(;
|
||||
ditr!=dll.rend() && elapsedTime<availableTime && noDeleted<maxNumToDelete;
|
||||
++ditr)
|
||||
{
|
||||
unsigned int prev_size = dll.size();
|
||||
glDeleteLists(ditr->second,1);
|
||||
|
||||
DisplayListMap::reverse_iterator ditr=dll.rbegin();
|
||||
unsigned int maxNumToDelete = (dll.size() > s_minimumNumberOfDisplayListsToRetainInCache) ? dll.size()-s_minimumNumberOfDisplayListsToRetainInCache : 0;
|
||||
for(;
|
||||
ditr!=dll.rend() && elapsedTime<availableTime && noDeleted<maxNumToDelete;
|
||||
++ditr)
|
||||
{
|
||||
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.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"<<std::endl;
|
||||
}
|
||||
}
|
||||
if (noDeleted+dll.size() != prev_size)
|
||||
{
|
||||
osg::notify(osg::WARN)<<"Error in delete"<<std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
elapsedTime = timer.delta_s(start_tick,timer.tick());
|
||||
@@ -229,28 +220,24 @@ void Drawable::flushDeletedVertexBufferObjects(unsigned int contextID,double /*c
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> 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() && elapsedTime<availableTime;
|
||||
++ditr)
|
||||
{
|
||||
const Extensions* extensions = getExtensions(contextID,true);
|
||||
|
||||
unsigned int noDeleted = 0;
|
||||
|
||||
DisplayListMap& dll = citr->second;
|
||||
|
||||
DisplayListMap::iterator ditr=dll.begin();
|
||||
for(;
|
||||
ditr!=dll.end() && elapsedTime<availableTime;
|
||||
++ditr)
|
||||
{
|
||||
extensions->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 = "<<noDeleted<<std::endl;
|
||||
extensions->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 = "<<noDeleted<<std::endl;
|
||||
}
|
||||
|
||||
availableTime -= elapsedTime;
|
||||
|
||||
@@ -27,7 +27,7 @@ using namespace osg;
|
||||
// by completely deleted once the appropriate OpenGL context
|
||||
// is set.
|
||||
typedef std::list<GLuint> FragmentProgramObjectList;
|
||||
typedef std::map<unsigned int,FragmentProgramObjectList> DeletedFragmentProgramObjectCache;
|
||||
typedef osg::buffered_object<FragmentProgramObjectList> DeletedFragmentProgramObjectCache;
|
||||
|
||||
static OpenThreads::Mutex s_mutex_deletedFragmentProgramObjectCache;
|
||||
static DeletedFragmentProgramObjectCache s_deletedFragmentProgramObjectCache;
|
||||
@@ -56,21 +56,17 @@ void FragmentProgram::flushDeletedFragmentProgramObjects(unsigned int contextID,
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> 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() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
const Extensions* extensions = getExtensions(contextID,true);
|
||||
|
||||
FragmentProgramObjectList& vpol = citr->second;
|
||||
|
||||
for(FragmentProgramObjectList::iterator titr=vpol.begin();
|
||||
titr!=vpol.end() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
extensions->glDeletePrograms( 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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ FBOExtensions::FBOExtensions(unsigned int contextID)
|
||||
// be deleted in the correct GL context.
|
||||
|
||||
typedef std::list<GLuint> RenderBufferHandleList;
|
||||
typedef std::map<unsigned int, RenderBufferHandleList> DeletedRenderBufferCache;
|
||||
typedef osg::buffered_object<RenderBufferHandleList> 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<OpenThreads::Mutex> 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() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
RenderBufferHandleList& pList = citr->second;
|
||||
for(RenderBufferHandleList::iterator titr=pList.begin();
|
||||
titr!=pList.end() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
extensions->glDeleteRenderbuffersEXT(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<GLuint> FrameBufferObjectHandleList;
|
||||
typedef std::map<unsigned int, FrameBufferObjectHandleList> DeletedFrameBufferObjectCache;
|
||||
typedef osg::buffered_object<FrameBufferObjectHandleList> DeletedFrameBufferObjectCache;
|
||||
|
||||
static OpenThreads::Mutex s_mutex_deletedFrameBufferObjectCache;
|
||||
static DeletedFrameBufferObjectCache s_deletedFrameBufferObjectCache;
|
||||
@@ -500,18 +496,14 @@ void FrameBufferObject::flushDeletedFrameBufferObjects(unsigned int contextID,do
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> 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() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
FrameBufferObjectHandleList& pList = citr->second;
|
||||
for(FrameBufferObjectHandleList::iterator titr=pList.begin();
|
||||
titr!=pList.end() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
extensions->glDeleteFramebuffersEXT(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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -418,11 +418,10 @@ bool GL2Extensions::isGlslSupported() const
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Static array of per-context osg::GL2Extensions instances
|
||||
|
||||
typedef osg::buffered_value< osg::ref_ptr<GL2Extensions> > BufferedExtensions;
|
||||
typedef osg::buffered_object< osg::ref_ptr<GL2Extensions> > 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<GLuint> GlProgramHandleList;
|
||||
typedef std::map<unsigned int, GlProgramHandleList> DeletedGlProgramCache;
|
||||
typedef osg::buffered_object<GlProgramHandleList> 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<OpenThreads::Mutex> 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<OpenThreads::Mutex> 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() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
GlProgramHandleList& pList = citr->second;
|
||||
for(GlProgramHandleList::iterator titr=pList.begin();
|
||||
titr!=pList.end() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
extensions->glDeleteProgram( *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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ using namespace osg;
|
||||
// be deleted in the correct GL context.
|
||||
|
||||
typedef std::list<GLuint> GlShaderHandleList;
|
||||
typedef std::map<unsigned int, GlShaderHandleList> DeletedGlShaderCache;
|
||||
typedef osg::buffered_object<GlShaderHandleList> 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<OpenThreads::Mutex> 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() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
GlShaderHandleList& pList = citr->second;
|
||||
for(GlShaderHandleList::iterator titr=pList.begin();
|
||||
titr!=pList.end() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
extensions->glDeleteShader( *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;
|
||||
|
||||
@@ -191,12 +191,10 @@ void TextureObjectManager::addTextureObjects(Texture::TextureObjectListMap& tobl
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> 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<OpenThreads::Mutex> 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<OpenThreads::Mutex> 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() && elapsedTime<availableTime && tol.size()>s_minimumNumberOfTextureObjectsToRetainInCache && numObjectsDeleted<maxNumObjectsToDelete;
|
||||
)
|
||||
{
|
||||
if ((*itr)->_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() && elapsedTime<availableTime && tol.size()>s_minimumNumberOfTextureObjectsToRetainInCache && numObjectsDeleted<maxNumObjectsToDelete;
|
||||
)
|
||||
else
|
||||
{
|
||||
if ((*itr)->_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());
|
||||
|
||||
@@ -27,7 +27,7 @@ using namespace osg;
|
||||
// by completely deleted once the appropriate OpenGL context
|
||||
// is set.
|
||||
typedef std::list<GLuint> VertexProgramObjectList;
|
||||
typedef std::map<unsigned int,VertexProgramObjectList> DeletedVertexProgramObjectCache;
|
||||
typedef osg::buffered_object<VertexProgramObjectList> DeletedVertexProgramObjectCache;
|
||||
|
||||
static OpenThreads::Mutex s_mutex_deletedVertexProgramObjectCache;
|
||||
static DeletedVertexProgramObjectCache s_deletedVertexProgramObjectCache;
|
||||
@@ -56,22 +56,17 @@ void VertexProgram::flushDeletedVertexProgramObjects(unsigned int contextID,doub
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> 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() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
|
||||
const Extensions* extensions = getExtensions(contextID,true);
|
||||
|
||||
VertexProgramObjectList& vpol = citr->second;
|
||||
|
||||
for(VertexProgramObjectList::iterator titr=vpol.begin();
|
||||
titr!=vpol.end() && elapsedTime<availableTime;
|
||||
)
|
||||
{
|
||||
extensions->glDeletePrograms( 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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user