Introduce GraphicsOperation subclass from osg::Operation, and osgUtil::GLObjectOperation

for compiling subgraphs.
This commit is contained in:
Robert Osfield 2007-07-13 17:25:35 +00:00
parent 65156475f6
commit a28588a84c
9 changed files with 99 additions and 57 deletions

View File

@ -18,6 +18,9 @@
namespace osg { namespace osg {
class GraphicsContext;
/** GraphicsThread is a helper class for running OpenGL GraphicsOperation within a single thread assigned to a specific GraphicsContext.*/
class OSG_EXPORT GraphicsThread : public osg::OperationThread class OSG_EXPORT GraphicsThread : public osg::OperationThread
{ {
public: public:
@ -28,17 +31,30 @@ class OSG_EXPORT GraphicsThread : public osg::OperationThread
virtual void run(); virtual void run();
}; };
struct OSG_EXPORT GraphicsOperation : public Operation
{
GraphicsOperation(const std::string& name, bool keep):
Operation(name,keep) {}
/** Override the standard Operation opertator and dynamic cast object to a GraphicsContext,
* on success call operation()(GraphicsContext*).*/
virtual void operator () (Object* object);
virtual void operator () (GraphicsContext* context) = 0;
};
/** SwapBufferOperation calls swap buffers on the GraphicsContext.*/ /** SwapBufferOperation calls swap buffers on the GraphicsContext.*/
struct OSG_EXPORT SwapBuffersOperation : public Operation struct OSG_EXPORT SwapBuffersOperation : public GraphicsOperation
{ {
SwapBuffersOperation(): SwapBuffersOperation():
Operation("SwapBuffers",true) {} GraphicsOperation("SwapBuffers",true) {}
virtual void operator () (Object* context); virtual void operator () (GraphicsContext* context);
}; };
/** BarrierOperation allows one to syncronize multiple GraphicsThreads with each other.*/ /** BarrierOperation allows one to syncronize multiple GraphicsThreads with each other.*/
struct OSG_EXPORT BarrierOperation : public Operation, public OpenThreads::Barrier struct OSG_EXPORT BarrierOperation : public GraphicsOperation, public OpenThreads::Barrier
{ {
enum PreBlockOp enum PreBlockOp
{ {
@ -48,36 +64,36 @@ struct OSG_EXPORT BarrierOperation : public Operation, public OpenThreads::Barri
}; };
BarrierOperation(int numThreads, PreBlockOp op=NO_OPERATION): BarrierOperation(int numThreads, PreBlockOp op=NO_OPERATION):
Operation("Barrier", true), GraphicsOperation("Barrier", true),
OpenThreads::Barrier(numThreads), OpenThreads::Barrier(numThreads),
_preBlockOp(op) {} _preBlockOp(op) {}
virtual void release(); virtual void release();
virtual void operator () (Object* context); virtual void operator () (GraphicsContext* context);
PreBlockOp _preBlockOp; PreBlockOp _preBlockOp;
}; };
/** ReleaseContext_Block_MakeCurrentOperation releases the context for another thread to aquire, /** ReleaseContext_Block_MakeCurrentOperation releases the context for another thread to aquire,
* then blocks waiting for context to be released, once the block is release the context is re-aqquired.*/ * then blocks waiting for context to be released, once the block is release the context is re-aqquired.*/
struct OSG_EXPORT ReleaseContext_Block_MakeCurrentOperation : public Operation, public RefBlock struct OSG_EXPORT ReleaseContext_Block_MakeCurrentOperation : public GraphicsOperation, public RefBlock
{ {
ReleaseContext_Block_MakeCurrentOperation(): ReleaseContext_Block_MakeCurrentOperation():
Operation("ReleaseContext_Block_MakeCurrent", false) {} GraphicsOperation("ReleaseContext_Block_MakeCurrent", false) {}
virtual void release(); virtual void release();
virtual void operator () (Object* context); virtual void operator () (GraphicsContext* context);
}; };
struct OSG_EXPORT BlockAndFlushOperation : public Operation, public OpenThreads::Block struct OSG_EXPORT BlockAndFlushOperation : public GraphicsOperation, public OpenThreads::Block
{ {
BlockAndFlushOperation(); BlockAndFlushOperation();
virtual void release(); virtual void release();
virtual void operator () (Object*); virtual void operator () (GraphicsContext*);
}; };
} }

