From b0b98d49b82419732dfe7fcfb79031eb30868f19 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 24 Jan 2012 17:21:14 +0000 Subject: [PATCH] From Paul Martz, Added ViewerBase::s/getEndBarrierOperation(..) method to allow user control of how viewers are sync'd. --- include/osgViewer/ViewerBase | 10 ++++++++++ src/osgViewer/ViewerBase.cpp | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/osgViewer/ViewerBase b/include/osgViewer/ViewerBase index 488c64bf5..ac7ab2a75 100644 --- a/include/osgViewer/ViewerBase +++ b/include/osgViewer/ViewerBase @@ -106,6 +106,15 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object /** Get the end barrier position.*/ BarrierPosition getEndBarrierPosition() const { return _endBarrierPosition; } + + /** Set the end barrier operation. \c op may be one of GL_FLUSH, GL_FINISH, + * or NO_OPERATION. NO_OPERATION is the default. Per BarrierOperation::operator()(), + * a glFlush() command, glFinish() command, or no additional OpenGL command will be + * issued before entering the end barrier. */ + void setEndBarrierOperation(const osg::BarrierOperation::PreBlockOp& op) { _endBarrierOperation = op; } + + /** Get the end barrier operation. */ + osg::BarrierOperation::PreBlockOp getEndBarrierOperation() const { return _endBarrierOperation; } @@ -309,6 +318,7 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object BarrierPosition _endBarrierPosition; + osg::BarrierOperation::PreBlockOp _endBarrierOperation; osg::ref_ptr _startRenderingBarrier; osg::ref_ptr _endRenderingDispatchBarrier; diff --git a/src/osgViewer/ViewerBase.cpp b/src/osgViewer/ViewerBase.cpp index 3874b0b7d..1a96ebfab 100644 --- a/src/osgViewer/ViewerBase.cpp +++ b/src/osgViewer/ViewerBase.cpp @@ -60,6 +60,7 @@ void ViewerBase::viewerBaseInit() _threadingModel = AutomaticSelection; _threadsRunning = false; _endBarrierPosition = AfterSwapBuffers; + _endBarrierOperation = osg::BarrierOperation::NO_OPERATION; _requestRedraw = true; _requestContinousUpdate = false; @@ -355,7 +356,7 @@ void ViewerBase::startThreading() if (numThreadsOnEndBarrier>1) { - _endRenderingDispatchBarrier = new osg::BarrierOperation(numThreadsOnEndBarrier, osg::BarrierOperation::NO_OPERATION); + _endRenderingDispatchBarrier = new osg::BarrierOperation(numThreadsOnEndBarrier, _endBarrierOperation); }