From ff267d1ad69fc7057328cd0708b15ac3e60697ab Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sun, 22 Jul 2007 20:33:20 +0000 Subject: [PATCH] Added support for using the CompileContext to do GL object deletion. --- src/osgViewer/CompositeViewer.cpp | 19 ++++++++++-- src/osgViewer/Viewer.cpp | 49 +++++++++++++++++++++++++++---- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/src/osgViewer/CompositeViewer.cpp b/src/osgViewer/CompositeViewer.cpp index d5b67a872..691b3596d 100644 --- a/src/osgViewer/CompositeViewer.cpp +++ b/src/osgViewer/CompositeViewer.cpp @@ -564,6 +564,8 @@ struct CompositeViewerRenderingOperation : public osg::Operation _databasePager(databasePager) { _sceneView->getCullVisitor()->setDatabaseRequestHandler(_databasePager.get()); + + _flushOperation = new osg::FlushDeletedGLObjectsOperation(0.1); } virtual void operator () (osg::Object*) @@ -577,6 +579,9 @@ struct CompositeViewerRenderingOperation : public osg::Operation osgViewer::View* view = dynamic_cast(_sceneView->getCamera()->getView()); if (view) _sceneView->setFusionDistance(view->getFusionDistanceMode(), view->getFusionDistanceValue()); + osg::GraphicsContext* compileContext = osg::GraphicsContext::getCompileContext(_sceneView->getState()->getContextID()); + osg::GraphicsThread* compileThread = compileContext ? compileContext->getGraphicsThread() : 0; + _sceneView->inheritCullSettings(*(_sceneView->getCamera())); _sceneView->cull(); _sceneView->draw(); @@ -588,11 +593,19 @@ struct CompositeViewerRenderingOperation : public osg::Operation _databasePager->compileGLObjects(*(_sceneView->getState()), availableTime); } - _sceneView->flushDeletedGLObjects(availableTime); + if (compileThread) + { + compileThread->add(_flushOperation.get()); + } + else + { + _sceneView->flushDeletedGLObjects(availableTime); + } } - osg::observer_ptr _sceneView; - osg::observer_ptr _databasePager; + osg::observer_ptr _sceneView; + osg::observer_ptr _databasePager; + osg::ref_ptr _flushOperation; }; void CompositeViewer::setUpRenderingSupport() diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index 7bd65df9f..5f1e76524 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -137,6 +137,8 @@ struct ViewerRenderingOperation : public osg::GraphicsOperation, public ViewerQu _databasePager(databasePager) { _sceneView->getCullVisitor()->setDatabaseRequestHandler(_databasePager.get()); + + _flushOperation = new osg::FlushDeletedGLObjectsOperation(0.1); } osg::Camera* getCamera() { return _sceneView->getCamera(); } @@ -202,7 +204,18 @@ struct ViewerRenderingOperation : public osg::GraphicsOperation, public ViewerQu { _databasePager->compileGLObjects(*(_sceneView->getState()), availableTime); } - _sceneView->flushDeletedGLObjects(availableTime); + + osg::GraphicsContext* compileContext = osg::GraphicsContext::getCompileContext(_sceneView->getState()->getContextID()); + osg::GraphicsThread* compileThread = compileContext ? compileContext->getGraphicsThread() : 0; + + if (compileThread) + { + compileThread->add(_flushOperation.get()); + } + else + { + _sceneView->flushDeletedGLObjects(availableTime); + } if (aquireGPUStats) { @@ -225,8 +238,9 @@ struct ViewerRenderingOperation : public osg::GraphicsOperation, public ViewerQu } - osg::observer_ptr _sceneView; - osg::observer_ptr _databasePager; + osg::observer_ptr _sceneView; + osg::observer_ptr _databasePager; + osg::ref_ptr _flushOperation; }; @@ -261,6 +275,9 @@ struct ViewerDoubleBufferedRenderingOperation : public osg::Operation, public Vi _lockHeld[_currentCull] = true; } + + _flushOperation = new osg::FlushDeletedGLObjectsOperation(0.1); + // osg::notify(osg::NOTICE)<<"constructed"<getState()->getContextID()); + osg::GraphicsThread* compileThread = compileContext ? compileContext->getGraphicsThread() : 0; + if (sceneView || _done) { OpenThreads::ScopedLock lock(_mutex[_currentDraw]); @@ -427,7 +447,14 @@ struct ViewerDoubleBufferedRenderingOperation : public osg::Operation, public Vi _databasePager->compileGLObjects(*(sceneView->getState()), availableTime); } - sceneView->flushDeletedGLObjects(availableTime); + if (compileThread) + { + compileThread->add(_flushOperation.get()); + } + else + { + sceneView->flushDeletedGLObjects(availableTime); + } if (aquireGPUStats) { @@ -457,6 +484,9 @@ struct ViewerDoubleBufferedRenderingOperation : public osg::Operation, public Vi osgUtil::SceneView* sceneView = _sceneView[_currentDraw].get(); if (!sceneView || _done) return; + osg::GraphicsContext* compileContext = osg::GraphicsContext::getCompileContext(sceneView->getState()->getContextID()); + osg::GraphicsThread* compileThread = compileContext ? compileContext->getGraphicsThread() : 0; + OpenThreads::ScopedLock lock(_mutex[_currentDraw]); if (_done) @@ -515,7 +545,15 @@ struct ViewerDoubleBufferedRenderingOperation : public osg::Operation, public Vi { _databasePager->compileGLObjects(*(sceneView->getState()), availableTime); } - sceneView->flushDeletedGLObjects(availableTime); + + if (compileThread) + { + compileThread->add(_flushOperation.get()); + } + else + { + sceneView->flushDeletedGLObjects(availableTime); + } if (aquireGPUStats) { @@ -589,6 +627,7 @@ struct ViewerDoubleBufferedRenderingOperation : public osg::Operation, public Vi int _frameNumber[2]; osg::observer_ptr _databasePager; + osg::ref_ptr _flushOperation; };