From bb7368a3214df25b036316cfd55beb1373a08a2e Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 22 Aug 2007 12:21:01 +0000 Subject: [PATCH] Cleaned up the thread setup and fixed the CullThreadPerCameraDrawThreadPerContext path --- src/osgViewer/Viewer.cpp | 48 +++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index d5d27798c..206758b6a 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -430,7 +430,7 @@ Viewer::ThreadingModel Viewer::suggestBestThreadingModel() else return DrawThreadPerContext; } -#if 0 +#if 1 if (numProcessors >= static_cast(cameras.size()+contexts.size())) { return CullThreadPerCameraDrawThreadPerContext; @@ -459,20 +459,25 @@ void Viewer::startThreading() Cameras cameras; getCameras(cameras); - unsigned int numThreadsOnBarrier = 0; + unsigned int numThreadsOnStartBarrier = 0; + unsigned int numThreadsOnEndBarrier = 0; switch(_threadingModel) { case(SingleThreaded): - numThreadsOnBarrier = 1; + numThreadsOnStartBarrier = 1; + numThreadsOnEndBarrier = 1; return; case(CullDrawThreadPerContext): - numThreadsOnBarrier = contexts.size()+1; + numThreadsOnStartBarrier = contexts.size()+1; + numThreadsOnEndBarrier = contexts.size()+1; break; case(DrawThreadPerContext): - numThreadsOnBarrier = 1; + numThreadsOnStartBarrier = 1; + numThreadsOnEndBarrier = 1; break; case(CullThreadPerCameraDrawThreadPerContext): - numThreadsOnBarrier = cameras.size()+1; + numThreadsOnStartBarrier = cameras.size()+1; + numThreadsOnEndBarrier = 1; break; default: osg::notify(osg::NOTICE)<<"Error: Threading model not selected"<(camera->getRenderer()); - renderer->setGraphicsThreadDoesCull(graphicsThreadsDoesCull); - renderer->setDone(false); - ++numViewerDoubleBufferedRenderingOperation; + if (renderer) + { + renderer->setGraphicsThreadDoesCull(graphicsThreadsDoesCull); + renderer->setDone(false); + ++numViewerDoubleBufferedRenderingOperation; + } } if (_threadingModel==CullDrawThreadPerContext) @@ -530,10 +538,14 @@ void Viewer::startThreading() else osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(2); } - if (numThreadsOnBarrier>1) + if (numThreadsOnStartBarrier>1) { - _startRenderingBarrier = new osg::BarrierOperation(numThreadsOnBarrier, osg::BarrierOperation::NO_OPERATION); - _endRenderingDispatchBarrier = new osg::BarrierOperation(numThreadsOnBarrier, osg::BarrierOperation::NO_OPERATION); + _startRenderingBarrier = new osg::BarrierOperation(numThreadsOnStartBarrier, osg::BarrierOperation::NO_OPERATION); + } + + if (numThreadsOnEndBarrier>1) + { + _endRenderingDispatchBarrier = new osg::BarrierOperation(numThreadsOnEndBarrier, osg::BarrierOperation::NO_OPERATION); } @@ -586,11 +598,11 @@ void Viewer::startThreading() } - if (_threadingModel==CullThreadPerCameraDrawThreadPerContext && numThreadsOnBarrier>1) + if (_threadingModel==CullThreadPerCameraDrawThreadPerContext && numThreadsOnStartBarrier>1) { - Cameras::iterator camItr = cameras.begin(); + Cameras::iterator camItr; - for(; + for(camItr = cameras.begin(); camItr != cameras.end(); ++camItr, ++processNum) { @@ -606,7 +618,7 @@ void Viewer::startThreading() if (_startRenderingBarrier.valid()) camera->getCameraThread()->add(_startRenderingBarrier.get()); Renderer* renderer = dynamic_cast(camera->getRenderer()); - renderer->setGraphicsThreadDoesCull(true); + renderer->setGraphicsThreadDoesCull(false); camera->getCameraThread()->add(renderer); if (_endRenderingDispatchBarrier.valid()) @@ -1442,7 +1454,7 @@ void Viewer::renderingTraversals() dp->signalBeginFrame(getFrameStamp()); } - // osg::notify(osg::NOTICE)<block();