From 282fa847895f15296005eee6b8b34260eb4e86a9 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 4 Jun 2008 16:46:14 +0000 Subject: [PATCH] Added support for optionally calling releaseContext at the end of each renderinTraversals() to help with cases where uses are driving multiple contexts from mulitple viewers in a single threaded frame loop. --- include/osgViewer/ViewerBase | 15 ++++++++++++++- src/osgViewer/CompositeViewer.cpp | 2 ++ src/osgViewer/Viewer.cpp | 2 ++ src/osgViewer/ViewerBase.cpp | 10 ++++++++-- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/include/osgViewer/ViewerBase b/include/osgViewer/ViewerBase index d9cace115..e042de489 100644 --- a/include/osgViewer/ViewerBase +++ b/include/osgViewer/ViewerBase @@ -140,6 +140,18 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object bool getQuitEventSetsDone() const { return _quitEventSetsDone; } + /** Hint to tell the renderingTraversals() method whether to call relaseContext() on the last + * context that was made current by the thread calling renderingTraverals(). Note, when + * running multi-threaded viewer no threads will be made current or release current. + * Setting this hint to false can enable the frame loop to be lazy about calling makeCurrent + * and releaseContext on each new frame, helping performance. However, if you frame loop + * is managing multiple graphics context all from the main frame thread then this hint must + * be left on, otherwise the wrong context could be left active, introducing errors in rendering.*/ + void setReleaseContextAtEndOfFrameHint(bool hint) { _releaseContextAtEndOfFrameHint = hint; } + + /** Hint to tell the renderingTraversals() method whether to call relaseContext().*/ + bool getReleaseContextAtEndOfFrameHint() const { return _releaseContextAtEndOfFrameHint; } + /** Set the UpdateVisitor. */ void setUpdateVisitor(osgUtil::UpdateVisitor* updateVisitor) { _updateVisitor = updateVisitor; } @@ -225,7 +237,7 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object /** Get the keyboard and mouse usage of this viewer.*/ virtual void getUsage(osg::ApplicationUsage& usage) const = 0; - + protected: inline void makeCurrent(osg::GraphicsContext* gc) @@ -255,6 +267,7 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object bool _done; int _keyEventSetsDone; bool _quitEventSetsDone; + bool _releaseContextAtEndOfFrameHint; ThreadingModel _threadingModel; bool _threadsRunning; diff --git a/src/osgViewer/CompositeViewer.cpp b/src/osgViewer/CompositeViewer.cpp index c4fd6ee82..a3e3e099f 100644 --- a/src/osgViewer/CompositeViewer.cpp +++ b/src/osgViewer/CompositeViewer.cpp @@ -184,6 +184,8 @@ int CompositeViewer::run() } } + setReleaseContextAtEndOfFrameHint(false); + return ViewerBase::run(); } diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index a5dda88bc..6872f43bd 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -316,6 +316,8 @@ int Viewer::run() { setCameraManipulator(new osgGA::TrackballManipulator()); } + + setReleaseContextAtEndOfFrameHint(false); return ViewerBase::run(); } diff --git a/src/osgViewer/ViewerBase.cpp b/src/osgViewer/ViewerBase.cpp index dfee2dc8d..8a8e98676 100644 --- a/src/osgViewer/ViewerBase.cpp +++ b/src/osgViewer/ViewerBase.cpp @@ -43,6 +43,7 @@ ViewerBase::ViewerBase(): _done = false; _keyEventSetsDone = osgGA::GUIEventAdapter::KEY_Escape; _quitEventSetsDone = true; + _releaseContextAtEndOfFrameHint = true; _threadingModel = AutomaticSelection; _threadsRunning = false; _endBarrierPosition = AfterSwapBuffers; @@ -55,6 +56,7 @@ ViewerBase::ViewerBase(const ViewerBase& base): _done = false; _keyEventSetsDone = osgGA::GUIEventAdapter::KEY_Escape; _quitEventSetsDone = true; + _releaseContextAtEndOfFrameHint = true; _threadingModel = AutomaticSelection; _threadsRunning = false; _endBarrierPosition = AfterSwapBuffers; @@ -721,8 +723,12 @@ void ViewerBase::renderingTraversals() _endDynamicDrawBlock->block(); // osg::notify(osg::NOTICE)<<"Time waiting "<delta_m(startTick, osg::Timer::instance()->tick())<collectStats("update")) {