View File

@ -130,7 +130,7 @@ class OSG_EXPORT OperationQueue : public Referenced
OperationThreads _operationThreads; OperationThreads _operationThreads;
}; };
/** GraphicsThread is a helper class for running OpenGL GraphicsOperation within a single thread assigned to a specific GraphicsContext.*/ /** OperationThread is a helper class for running Operation within a single thread.*/
class OSG_EXPORT OperationThread : public Referenced, public OpenThreads::Thread class OSG_EXPORT OperationThread : public Referenced, public OpenThreads::Thread
{ {
public: public:

View File

@ -373,11 +373,11 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl
double _minimumTimeAvailableForGLCompileAndDeletePerFrame; double _minimumTimeAvailableForGLCompileAndDeletePerFrame;
unsigned int _maximumNumOfObjectsToCompilePerFrame; unsigned int _maximumNumOfObjectsToCompilePerFrame;
struct CompileOperation : public osg::Operation struct CompileOperation : public osg::GraphicsOperation
{ {
CompileOperation(DatabasePager* databasePager); CompileOperation(DatabasePager* databasePager);
virtual void operator () (osg::Object* object); virtual void operator () (osg::GraphicsContext* context);
osg::observer_ptr<DatabasePager> _databasePager; osg::observer_ptr<DatabasePager> _databasePager;
}; };

View File

@ -113,6 +113,20 @@ class OSGUTIL_EXPORT GLObjectsVisitor : public osg::NodeVisitor
}; };
class GLObjectsOperation : public osg::GraphicsOperation
{
public:
GLObjectsOperation(osg::Node* subgraph, GLObjectsVisitor::Mode mode = GLObjectsVisitor::COMPILE_DISPLAY_LISTS|GLObjectsVisitor::COMPILE_STATE_ATTRIBUTES|GLObjectsVisitor::CHECK_BLACK_LISTED_MODES);
virtual void operator () (osg::GraphicsContext* context);
protected:
osg::ref_ptr<osg::Node> _subgraph;
GLObjectsVisitor::Mode _mode;
};
} }
#endif #endif

View File

