Further work on new threading model.

This commit is contained in:
Robert Osfield
2007-01-31 22:24:20 +00:00
parent 019cdd9116
commit 8dfc5155f4
7 changed files with 795 additions and 254 deletions

View File

@@ -176,6 +176,21 @@ class OSG_EXPORT GraphicsContext : public Referenced
/** Run the operations. */
void runOperations();
typedef std::list< ref_ptr<GraphicsOperation> > OperationQueue;
/** Get the operations queue, not you must use the OperationsMutex when accessing the queue.*/
OperationQueue& getOperationsQueue() { return _operations; }
/** Get the operations queue mutex.*/
OpenThreads::Mutex& getOperationsMutex() { return _operationsMutex; }
/** Get the operations queue block used to mark an empty queue, if you end items into the empty queu you must release this block.*/
osg::Block* getOperationsBlock() { return _operationsBlock.get(); }
/** Get the current operations that is being run.*/
GraphicsOperation* getCurrentOperation() { return _currentOperation.get(); }
public:
/** Get the traits of the GraphicsContext.*/
@@ -354,8 +369,6 @@ class OSG_EXPORT GraphicsContext : public Referenced
OpenThreads::Thread* _threadOfLastMakeCurrent;
typedef std::list< ref_ptr<GraphicsOperation> > OperationQueue;
OpenThreads::Mutex _operationsMutex;
osg::ref_ptr<osg::Block> _operationsBlock;
OperationQueue _operations;

View File

@@ -443,6 +443,9 @@ class OSGUTIL_EXPORT SceneView : public osg::Object, public osg::CullSettings
/** Do draw traversal of draw bins generated by cull traversal.*/
virtual void draw();
/** Compute the number of dynamic objects that will be held in the rendering backend */
unsigned int getDynamicObjectCount() const { return _dynamicObjectCount; }
/** Release all OpenGL objects from the scene graph, such as texture objects, display lists etc.
* These released scene graphs placed in the respective delete GLObjects cache, which
* then need to be deleted in OpenGL by SceneView::flushAllDeleteGLObjects(). */
@@ -515,7 +518,7 @@ class OSGUTIL_EXPORT SceneView : public osg::Object, public osg::CullSettings
int _interlacedStereoStencilWidth;
int _interlacedStereoStencilHeight;
unsigned int _dynamicObjectCount;
};
}

View File

@@ -29,15 +29,17 @@ class OSGVIEWER_EXPORT EndOfDynamicDrawBlock : public osg::State::DynamicObjectR
{
public:
EndOfDynamicDrawBlock();
EndOfDynamicDrawBlock(unsigned int);
void completed(osg::State* state);
void block();
void reset();
void release();
void set(unsigned int blockCount);
void setNumOfBlocks(unsigned int blockCount);
protected:
@@ -45,6 +47,7 @@ class OSGVIEWER_EXPORT EndOfDynamicDrawBlock : public osg::State::DynamicObjectR
OpenThreads::Mutex _mut;
OpenThreads::Condition _cond;
unsigned int _numberOfBlocks;
unsigned int _blockCount;
};

View File

@@ -170,8 +170,8 @@ class OSGVIEWER_EXPORT Viewer : public osgViewer::View
unsigned int _numThreadsOnBarrier;
typedef std::map<osg::ref_ptr<osg::Camera>, osg::ref_ptr<osgUtil::SceneView> > CameraSceneViewMap;
CameraSceneViewMap _cameraSceneViewMap;
typedef std::list< osg::ref_ptr<osgUtil::SceneView> > SceneViews;
SceneViews _sceneViews;
osg::Timer_t _startTick;
osg::ref_ptr<osg::FrameStamp> _frameStamp;