Removed redundental vertex buffer object flush methods

This commit is contained in:
Robert Osfield 2008-01-21 11:36:54 +00:00
parent c33695d2e5
commit 6d3a90219c
4 changed files with 2 additions and 80 deletions

View File

@ -454,22 +454,6 @@ class OSG_EXPORT Drawable : public Object
* in the OpenGL context related to contextID.*/ * in the OpenGL context related to contextID.*/
static void flushDeletedDisplayLists(unsigned int contextID,double& availableTime); static void flushDeletedDisplayLists(unsigned int contextID,double& availableTime);
/** Use deleteVertexBufferObject instead of glDeleteBuffers to allow
* OpenGL buffer objects to be cached until they can be deleted
* by the OpenGL context in which they were created, specified
* by contextID.*/
static void deleteVertexBufferObject(unsigned int contextID,GLuint globj);
/** Flush all the cached vertex buffer objects which need to be deleted
* in the OpenGL context related to contextID.*/
static void flushDeletedVertexBufferObjects(unsigned int contextID,double currentTime, double& availableTime);
/** Flush all the cached vertex buffer objects which need to be deleted
* in the OpenGL context related to contextID.
* Note, unlike flush no OpenGL calls are made, instead the handles are all removed.
* this call is useful for when an OpenGL context has been destroyed. */
static void discardDeletedVertexBufferObjects(unsigned int contextID);
typedef unsigned int AttributeType; typedef unsigned int AttributeType;
enum AttributeTypes enum AttributeTypes

View File

@ -28,7 +28,7 @@
using namespace osg; using namespace osg;
// static cache of deleted display lists which can only // static cache of deleted buffer object lists which can only
// by completely deleted once the appropriate OpenGL context // by completely deleted once the appropriate OpenGL context
// is set. Used osg::BufferObject::deleteDisplayList(..) and flushDeletedBufferObjects(..) below. // is set. Used osg::BufferObject::deleteDisplayList(..) and flushDeletedBufferObjects(..) below.
typedef std::multimap<unsigned int,GLuint> DisplayListMap; typedef std::multimap<unsigned int,GLuint> DisplayListMap;

View File

@ -194,70 +194,11 @@ void Drawable::flushDeletedDisplayLists(unsigned int contextID, double& availabl
} }
elapsedTime = timer.delta_s(start_tick,timer.tick()); elapsedTime = timer.delta_s(start_tick,timer.tick());
// if (noDeleted) notify(NOTICE)<<"Number display lists deleted = "<<noDeleted<<" elapsed time"<<elapsedTime<<std::endl; if (noDeleted!=0) notify(INFO)<<"Number display lists deleted = "<<noDeleted<<" elapsed time"<<elapsedTime<<std::endl;
availableTime -= elapsedTime; availableTime -= elapsedTime;
} }
static OpenThreads::Mutex s_mutex_deletedVertexBufferObjectCache;
static DeletedDisplayListCache s_deletedVertexBufferObjectCache;
void Drawable::deleteVertexBufferObject(unsigned int contextID,GLuint globj)
{
if (globj!=0)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_mutex_deletedVertexBufferObjectCache);
// insert the globj into the cache for the appropriate context.
s_deletedVertexBufferObjectCache[contextID].insert(DisplayListMap::value_type(0,globj));
}
}
void Drawable::flushDeletedVertexBufferObjects(unsigned int contextID,double /*currentTime*/, double& availableTime)
{
// if no time available don't try to flush objects.
if (availableTime<=0.0) return;
const osg::Timer& timer = *osg::Timer::instance();
osg::Timer_t start_tick = timer.tick();
double elapsedTime = 0.0;
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_mutex_deletedVertexBufferObjectCache);
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)
{
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;
}
void Drawable::discardDeletedVertexBufferObjects(unsigned int contextID)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_mutex_deletedVertexBufferObjectCache);
DisplayListMap& dll = s_deletedVertexBufferObjectCache[contextID];
dll.clear();
}
Drawable::Drawable() Drawable::Drawable()
:Object(true) :Object(true)
{ {

View File

@ -25,7 +25,6 @@ void osg::flushDeletedGLObjects(unsigned int contextID, double currentTime, doub
{ {
osg::BufferObject::flushDeletedBufferObjects(contextID,currentTime,availableTime); osg::BufferObject::flushDeletedBufferObjects(contextID,currentTime,availableTime);
osg::Drawable::flushDeletedDisplayLists(contextID,availableTime); osg::Drawable::flushDeletedDisplayLists(contextID,availableTime);
osg::Drawable::flushDeletedVertexBufferObjects(contextID,currentTime,availableTime);
osg::FragmentProgram::flushDeletedFragmentProgramObjects(contextID,currentTime,availableTime); osg::FragmentProgram::flushDeletedFragmentProgramObjects(contextID,currentTime,availableTime);
osg::FrameBufferObject::flushDeletedFrameBufferObjects(contextID,currentTime,availableTime); osg::FrameBufferObject::flushDeletedFrameBufferObjects(contextID,currentTime,availableTime);
osg::Program::flushDeletedGlPrograms(contextID,currentTime,availableTime); osg::Program::flushDeletedGlPrograms(contextID,currentTime,availableTime);
@ -42,7 +41,6 @@ void osg::flushAllDeletedGLObjects(unsigned int contextID)
double availableTime = DBL_MAX; double availableTime = DBL_MAX;
osg::BufferObject::flushDeletedBufferObjects(contextID,currentTime,availableTime); osg::BufferObject::flushDeletedBufferObjects(contextID,currentTime,availableTime);
osg::Drawable::flushAllDeletedDisplayLists(contextID); osg::Drawable::flushAllDeletedDisplayLists(contextID);
osg::Drawable::flushDeletedVertexBufferObjects(contextID,currentTime,availableTime);
osg::FragmentProgram::flushDeletedFragmentProgramObjects(contextID,currentTime,availableTime); osg::FragmentProgram::flushDeletedFragmentProgramObjects(contextID,currentTime,availableTime);
osg::FrameBufferObject::flushDeletedFrameBufferObjects(contextID,currentTime,availableTime); osg::FrameBufferObject::flushDeletedFrameBufferObjects(contextID,currentTime,availableTime);
osg::Program::flushDeletedGlPrograms(contextID,currentTime,availableTime); osg::Program::flushDeletedGlPrograms(contextID,currentTime,availableTime);
@ -57,7 +55,6 @@ void osg::discardAllDeletedGLObjects(unsigned int contextID)
{ {
osg::BufferObject::discardDeletedBufferObjects(contextID); osg::BufferObject::discardDeletedBufferObjects(contextID);
osg::Drawable::discardAllDeletedDisplayLists(contextID); osg::Drawable::discardAllDeletedDisplayLists(contextID);
osg::Drawable::discardDeletedVertexBufferObjects(contextID);
osg::FragmentProgram::discardDeletedFragmentProgramObjects(contextID); osg::FragmentProgram::discardDeletedFragmentProgramObjects(contextID);
osg::FrameBufferObject::discardDeletedFrameBufferObjects(contextID); osg::FrameBufferObject::discardDeletedFrameBufferObjects(contextID);
osg::Program::discardDeletedGlPrograms(contextID); osg::Program::discardDeletedGlPrograms(contextID);