[osg-submissions] [osg-users] Threading problem when using two viewers
Robert Osfield
robert.osfield at gmail.com
Tue Jun 3 11:34:42 PDT 2008
Hi Rudi,
As a quick note, a Viewer::makeCurrent() is inappropriate as
makeCurrent is only associated with a graphics context, rather than a
viewer. A viewer can have multiple graphics context as well - and
OpenGL only supports on thread per context so trying to do makeCurrent
on all contexts will just lead to the last one having any affect.
The hint itself should be also about whether the lazy makeCurrent() is
used - i.e. whether the app can assume that it still has its context
current on each subsequent frame.
Finally if you plan to submit code for inclusion with the OSG itself
you should post the changes through to osg-submissions so they can get
reviewed and not lost in the sea of osg-users posts.
Robert.
On Tue, Jun 3, 2008 at 6:50 PM, Wiedemann, Rudolf, OPS3
<rudolf.wiedemann at mbda-systems.de> wrote:
> Hi Robert,
>
> thank you very much for the hint!
>
> Using CompositeViewer would be better, but I need a solution with two Viewers, too.
>
> I extended the osgViewer::Viewer class as you suggested (see attachment, based on OSG revision 8402).
>
> There are three new methods:
> setMakeCurrentHint() // sets flag _makeCurrentHint
> getMakeCurrentHint()
> makeCurrent() // makes all graphics contexts current
> and method
> osgViewer::ViewerBase::frame()
> is overloaded. // osgViewer::Viewer::frame() calls "makeCurrent()" if "_makeCurrentHint" is true before calling osgViewer::ViewerBase::frame()
>
> I hope, I've done the changes correctly!
> The following test code works now with the extended osgViewer::Viewer class:
>
> #include <osg/ref_ptr>
> #include <osgDB/ReadFile>
> #include <osgViewer/Viewer>
> #include <osgGA/TrackballManipulator>
>
> int main( int argc, char * argv[] )
> {
> // read model
> osg::ref_ptr< osg::Node > model = osgDB::readNodeFile( "cow.osg" );
>
> // create viewer #1
> osg::ref_ptr< osgViewer::Viewer > viewer1 = new osgViewer::Viewer;
> viewer1->setSceneData( model.get() );
> viewer1->setUpViewInWindow( 10, 10, 400, 300 );
> viewer1->setCameraManipulator( new osgGA::TrackballManipulator() );
> viewer1->setThreadingModel( osgViewer::Viewer::SingleThreaded );
> viewer1->setMakeCurrentHint();
>
> // create viewer #2
> osg::ref_ptr< osgViewer::Viewer > viewer2 = new osgViewer::Viewer;
> viewer2->setSceneData( model.get() );
> viewer2->setUpViewInWindow( 500, 10, 200, 300 );
> viewer2->setCameraManipulator( new osgGA::TrackballManipulator() );
> viewer2->setThreadingModel( osgViewer::Viewer::SingleThreaded );
> viewer2->setMakeCurrentHint();
>
> // render
> while( ( viewer1->done() == false ) && ( viewer2->done() == false ) )
> {
> viewer1->frame();
> viewer2->frame();
> }
>
> return 0;
> }
>
> Rudi
>
> -----Ursprüngliche Nachricht-----
> Von: osg-users-bounces at lists.openscenegraph.org [mailto:osg-users-bounces at lists.openscenegraph.org] Im Auftrag von Robert Osfield
> Gesendet: Dienstag, 3. Juni 2008 16:51
> An: OpenSceneGraph Users
> Betreff: Re: [osg-users] Threading problem when using two viewers
>
> Hi Rudolf,
>
> The lazy makeCurrent() calling on each new frame is probably the cause of problem here. To fix this we'd probably need a hint to osgViewer::Viewer to always call makeCurrent on a new frame.
>
> As a general note, you should use a single CompositeViewer composed of two views, rather than two separate viewers like you have done here - your type of usage is exactly what CompositeViewer was written for.
>
> Robert.
>
> On Tue, Jun 3, 2008 at 3:20 PM, Wiedemann, Rudolf, OPS3 <rudolf.wiedemann at mbda-systems.de> wrote:
>> Hi,
>>
>> when I create two instances of "osgViewer::Viewer" in one program,
>> then the first viewer freezes (no trackball manipulation possible)
>> when setting threading model of both viewers to "SingleThreaded". Is
>> that expected behaviour and why, or is it a bug?
>> When I'm setting one or both viewer(s) to e.g. "ThreadPerContext",
>> then both viewers are working properly.
>>
>> I'm using OSG-Rev. 8402 and OpenSUSE-10.2-64.
>>
>> Thanks in advance!
>> Rudi
>>
>>
>> The following code reproduces the problem:
>>
>> #include <osg/ref_ptr>
>> #include <osgDB/ReadFile>
>> #include <osgViewer/Viewer>
>> #include <osgGA/TrackballManipulator>
>>
>> int main( int argc, char * argv[] )
>> {
>> // read model
>> osg::ref_ptr< osg::Node > model = osgDB::readNodeFile( "cow.osg" );
>>
>> // create viewer #1
>> osg::ref_ptr< osgViewer::Viewer > viewer1 = new osgViewer::Viewer;
>> viewer1->setSceneData( model.get() ); viewer1->setUpViewInWindow( 10,
>> 10, 400, 300 ); viewer1->setCameraManipulator( new
>> osgGA::TrackballManipulator() ); viewer1->setThreadingModel(
>> osgViewer::Viewer::SingleThreaded ); // viewer1->setThreadingModel(
>> osgViewer::Viewer::ThreadPerContext );
>>
>> // create viewer #2
>> osg::ref_ptr< osgViewer::Viewer > viewer2 = new osgViewer::Viewer;
>> viewer2->setSceneData( model.get() ); viewer2->setUpViewInWindow(
>> 500, 10, 200, 300 ); viewer2->setCameraManipulator( new
>> osgGA::TrackballManipulator() ); viewer2->setThreadingModel(
>> osgViewer::Viewer::SingleThreaded ); // viewer2->setThreadingModel(
>> osgViewer::Viewer::ThreadPerContext );
>>
>> // render
>> while( ( viewer1->done() == false ) && ( viewer2->done() == false ) )
>> {
>> viewer1->frame();
>> viewer2->frame();
>> }
>>
>> return 0;
>> }
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.
>> org
>>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
> _______________________________________________
> osg-submissions mailing list
> osg-submissions at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
>
>
More information about the osg-submissions
mailing list