Introduce GraphicsOperation subclass from osg::Operation, and osgUtil::GLObjectOperation
for compiling subgraphs.
This commit is contained in:
parent
65156475f6
commit
a28588a84c
@ -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*);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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,
|
||||||
"",
|
"",
|
||||||
"");
|
"");
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user