Fixed multi-threaded/multi-pipe crash when primitive stats where output in osgProducer::Viewer's stats.

This commit is contained in:
Robert Osfield
2006-07-29 16:47:28 +00:00
parent f977d7c606
commit b1994cc60d
7 changed files with 90 additions and 92 deletions

View File

@@ -21,7 +21,8 @@ using namespace osgUtil;
using namespace osgProducer;
OsgSceneHandler::OsgSceneHandler( osg::DisplaySettings *ds) :
_sceneView(new osgUtil::SceneView(ds))
_sceneView(new osgUtil::SceneView(ds)),
_collectStats(false)
{
_frameStartTick = 0;
_previousFrameStartTick = 0;
@@ -59,6 +60,7 @@ void OsgSceneHandler::clearImplementation(Producer::Camera& /*camera*/)
void OsgSceneHandler::cullImplementation(Producer::Camera &cam)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_cullMutex);
_sceneView->getProjectionMatrix().set(cam.getProjectionMatrix());
_sceneView->getViewMatrix().set(cam.getPositionAndAttitudeMatrix());
@@ -74,6 +76,23 @@ void OsgSceneHandler::cullImplementation(Producer::Camera &cam)
_sceneView->setClearColor(clear_color);
_sceneView->cull();
if (_collectStats)
{
_stats.reset();
_sceneView->getStats(_stats);
}
}
bool OsgSceneHandler::getStats(Statistics& primStats)
{
if (!_collectStats) return false;
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_cullMutex);
primStats.add(_stats);
return true;
}
void OsgSceneHandler::drawImplementation(Producer::Camera &)

View File

