From 82008d5ecdd7cd9a819814c9a028cd637ae10a3b Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 15 Jul 2003 21:19:03 +0000 Subject: [PATCH] Updates to the flush rendering objects function calls to allow for managment of amount of time available to do gl delete's. This control is required for constant frame rate applications. --- include/osg/Drawable | 4 ++-- include/osg/Texture | 7 ++++++- include/osg/Timer | 3 +++ include/osg/VertexProgram | 2 +- include/osgProducer/DatabasePager | 9 +-------- src/osg/Drawable.cpp | 4 ++-- src/osg/Texture.cpp | 10 +++++++--- src/osg/Texture2D.cpp | 2 +- src/osg/Timer.cpp | 7 +++++++ src/osg/VertexProgram.cpp | 2 +- src/osgProducer/DatabasePager.cpp | 18 +++++++++--------- src/osgProducer/Viewer.cpp | 4 +++- src/osgUtil/SceneView.cpp | 20 ++++++++++++++------ 13 files changed, 57 insertions(+), 35 deletions(-) diff --git a/include/osg/Drawable b/include/osg/Drawable index 8afeb7ba1..07680a10c 100644 --- a/include/osg/Drawable +++ b/include/osg/Drawable @@ -304,7 +304,7 @@ class SG_EXPORT Drawable : public Object /** flush all the cached display list which need to be deleted * in the OpenGL context related to contextID.*/ - static void flushDeletedDisplayLists(unsigned int contextID); + static void flushDeletedDisplayLists(unsigned int contextID,double currentTime, double& availableTime); /** use deleteVertexBufferObject instead of glDeleteList to allow * OpenGL buffer objects to cached until they can be deleted @@ -314,7 +314,7 @@ class SG_EXPORT Drawable : public Object /** 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); + static void flushDeletedVertexBufferObjects(unsigned int contextID,double currentTime, double& availableTime); typedef unsigned int AttributeType; diff --git a/include/osg/Texture b/include/osg/Texture index 05172fe27..8d0521c36 100644 --- a/include/osg/Texture +++ b/include/osg/Texture @@ -523,8 +523,12 @@ class SG_EXPORT Texture : public osg::StateAttribute virtual void addTextureObjectsFrom(Texture& texture); - virtual void deleteTextureObjects(unsigned int contextID,double currentTime); + virtual void flushTextureObjects(unsigned int contextID,double currentTime, double& availableTime); + + void setExpiryDelay(double expiryDelay) { _expiryDelay = expiryDelay; } + + double getExpiryDelay() const { return _expiryDelay; } // how long to keep unsed texture objects around for before deleting. double _expiryDelay; @@ -536,6 +540,7 @@ class SG_EXPORT Texture : public osg::StateAttribute static void setTextureObjectManager(TextureObjectManager* tom); static TextureObjectManager* getTextureObjectManager(); + static void flushTextureObjects(unsigned int contextID,double currentTime, double& availableTime); diff --git a/include/osg/Timer b/include/osg/Timer index f605167e6..0604eefcc 100644 --- a/include/osg/Timer +++ b/include/osg/Timer @@ -54,6 +54,9 @@ class SG_EXPORT Timer { Timer(); ~Timer() {} + static const Timer* instance(); + + #if defined __DARWIN_OSX__ || defined macintosh // PJA MAC OSX - inline Tick() pollutes namespace so badly // we cant compile, due to Carbon.h ... diff --git a/include/osg/VertexProgram b/include/osg/VertexProgram index afc456b60..567827470 100644 --- a/include/osg/VertexProgram +++ b/include/osg/VertexProgram @@ -188,7 +188,7 @@ class SG_EXPORT VertexProgram : public StateAttribute /** flush all the cached vertex programs which need to be deleted * in the OpenGL context related to contextID.*/ - static void flushDeletedVertexProgramObjects(unsigned int contextID); + static void flushDeletedVertexProgramObjects(unsigned int contextID,double currentTime, double& availableTime); virtual void apply(State& state) const; diff --git a/include/osgProducer/DatabasePager b/include/osgProducer/DatabasePager index 70ced52f9..4b33ab74e 100644 --- a/include/osgProducer/DatabasePager +++ b/include/osgProducer/DatabasePager @@ -80,15 +80,9 @@ class OSGPRODUCER_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseReques /** Get whether the compilation of rendering objects for specfied graphics context on (true) or off(false).*/ bool getCompileRenderingObjectsForContexID(unsigned int contextID); - /* Set the maximum amount of time available for compile rendering objects. */ - void setMaximumTimeForCompilingRenderingObjects(double time) { _maximumTimeForCompiling = time; } - - /* Get the maximum amount of time available for compile rendering objects. */ - double getMaximumTimeForCompilingRenderingObjects() const { return _maximumTimeForCompiling; } - /** Compile the rendering objects (display lists,texture objects, VBO's) on loaded subgraph. * note, should only be called from the draw thread.*/ - void compileRenderingObjects(osg::State& state); + void compileRenderingObjects(osg::State& state,double& availableTime); public: @@ -141,7 +135,6 @@ class OSGPRODUCER_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseReques double _expiryDelay; - double _maximumTimeForCompiling; ActiveGraphicsContexts _activeGraphicsContexts; }; diff --git a/src/osg/Drawable.cpp b/src/osg/Drawable.cpp index 46321cd98..73f5f857f 100644 --- a/src/osg/Drawable.cpp +++ b/src/osg/Drawable.cpp @@ -45,7 +45,7 @@ void Drawable::deleteDisplayList(unsigned int contextID,GLuint globj) /** flush all the cached display list which need to be deleted * in the OpenGL context related to contextID.*/ -void Drawable::flushDeletedDisplayLists(unsigned int contextID) +void Drawable::flushDeletedDisplayLists(unsigned int contextID,double currentTime, double& availableTime) { DeletedDisplayListCache::iterator citr = s_deletedDisplayListCache.find(contextID); if (citr!=s_deletedDisplayListCache.end()) @@ -77,7 +77,7 @@ void Drawable::deleteVertexBufferObject(unsigned int contextID,GLuint globj) /** flush all the cached display list which need to be deleted * in the OpenGL context related to contextID.*/ -void Drawable::flushDeletedVertexBufferObjects(unsigned int contextID) +void Drawable::flushDeletedVertexBufferObjects(unsigned int contextID,double currentTime, double& availableTime) { DeletedDisplayListCache::iterator citr = s_deletedVertexBufferObjectCache.find(contextID); if (citr!=s_deletedVertexBufferObjectCache.end()) diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index 5ccded03a..2b4144384 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -95,7 +95,7 @@ void Texture::TextureObjectManager::addTextureObjectsFrom(Texture& texture) texture.takeTextureObjects(_textureObjectListMap); } -void Texture::TextureObjectManager::deleteTextureObjects(unsigned int contextID,double currentTime) +void Texture::TextureObjectManager::flushTextureObjects(unsigned int contextID,double currentTime, double& availbleTime) { TextureObjectList& tol = _textureObjectListMap[contextID]; @@ -145,6 +145,10 @@ Texture::TextureObjectManager* Texture::getTextureObjectManager() return s_textureObjectManager.get(); } +void Texture::flushTextureObjects(unsigned int contextID,double currentTime, double& availbleTime) +{ + getTextureObjectManager()->flushTextureObjects(contextID, currentTime, availbleTime); +} Texture::Texture(): _wrap_s(CLAMP), @@ -836,7 +840,7 @@ void Texture::applyTexImage2D_subload(State& state, GLenum target, const Image* size = ((width+3)/4)*((height+3)/4)*blockSize; - state.checkGLErrors("before extensions->glCompressedTexSubImage2D("); + //state.checkGLErrors("before extensions->glCompressedTexSubImage2D("); extensions->glCompressedTexSubImage2D(target, k, 0, 0, @@ -845,7 +849,7 @@ void Texture::applyTexImage2D_subload(State& state, GLenum target, const Image* size, image->getMipmapData(k)); - state.checkGLErrors("after extensions->glCompressedTexSubImage2D("); + //state.checkGLErrors("after extensions->glCompressedTexSubImage2D("); width >>= 1; height >>= 1; diff --git a/src/osg/Texture2D.cpp b/src/osg/Texture2D.cpp index 6fb58bbbd..8fa0086af 100644 --- a/src/osg/Texture2D.cpp +++ b/src/osg/Texture2D.cpp @@ -98,7 +98,7 @@ void Texture2D::setImage(Image* image) void Texture2D::apply(State& state) const { - state.setReportGLErrors(true); + //state.setReportGLErrors(true); // get the contextID (user defined ID of 0 upwards) for the // current OpenGL context. diff --git a/src/osg/Timer.cpp b/src/osg/Timer.cpp index 55bd9b756..eeeda92e0 100644 --- a/src/osg/Timer.cpp +++ b/src/osg/Timer.cpp @@ -24,6 +24,13 @@ using namespace osg; // // all the rest of the timer methods are implemented within the header. + +const Timer* Timer::instance() +{ + static Timer s_timer; + return &s_timer; +} + #ifdef WIN32 #include diff --git a/src/osg/VertexProgram.cpp b/src/osg/VertexProgram.cpp index 35680cc1a..8edf734ce 100644 --- a/src/osg/VertexProgram.cpp +++ b/src/osg/VertexProgram.cpp @@ -34,7 +34,7 @@ void VertexProgram::deleteVertexProgramObject(unsigned int contextID,GLuint hand } -void VertexProgram::flushDeletedVertexProgramObjects(unsigned int contextID) +void VertexProgram::flushDeletedVertexProgramObjects(unsigned int contextID,double currentTime, double& availableTime) { const Extensions* extensions = getExtensions(contextID,true); diff --git a/src/osgProducer/DatabasePager.cpp b/src/osgProducer/DatabasePager.cpp index ccb76b051..a1fdb37a4 100644 --- a/src/osgProducer/DatabasePager.cpp +++ b/src/osgProducer/DatabasePager.cpp @@ -19,8 +19,6 @@ DatabasePager::DatabasePager() _deleteRemovedSubgraphsInDatabaseThread = true; _expiryDelay = 1.0; - - _maximumTimeForCompiling = 0.005; // 5ms. } void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* group) @@ -464,10 +462,10 @@ bool DatabasePager::getCompileRenderingObjectsForContexID(unsigned int contextID } -void DatabasePager::compileRenderingObjects(osg::State& state) +void DatabasePager::compileRenderingObjects(osg::State& state, double& availableTime) { - osg::Timer timer; + const osg::Timer& timer = *osg::Timer::instance(); osg::Timer_t start_tick = timer.tick(); double elapsedTime = 0.0; @@ -480,18 +478,18 @@ void DatabasePager::compileRenderingObjects(osg::State& state) // while there are valid databaseRequest's in the to compile list and there is // sufficient time left compile each databaseRequest's stateset and drawables. - while (databaseRequest.valid() && elapsedTime<_maximumTimeForCompiling) + while (databaseRequest.valid() && elapsedTime_dataToCompileMap; DataToCompile& dtc = dcm[state.getContextID()]; - if (!dtc.first.empty() && elapsedTime<_maximumTimeForCompiling) + if (!dtc.first.empty() && elapsedTimecompileRenderingObjects(*(sh.getSceneView()->getState())); + double availableTime = 0.005; // 5 ms + + _databasePager->compileRenderingObjects(*(sh.getSceneView()->getState()),availableTime); } osg::ref_ptr _databasePager; diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index d4fecaba6..17fc64d6a 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -536,13 +537,20 @@ void SceneView::draw() // and texture objects is deferred until the OpenGL context is the correct // context for when the object were originally created. Here we know what // context we are in so can flush the appropriate caches. - osg::Drawable::flushDeletedDisplayLists(_state->getContextID()); - osg::Drawable::flushDeletedVertexBufferObjects(_state->getContextID()); - osg::VertexProgram::flushDeletedVertexProgramObjects(_state->getContextID()); - - + + //static osg::Timer timer; + //osg::Timer_t tstart = timer.tick(); + double currentTime = _state->getFrameStamp()?_state->getFrameStamp()->getReferenceTime():0.0; - osg::Texture::getTextureObjectManager()->deleteTextureObjects(_state->getContextID(),currentTime); + double availableTime = 0.005; // 5 ms. + osg::Drawable::flushDeletedDisplayLists(_state->getContextID(),currentTime,availableTime); + osg::Drawable::flushDeletedVertexBufferObjects(_state->getContextID(),currentTime,availableTime); + osg::VertexProgram::flushDeletedVertexProgramObjects(_state->getContextID(),currentTime,availableTime); + osg::Texture::flushTextureObjects(_state->getContextID(),currentTime,availableTime); + + //osg::Timer_t tend = timer.tick(); + //std::cout<<"time to flush rendering objects"<getStereo())