I'm sure you already knew this, but just in case not... :)

svn diff \
--old http://www.openscenegraph.com/svn/osg/OpenSceneGraph/[EMAIL PROTECTED] \
--new http://www.openscenegraph.com/svn/osg/OpenSceneGraph/[EMAIL PROTECTED]

...will give you the diff, which I've also attached. SVN rocks. :)

On Fri, 2007-07-13 at 21:46 +0100, Robert Osfield wrote:
> Hi Adrian,
> 
> I did some testing this evening and found that when running in the
> CullThreadPerCameraDrawThreadPerContext thread model I get a hang on
> start up.  All the rest of the threading models works fine,
> CullThreadPerCameraDrawThreadPerContext even works fine when I run on
> a single head.
> 
> I have isolated this particular problem to being in revision 7118 and
> later, 7117 works fine in all threading models, at least on my
> machine.  I don't know if this issue is related to the one you've seen
> but perhaps it might be and you'll at least know which revision to go
> back to.
> 
> The changes I made since 7117 aren't major changes, I don't know yet
> exactly what went wrong, but at least I know roughly where to look.
> I'll do this over the weekend.
> 
> Robert.
> _______________________________________________
> osg-users mailing list
> osg-users@openscenegraph.net
> http://openscenegraph.net/mailman/listinfo/osg-users
> http://www.openscenegraph.org/
> 
Index: include/osgUtil/GLObjectsVisitor
===================================================================
--- include/osgUtil/GLObjectsVisitor	(revision 7117)
+++ include/osgUtil/GLObjectsVisitor	(revision 7118)
@@ -113,6 +113,20 @@
 
 };
 
+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
Index: include/osg/OperationThread
===================================================================
--- include/osg/OperationThread	(revision 7117)
+++ include/osg/OperationThread	(revision 7118)
@@ -130,7 +130,7 @@
         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
 {
     public:
Index: include/osg/GraphicsThread
===================================================================
--- include/osg/GraphicsThread	(revision 7117)
+++ include/osg/GraphicsThread	(revision 7118)
@@ -18,6 +18,9 @@
 
 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
 {
     public:
@@ -28,17 +31,30 @@
         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.*/
-struct OSG_EXPORT SwapBuffersOperation : public Operation
+struct OSG_EXPORT SwapBuffersOperation : public GraphicsOperation
 {
     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.*/
-struct OSG_EXPORT BarrierOperation : public Operation, public OpenThreads::Barrier
+struct OSG_EXPORT BarrierOperation : public GraphicsOperation, public OpenThreads::Barrier
 {
     enum PreBlockOp
     {
@@ -48,36 +64,36 @@
     };
 
     BarrierOperation(int numThreads, PreBlockOp op=NO_OPERATION):
-        Operation("Barrier", true),
+        GraphicsOperation("Barrier", true),
         OpenThreads::Barrier(numThreads),
         _preBlockOp(op) {}
 
     virtual void release();
 
-    virtual void operator () (Object* context);
+    virtual void operator () (GraphicsContext* context);
     
     PreBlockOp _preBlockOp;
 };
 
 /** 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.*/
-struct OSG_EXPORT ReleaseContext_Block_MakeCurrentOperation : public Operation, public RefBlock
+struct OSG_EXPORT ReleaseContext_Block_MakeCurrentOperation : public GraphicsOperation, public RefBlock
 {
     ReleaseContext_Block_MakeCurrentOperation():
-        Operation("ReleaseContext_Block_MakeCurrent", false) {}
+        GraphicsOperation("ReleaseContext_Block_MakeCurrent", false) {}
 
     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();
 
     virtual void release();
 
-    virtual void operator () (Object*);
+    virtual void operator () (GraphicsContext*);
 };
 
 }
Index: include/osgDB/DatabasePager
===================================================================
--- include/osgDB/DatabasePager	(revision 7117)
+++ include/osgDB/DatabasePager	(revision 7118)
@@ -373,11 +373,11 @@
         double                          _minimumTimeAvailableForGLCompileAndDeletePerFrame;
         unsigned int                    _maximumNumOfObjectsToCompilePerFrame;
         
-        struct CompileOperation : public osg::Operation
+        struct CompileOperation : public osg::GraphicsOperation
         {
             CompileOperation(DatabasePager* databasePager);
             
-            virtual void operator () (osg::Object* object);
+            virtual void operator () (osg::GraphicsContext* context);
             
             osg::observer_ptr<DatabasePager> _databasePager;
         };
Index: src/osgUtil/GLObjectsVisitor.cpp
===================================================================
--- src/osgUtil/GLObjectsVisitor.cpp	(revision 7117)
+++ src/osgUtil/GLObjectsVisitor.cpp	(revision 7118)
@@ -138,3 +138,19 @@
         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);
+}
Index: src/osg/GraphicsThread.cpp
===================================================================
--- src/osg/GraphicsThread.cpp	(revision 7117)
+++ src/osg/GraphicsThread.cpp	(revision 7118)
@@ -41,35 +41,16 @@
 
 }
 
-struct BlockOperation : public Operation, public Block
+void GraphicsOperation::operator () (Object* object)
 {
-    BlockOperation():
-        Operation("Block",false)
-    {
-        reset();
-    }
-
-    virtual void release()
-    {
-        Block::release();
-    }
-
-    virtual void operator () (Object*)
-    {
-        glFlush();
-        Block::release();
-    }
-};
-
+    osg::GraphicsContext* context = dynamic_cast<osg::GraphicsContext*>(object);
+    if (context) operator() (context);
+}
  