@ -41,43 +41,24 @@ void GraphicsThread::run()
} }
struct BlockOperation : public Operation, public Block void GraphicsOperation::operator () (Object* object)
{ {
BlockOperation(): osg::GraphicsContext* context = dynamic_cast<osg::GraphicsContext*>(object);
Operation("Block",false) if (context) operator() (context);
{
reset();
} }
virtual void release() void SwapBuffersOperation::operator () (GraphicsContext* context)
{
Block::release();
}
virtual void operator () (Object*)
{
glFlush();
Block::release();
}
};
void SwapBuffersOperation::operator () (Object* object)
{
GraphicsContext* context = dynamic_cast<GraphicsContext*>(object);
if (context)
{ {
context->swapBuffersImplementation(); context->swapBuffersImplementation();
context->clear(); context->clear();
} }
}
void BarrierOperation::release() void BarrierOperation::release()
{ {
Barrier::release(); Barrier::release();
} }
void BarrierOperation::operator () (Object*) void BarrierOperation::operator () (GraphicsContext*)
{ {
if (_preBlockOp==GL_FLUSH) glFlush(); if (_preBlockOp==GL_FLUSH) glFlush();
if (_preBlockOp==GL_FINISH) glFinish(); if (_preBlockOp==GL_FINISH) glFinish();
@ -91,11 +72,8 @@ void ReleaseContext_Block_MakeCurrentOperation::release()
} }
void ReleaseContext_Block_MakeCurrentOperation::operator () (Object* object) void ReleaseContext_Block_MakeCurrentOperation::operator () (GraphicsContext* context)
{ {
GraphicsContext* context = dynamic_cast<GraphicsContext*>(object);
if (!context) return;
// release the graphics context. // release the graphics context.
context->releaseContext(); context->releaseContext();
@ -111,7 +89,7 @@ void ReleaseContext_Block_MakeCurrentOperation::operator () (Object* object)
BlockAndFlushOperation::BlockAndFlushOperation(): BlockAndFlushOperation::BlockAndFlushOperation():
Operation("Block",false) GraphicsOperation("Block",false)
{ {
reset(); reset();
} }
@ -121,7 +99,7 @@ void BlockAndFlushOperation::release()
Block::release(); Block::release();
} }
void BlockAndFlushOperation::operator () (Object*) void BlockAndFlushOperation::operator () (GraphicsContext*)
{ {
glFlush(); glFlush();
Block::release(); Block::release();

View File

@ -903,17 +903,15 @@ bool DatabasePager::getCompileGLObjectsForContextID(unsigned int contextID)
DatabasePager::CompileOperation::CompileOperation(osgDB::DatabasePager* databasePager): DatabasePager::CompileOperation::CompileOperation(osgDB::DatabasePager* databasePager):
osg::Operation("DatabasePager::CompileOperation",false), osg::GraphicsOperation("DatabasePager::CompileOperation",false),
_databasePager(databasePager) _databasePager(databasePager)
{ {
} }
void DatabasePager::CompileOperation::operator () (osg::Object* object) void DatabasePager::CompileOperation::operator () (osg::GraphicsContext* context)
{ {
osg::GraphicsContext* context = dynamic_cast<osg::GraphicsContext*>(object);
if (!context) return;
// osg::notify(osg::NOTICE)<<"Background thread compiling"<<std::endl; // osg::notify(osg::NOTICE)<<"Background thread compiling"<<std::endl;
if (_databasePager.valid()) _databasePager->compileAllGLObjects(*(context->getState())); if (_databasePager.valid()) _databasePager->compileAllGLObjects(*(context->getState()));
} }

View File

@ -138,3 +138,19 @@ void GLObjectsVisitor::apply(osg::StateSet& stateset)
stateset.checkValidityOfAssociatedModes(*_renderInfo.getState()); stateset.checkValidityOfAssociatedModes(*_renderInfo.getState());
} }
} }
GLObjectsOperation::GLObjectsOperation(osg::Node* subgraph, GLObjectsVisitor::Mode mode):
osg::GraphicsOperation("GLObjectOperation",false),
_subgraph(subgraph),
_mode(mode)
{
}
void GLObjectsOperation::operator () (osg::GraphicsContext* context)
{
GLObjectsVisitor glObjectsVisitor(_mode);
glObjectsVisitor.setState(context->getState());
_subgraph->accept(glObjectsVisitor);
}

View File