@@ -14,55 +14,6 @@
using namespace osgProducer;
class ViewerEventHandler::CameraBarrierCallback : public Producer::Camera::Callback, public OpenThreads::Barrier
{
public:
CameraBarrierCallback(unsigned int numThreads):
OpenThreads::Barrier(numThreads),
_doBlock(false) {}
virtual ~CameraBarrierCallback()
{
release();
}
void setDoBlock(bool block)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
if (_doBlock != block)
{
if (_doBlock) release();
_doBlock = block;
osg::notify(osg::NOTICE)<<"setDoBlock("<<block<<")"<<std::endl;
}
}
bool getDoBlock() const { return _doBlock; }
virtual void operator() (const Producer::Camera&)
{
bool doBlock = false;
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
doBlock = _doBlock;
}
if (doBlock)
{
osg::notify(osg::NOTICE)<<"Entering block()"<<std::endl;
block();
}
};
protected:
bool _doBlock;
OpenThreads::Mutex _mutex;
};
class ViewerEventHandler::SnapImageDrawCallback : public Producer::Camera::Callback
{
@@ -643,7 +594,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
shitr != _veh->getOsgCameraGroup()->getSceneHandlerList().end();
++shitr)
{
(*shitr)->getSceneView()->getStats(stats);
(*shitr)->getStats(stats);
}
unsigned int primitives = 0;
@@ -918,19 +869,6 @@ ViewerEventHandler::ViewerEventHandler(OsgCameraGroup* cg):
{
Producer::CameraConfig* cfg = _cg->getCameraConfig();
_cameraBarrierCallback = 0;
#if 0
if (cfg->getNumberOfCameras()>1)
{
// use a barrier to make that stats only runs once all the threads have done their drawing.
_cameraBarrierCallback = new CameraBarrierCallback(cfg->getNumberOfCameras());
for(unsigned int i=0;i<cfg->getNumberOfCameras();++i)
{
cfg->getCamera(i)->addPostDrawCallback(_cameraBarrierCallback);
}
}
#endif
Producer::Camera *cam = cfg->getCamera(0);
_statsAndHelpDrawCallback = new StatsAndHelpDrawCallback(this,0);
@@ -987,18 +925,13 @@ void ViewerEventHandler::setWriteImageFileName(const std::string& filename)
void ViewerEventHandler::setFrameStatsMode(FrameStatsMode mode)
{
_frameStatsMode = mode;
if (_frameStatsMode==NO_STATS)
_cg->setInstrumentationMode(_frameStatsMode!=NO_STATS);
for(osgProducer::OsgCameraGroup::SceneHandlerList::iterator shitr = _cg->getSceneHandlerList().begin();
shitr != _cg->getSceneHandlerList().end();
++shitr)
{
_cg->setInstrumentationMode(false);
}
else
{
_cg->setInstrumentationMode(true);
}
if (_cameraBarrierCallback)
{
_cameraBarrierCallback->setDoBlock(_frameStatsMode>=SCENE_STATS);
(*shitr)->setCollectStats(_frameStatsMode==SCENE_STATS);
}
}

View File

@@ -12,6 +12,7 @@
#include <osg/DisplaySettings>
#include <osgProducer/OsgSceneHandler>
#include <osgUtil/SceneView>
#include <osgUtil/Statistics>
// Must undefine IN and OUT macros defined in Windows headers
#ifdef IN
@@ -42,6 +43,9 @@ BEGIN_OBJECT_REFLECTOR(osgProducer::OsgSceneHandler)
I_Method1(void, setDrawCallback, IN, osgProducer::OsgSceneHandler::Callback *, callback);
I_Method0(osgProducer::OsgSceneHandler::Callback *, getDrawCallback);
I_Method0(const osgProducer::OsgSceneHandler::Callback *, getDrawCallback);
I_Method1(void, setCollectStats, IN, bool, collectStats);
I_Method0(bool, getCollectStats);
I_Method1(bool, getStats, IN, osgUtil::Statistics &, primStats);
I_Method1(void, setContextID, IN, int, id);
I_Method1(void, setFlushOfAllDeletedGLObjectsOnNextFrame, IN, bool, flag);
I_Method0(bool, getFlushOfAllDeletedGLObjectsOnNextFrame);
@@ -49,6 +53,7 @@ BEGIN_OBJECT_REFLECTOR(osgProducer::OsgSceneHandler)
I_Method0(bool, getCleanUpOnNextFrame);
I_Property(bool, CleanUpOnNextFrame);
I_Property(osgProducer::OsgSceneHandler::Callback *, ClearCallback);
I_Property(bool, CollectStats);
I_WriteOnlyProperty(int, ContextID);
I_Property(osgProducer::OsgSceneHandler::Callback *, CullCallback);
I_Property(osgProducer::OsgSceneHandler::Callback *, DrawCallback);

View File

@@ -34,7 +34,7 @@ TYPE_NAME_ALIAS(std::map< GLenum COMMA osgUtil::Statistics::PrimitivePair >, os
TYPE_NAME_ALIAS(std::map< GLenum COMMA unsigned int >, osgUtil::Statistics::PrimitiveCountMap);
BEGIN_ENUM_REFLECTOR(osgUtil::Statistics::statsType)
BEGIN_ENUM_REFLECTOR(osgUtil::Statistics::StatsType)
I_EnumLabel(osgUtil::Statistics::STAT_NONE);
I_EnumLabel(osgUtil::Statistics::STAT_FRAMERATE);
I_EnumLabel(osgUtil::Statistics::STAT_GRAPHS);
@@ -49,7 +49,7 @@ BEGIN_OBJECT_REFLECTOR(osgUtil::Statistics)
I_BaseType(osg::PrimitiveFunctor);
I_Constructor0();
I_Method0(void, reset);
I_Method1(void, setType, IN, osgUtil::Statistics::statsType, t);
I_Method1(void, setType, IN, osgUtil::Statistics::StatsType, t);
I_Method2(void, setVertexArray, IN, unsigned int, count, IN, const osg::Vec3 *, x);
I_Method2(void, setVertexArray, IN, unsigned int, count, IN, const osg::Vec2 *, x);
I_Method2(void, setVertexArray, IN, unsigned int, count, IN, const osg::Vec4 *, x);
@@ -74,12 +74,13 @@ BEGIN_OBJECT_REFLECTOR(osgUtil::Statistics)
I_Method1(void, setDepth, IN, int, d);
I_Method1(void, addBins, IN, int, np);
I_Method1(void, setBinNo, IN, int, n);
I_Method1(void, add, IN, const osgUtil::Statistics &, stats);
I_Method0(osgUtil::Statistics::PrimitiveCountMap::iterator, GetPrimitivesBegin);
I_Method0(osgUtil::Statistics::PrimitiveCountMap::iterator, GetPrimitivesEnd);
I_WriteOnlyProperty(int, BinNo);
I_ReadOnlyProperty(int, Bins);
I_WriteOnlyProperty(int, Depth);
I_WriteOnlyProperty(osgUtil::Statistics::statsType, Type);
I_WriteOnlyProperty(osgUtil::Statistics::StatsType, Type);
END_REFLECTOR
TYPE_NAME_ALIAS(std::set< osg::Node * >, osgUtil::StatsVisitor::NodeSet);