-void SwapBuffersOperation::operator () (Object* object)
+void SwapBuffersOperation::operator () (GraphicsContext* context)
 {
-    GraphicsContext* context = dynamic_cast<GraphicsContext*>(object);
-    if (context)
-    {
-        context->swapBuffersImplementation();
-        context->clear();
-    }
+    context->swapBuffersImplementation();
+    context->clear();
 }
 
 void BarrierOperation::release()
@@ -77,7 +58,7 @@
     Barrier::release();
 }
 
-void BarrierOperation::operator () (Object*)
+void BarrierOperation::operator () (GraphicsContext*)
 {
     if (_preBlockOp==GL_FLUSH) glFlush();
     if (_preBlockOp==GL_FINISH) glFinish();
@@ -91,11 +72,8 @@
 }
 
 
-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.
     context->releaseContext();
     
@@ -111,7 +89,7 @@
 
 
 BlockAndFlushOperation::BlockAndFlushOperation():
-    Operation("Block",false)
+    GraphicsOperation("Block",false)
 {
     reset();
 }
@@ -121,7 +99,7 @@
     Block::release();
 }
 
-void BlockAndFlushOperation::operator () (Object*)
+void BlockAndFlushOperation::operator () (GraphicsContext*)
 {
     glFlush();
     Block::release();
Index: src/osgDB/DatabasePager.cpp
===================================================================
--- src/osgDB/DatabasePager.cpp	(revision 7117)
+++ src/osgDB/DatabasePager.cpp	(revision 7118)
@@ -903,17 +903,15 @@
 
 
 DatabasePager::CompileOperation::CompileOperation(osgDB::DatabasePager* databasePager):
-    osg::Operation("DatabasePager::CompileOperation",false),
+    osg::GraphicsOperation("DatabasePager::CompileOperation",false),
     _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;
+
     if (_databasePager.valid()) _databasePager->compileAllGLObjects(*(context->getState()));
     
 }
Index: src/osgWrappers/osgUtil/GLObjectsVisitor.cpp
===================================================================
--- src/osgWrappers/osgUtil/GLObjectsVisitor.cpp	(revision 7117)
+++ src/osgWrappers/osgUtil/GLObjectsVisitor.cpp	(revision 7118)
@@ -12,6 +12,7 @@
 
 #include <osg/Drawable>
 #include <osg/Geode>
+#include <osg/GraphicsContext>
 #include <osg/Node>
 #include <osg/RenderInfo>
 #include <osg/State>
@@ -26,6 +27,15 @@
 #undef OUT
 #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)
 
 BEGIN_ENUM_REFLECTOR(osgUtil::GLObjectsVisitor::ModeValues)
Index: src/osgWrappers/osg/GraphicsThread.cpp
===================================================================
--- src/osgWrappers/osg/GraphicsThread.cpp	(revision 7117)
+++ src/osgWrappers/osg/GraphicsThread.cpp	(revision 7118)
@@ -10,6 +10,7 @@
 #include <osgIntrospection/StaticMethodInfo>
 #include <osgIntrospection/Attributes>
 
+#include <osg/GraphicsContext>
 #include <osg/GraphicsThread>
 #include <osg/Object>
 
@@ -30,7 +31,7 @@
 
 BEGIN_OBJECT_REFLECTOR(osg::BarrierOperation)
 	I_DeclaringFile("osg/GraphicsThread");
-	I_BaseType(osg::Operation);
+	I_BaseType(osg::GraphicsOperation);
 	I_BaseType(OpenThreads::Barrier);
 	I_ConstructorWithDefaults2(IN, int, numThreads, , IN, osg::BarrierOperation::PreBlockOp, op, osg::BarrierOperation::NO_OPERATION,
 	                           ____BarrierOperation__int__PreBlockOp,
@@ -46,7 +47,7 @@
 
 BEGIN_OBJECT_REFLECTOR(osg::BlockAndFlushOperation)
 	I_DeclaringFile("osg/GraphicsThread");
-	I_BaseType(osg::Operation);
+	I_BaseType(osg::GraphicsOperation);
 	I_BaseType(OpenThreads::Block);
 	I_Constructor0(____BlockAndFlushOperation,
 	               "",
@@ -58,6 +59,15 @@
 	          "");
 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)
 	I_DeclaringFile("osg/GraphicsThread");
 	I_BaseType(osg::OperationThread);
@@ -73,7 +83,7 @@
 
 BEGIN_OBJECT_REFLECTOR(osg::ReleaseContext_Block_MakeCurrentOperation)
 	I_DeclaringFile("osg/GraphicsThread");
-	I_BaseType(osg::Operation);
+	I_BaseType(osg::GraphicsOperation);
 	I_BaseType(osg::RefBlock);
 	I_Constructor0(____ReleaseContext_Block_MakeCurrentOperation,
 	               "",
@@ -81,13 +91,13 @@
 	I_Method0(void, release,
 	          Properties::VIRTUAL,
 	          __void__release,
-	          "if this operation is a barrier then release it. ",
+	          "",
 	          "");
 END_REFLECTOR
 
 BEGIN_OBJECT_REFLECTOR(osg::SwapBuffersOperation)
 	I_DeclaringFile("osg/GraphicsThread");
-	I_BaseType(osg::Operation);
+	I_BaseType(osg::GraphicsOperation);
 	I_Constructor0(____SwapBuffersOperation,
 	               "",
 	               "");
_______________________________________________
osg-users mailing list
osg-users@openscenegraph.net
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/

Reply via email to