@ -10,6 +10,7 @@
#include <osgIntrospection/StaticMethodInfo> #include <osgIntrospection/StaticMethodInfo>
#include <osgIntrospection/Attributes> #include <osgIntrospection/Attributes>
#include <osg/GraphicsContext>
#include <osg/GraphicsThread> #include <osg/GraphicsThread>
#include <osg/Object> #include <osg/Object>
@ -30,7 +31,7 @@ END_REFLECTOR
BEGIN_OBJECT_REFLECTOR(osg::BarrierOperation) BEGIN_OBJECT_REFLECTOR(osg::BarrierOperation)
I_DeclaringFile("osg/GraphicsThread"); I_DeclaringFile("osg/GraphicsThread");
I_BaseType(osg::Operation); I_BaseType(osg::GraphicsOperation);
I_BaseType(OpenThreads::Barrier); I_BaseType(OpenThreads::Barrier);
I_ConstructorWithDefaults2(IN, int, numThreads, , IN, osg::BarrierOperation::PreBlockOp, op, osg::BarrierOperation::NO_OPERATION, I_ConstructorWithDefaults2(IN, int, numThreads, , IN, osg::BarrierOperation::PreBlockOp, op, osg::BarrierOperation::NO_OPERATION,
____BarrierOperation__int__PreBlockOp, ____BarrierOperation__int__PreBlockOp,
@ -46,7 +47,7 @@ END_REFLECTOR
BEGIN_OBJECT_REFLECTOR(osg::BlockAndFlushOperation) BEGIN_OBJECT_REFLECTOR(osg::BlockAndFlushOperation)
I_DeclaringFile("osg/GraphicsThread"); I_DeclaringFile("osg/GraphicsThread");
I_BaseType(osg::Operation); I_BaseType(osg::GraphicsOperation);
I_BaseType(OpenThreads::Block); I_BaseType(OpenThreads::Block);
I_Constructor0(____BlockAndFlushOperation, I_Constructor0(____BlockAndFlushOperation,
"", "",
@ -58,6 +59,15 @@ BEGIN_OBJECT_REFLECTOR(osg::BlockAndFlushOperation)
""); "");
END_REFLECTOR END_REFLECTOR
BEGIN_ABSTRACT_OBJECT_REFLECTOR(osg::GraphicsOperation)
I_DeclaringFile("osg/GraphicsThread");
I_BaseType(osg::Operation);
I_Constructor2(IN, const std::string &, name, IN, bool, keep,
____GraphicsOperation__C5_std_string_R1__bool,
"",
"");
END_REFLECTOR
BEGIN_OBJECT_REFLECTOR(osg::GraphicsThread) BEGIN_OBJECT_REFLECTOR(osg::GraphicsThread)
I_DeclaringFile("osg/GraphicsThread"); I_DeclaringFile("osg/GraphicsThread");
I_BaseType(osg::OperationThread); I_BaseType(osg::OperationThread);
@ -73,7 +83,7 @@ END_REFLECTOR
BEGIN_OBJECT_REFLECTOR(osg::ReleaseContext_Block_MakeCurrentOperation) BEGIN_OBJECT_REFLECTOR(osg::ReleaseContext_Block_MakeCurrentOperation)
I_DeclaringFile("osg/GraphicsThread"); I_DeclaringFile("osg/GraphicsThread");
I_BaseType(osg::Operation); I_BaseType(osg::GraphicsOperation);
I_BaseType(osg::RefBlock); I_BaseType(osg::RefBlock);
I_Constructor0(____ReleaseContext_Block_MakeCurrentOperation, I_Constructor0(____ReleaseContext_Block_MakeCurrentOperation,
"", "",
@ -81,13 +91,13 @@ BEGIN_OBJECT_REFLECTOR(osg::ReleaseContext_Block_MakeCurrentOperation)
I_Method0(void, release, I_Method0(void, release,
Properties::VIRTUAL, Properties::VIRTUAL,
__void__release, __void__release,
"if this operation is a barrier then release it. ", "",
""); "");
END_REFLECTOR END_REFLECTOR
BEGIN_OBJECT_REFLECTOR(osg::SwapBuffersOperation) BEGIN_OBJECT_REFLECTOR(osg::SwapBuffersOperation)
I_DeclaringFile("osg/GraphicsThread"); I_DeclaringFile("osg/GraphicsThread");
I_BaseType(osg::Operation); I_BaseType(osg::GraphicsOperation);
I_Constructor0(____SwapBuffersOperation, I_Constructor0(____SwapBuffersOperation,
"", "",
""); "");

View File

@ -12,6 +12,7 @@
#include <osg/Drawable> #include <osg/Drawable>
#include <osg/Geode> #include <osg/Geode>
#include <osg/GraphicsContext>
#include <osg/Node> #include <osg/Node>
#include <osg/RenderInfo> #include <osg/RenderInfo>
#include <osg/State> #include <osg/State>
@ -26,6 +27,15 @@
#undef OUT #undef OUT
#endif #endif
BEGIN_OBJECT_REFLECTOR(osgUtil::GLObjectsOperation)
I_DeclaringFile("osgUtil/GLObjectsVisitor");
I_BaseType(osg::GraphicsOperation);
I_ConstructorWithDefaults2(IN, osg::Node *, subgraph, , IN, osgUtil::GLObjectsVisitor::Mode, mode, osgUtil::GLObjectsVisitor::COMPILE_DISPLAY_LISTS|osgUtil::GLObjectsVisitor::COMPILE_STATE_ATTRIBUTES|osgUtil::GLObjectsVisitor::CHECK_BLACK_LISTED_MODES,
____GLObjectsOperation__osg_Node_P1__GLObjectsVisitor_Mode,
"",
"");
END_REFLECTOR
TYPE_NAME_ALIAS(unsigned int, osgUtil::GLObjectsVisitor::Mode) TYPE_NAME_ALIAS(unsigned int, osgUtil::GLObjectsVisitor::Mode)
BEGIN_ENUM_REFLECTOR(osgUtil::GLObjectsVisitor::ModeValues) BEGIN_ENUM_REFLECTOR(osgUtil::GLObjectsVisitor::ModeValues)