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.
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 <sys/types.h>
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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<availableTime)
|
||||
{
|
||||
DataToCompileMap& dcm = databaseRequest->_dataToCompileMap;
|
||||
DataToCompile& dtc = dcm[state.getContextID()];
|
||||
if (!dtc.first.empty() && elapsedTime<_maximumTimeForCompiling)
|
||||
if (!dtc.first.empty() && elapsedTime<availableTime)
|
||||
{
|
||||
// we have StateSet's to compile
|
||||
StateSetList& sslist = dtc.first;
|
||||
//std::cout<<"Compiling statesets"<<std::endl;
|
||||
StateSetList::iterator itr=sslist.begin();
|
||||
for(;
|
||||
itr!=sslist.end() && elapsedTime<_maximumTimeForCompiling;
|
||||
itr!=sslist.end() && elapsedTime<availableTime;
|
||||
++itr)
|
||||
{
|
||||
//std::cout<<" Compiling stateset "<<(*itr).get()<<std::endl;
|
||||
@@ -501,14 +499,14 @@ void DatabasePager::compileRenderingObjects(osg::State& state)
|
||||
// remove the compiled stateset from the list.
|
||||
sslist.erase(sslist.begin(),itr);
|
||||
}
|
||||
if (!dtc.second.empty() && elapsedTime<_maximumTimeForCompiling)
|
||||
if (!dtc.second.empty() && elapsedTime<availableTime)
|
||||
{
|
||||
// we have Drawable's to compile
|
||||
//std::cout<<"Compiling drawables"<<std::endl;
|
||||
DrawableList& dwlist = dtc.second;
|
||||
DrawableList::iterator itr=dwlist.begin();
|
||||
for(;
|
||||
itr!=dwlist.end() && elapsedTime<_maximumTimeForCompiling;
|
||||
itr!=dwlist.end() && elapsedTime<availableTime;
|
||||
++itr)
|
||||
{
|
||||
//std::cout<<" Compiling drawable "<<(*itr).get()<<std::endl;
|
||||
@@ -560,5 +558,7 @@ void DatabasePager::compileRenderingObjects(osg::State& state)
|
||||
|
||||
elapsedTime = timer.delta_s(start_tick,timer.tick());
|
||||
}
|
||||
|
||||
availableTime -= elapsedTime;
|
||||
}
|
||||
|
||||
|
||||
@@ -309,7 +309,9 @@ public:
|
||||
|
||||
sh.drawImplementation(camera);
|
||||
|
||||
_databasePager->compileRenderingObjects(*(sh.getSceneView()->getState()));
|
||||
double availableTime = 0.005; // 5 ms
|
||||
|
||||
_databasePager->compileRenderingObjects(*(sh.getSceneView()->getState()),availableTime);
|
||||
}
|
||||
|
||||
osg::ref_ptr<DatabasePager> _databasePager;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <osgUtil/UpdateVisitor>
|
||||
#include <osgUtil/DisplayListVisitor>
|
||||
|
||||
#include <osg/Timer>
|
||||
#include <osg/Notify>
|
||||
#include <osg/Texture>
|
||||
#include <osg/VertexProgram>
|
||||
@@ -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"<<timer.delta_m(tstart,tend)<<std::endl;
|
||||
|
||||
|
||||
RenderLeaf* previous = NULL;
|
||||
if (_displaySettings.valid() && _displaySettings->getStereo())
|
||||
|
||||
Reference in New Issue
Block a user