Hi J-S,

It's interesting that opening up the windows at the start allows
things to run, this suggest that it's allocation of new OpenGL that is
problem - which is something that the resize of the GL buffers would
have done the trick.

W.r.t opening 40 windows and the app crashing - this is almost
certainly down to exhustion of OpenGL resouces.

W.r.t my machine build - I have the memory here already (6GB tripple
channel), and will be reusing a case/power supply and Gfx cards from
another machine, but the key components - the CPU and the motherboard
still haven't arrived.  They should arrive today or tomorrow.  Can't
wait to put it together.  Bit nervous about whether Linux + Gfx
drivers will install without problems, the quality of an early
motherboard bios also is a concern...

Whether the new system will work properly right away and if to does
will it reproduce the hang I don't know untill I get to testing, but
test it I will.

Robert.

On Mon, Nov 24, 2008 at 7:55 PM, Jean-Sébastien Guay
<[EMAIL PROTECTED]> wrote:
> Hi Robert,
>
> I've had a bit of time to look at this again today. Here's another
> interesting find: adding views at startup works fine. I can add over 30 of
> them (I couldn't get to 40, the program crashes, I presume because of
> exhaustion of OpenGL resources or something).
>
> Here's a modified osgviewer.cpp which demonstrates this.
>
>  <program> --create 20
>
> The default is to create a single view. Starting it up with a single view
> and then pressing 'a' at run time will make the program block after 4 to 6
> views for me. So there's something there.
>
> I also tested adding views after viewer.realize() but before viewer.run(),
> and this seems to work too. You can specify when to create the views
> (default is beforeRealize):
>
>  <program> --create 20 --beforeRealize
>
> or
>
>  <program> --create 20 --afterRealize
>
> Both work for me.
>
> So there's something going on while the viewer is running that causes the
> deadlock to occur if we add views at runtime. Adding them at any time before
> viewer.run() seems to work fine.
>
> As an aside, I've updated my graphics driver from 178.xx to 180.xx last
> Friday, but noticed no difference in this behavior.
>
>> It would be worth looking at exactly when the problem occurs - is it
>> on the stopThreading, the addView, or the startThreading or
>> thereafter?
>
> The deadlock definitely happens after the view has been added (after
> stopThreading, addView, startThreading). It looks to me that it happens on
> the first frame after adding the view.
>
> I'd really like to get to the bottom of this. When did you say you were
> going to be building your new machine? In the mean time, any chance you can
> find some time in your schedule to track down some other machine that would
> reproduce this? (JP's and Don's posts seem to indicate it can be reproduced
> on Linux on some machines...)
>
> Thanks in advance,
>
> J-S
> --
> ______________________________________________________
> Jean-Sebastien Guay    [EMAIL PROTECTED]
>                               http://www.cm-labs.com/
>                        http://whitestar02.webhop.org/
>
> /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
>  *
>  * This application is open source and may be redistributed and/or modified
>  * freely and without restriction, both in commericial and non commericial
> applications,
>  * as long as this copyright notice is maintained.
>  *
>  * This application is distributed in the hope that it will be useful,
>  * but WITHOUT ANY WARRANTY; without even the implied warranty of
>  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> */
>
> #include <osgDB/ReadFile>
> #include <osgUtil/Optimizer>
> #include <osg/CoordinateSystemNode>
>
> #include <osg/Switch>
> #include <osgText/Text>
>
> #include <osgViewer/CompositeViewer>
> #include <osgViewer/ViewerEventHandlers>
>
> #include <osgGA/TrackballManipulator>
> #include <osgGA/FlightManipulator>
> #include <osgGA/DriveManipulator>
> #include <osgGA/KeySwitchMatrixManipulator>
> #include <osgGA/StateSetManipulator>
> #include <osgGA/AnimationPathManipulator>
> #include <osgGA/TerrainManipulator>
>
> #include <iostream>
>
>
> // Forward declaration
> void addView(osgViewer::CompositeViewer* viewer, osg::Node* sceneRoot);
>
>
> class AddViewHandler : public osgGA::GUIEventHandler
> {
> public:
>    AddViewHandler(osgViewer::CompositeViewer* viewer, osg::Node* sceneRoot)
>        : _viewer(viewer), _sceneRoot(sceneRoot) {}
>
>    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter&
> aa)
>    {
>        if (ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN &&
> ea.getKey()== 'a')
>        {
>            addView(_viewer.get(), _sceneRoot);
>            return true;
>        }
>
>        return false;
>    }
>
> protected:
>    osg::observer_ptr<osgViewer::CompositeViewer> _viewer;
>    osg::ref_ptr<osg::Node>                  _sceneRoot;
> };
>
>
> void addEventHandlers(osgViewer::View* view, osgViewer::CompositeViewer*
> viewer, osg::Node* sceneRoot)
> {
>    // set up the camera manipulators.
>    view->setCameraManipulator( new osgGA::TrackballManipulator() );
>
>    // add the state manipulator
>    view->addEventHandler( new
> osgGA::StateSetManipulator(view->getCamera()->getOrCreateStateSet()) );
>
>    // add the thread model handler
>    view->addEventHandler(new osgViewer::ThreadingHandler);
>
>    // add the window size toggle handler
>    view->addEventHandler(new osgViewer::WindowSizeHandler);
>
>    // add the stats handler
>    view->addEventHandler(new osgViewer::StatsHandler);
>
>    // add the record camera path handler
>    view->addEventHandler(new osgViewer::RecordCameraPathHandler);
>
>    // add the LOD Scale handler
>    view->addEventHandler(new osgViewer::LODScaleHandler);
>
>    // add the screen capture handler
>    view->addEventHandler(new osgViewer::ScreenCaptureHandler);
>
>    view->addEventHandler(new AddViewHandler(viewer, sceneRoot));
> }
>
>
> void addView(osgViewer::CompositeViewer* viewer, osg::Node* sceneRoot)
> {
>    osgViewer::View* view = new osgViewer::View;
>
>    view->setUpViewInWindow(50, 50, 800, 600);
>    view->getCamera()->getGraphicsContext()->realize();
>
>    view->setSceneData(sceneRoot);
>    addEventHandlers(view, viewer, sceneRoot);
>
>    bool threadsWereRunning = viewer->areThreadsRunning();
>    if (threadsWereRunning) viewer->stopThreading();
>
>    viewer->addView(view);
>
>
>  
> osg::notify(osg::NOTICE)<<"osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts()="<<
>  
> osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts()<<std::endl;
>
>    view->getSceneData()->setThreadSafeRefUnref(true);
>
>  
> view->getSceneData()->resizeGLObjectBuffers(osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts());
>
>    if (threadsWereRunning) viewer->startThreading();
> }
>
>
> int main(int argc, char** argv)
> {
>    // use an ArgumentParser object to manage the program arguments.
>    osg::ArgumentParser arguments(&argc,argv);
>
>
>  
> arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
>
>  
> arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+"
> is the standard OpenSceneGraph example which loads and visualises 3d
> models.");
>
>  
> arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+"
> [options] filename ...");
>    arguments.getApplicationUsage()->addCommandLineOption("--image
> <filename>","Load an image and render it on a quad");
>    arguments.getApplicationUsage()->addCommandLineOption("--dem
> <filename>","Load an image/DEM and render it on a HeightField");
>    arguments.getApplicationUsage()->addCommandLineOption("--login <url>
> <username> <password>","Provide authentication information for http file
> access.");
>
>    osgViewer::CompositeViewer viewer(arguments);
>
>    unsigned int helpType = 0;
>    if ((helpType = arguments.readHelpType()))
>    {
>        arguments.getApplicationUsage()->write(std::cout, helpType);
>        return 1;
>    }
>
>    // report any errors if they have occurred when parsing the program
> arguments.
>    if (arguments.errors())
>    {
>        arguments.writeErrorMessages(std::cout);
>        return 1;
>    }
>
>    if (arguments.argc()<=1)
>    {
>
>  
> arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
>        return 1;
>    }
>
>    std::string url, username, password;
>    while(arguments.read("--login",url, username, password))
>    {
>        if (!osgDB::Registry::instance()->getAuthenticationMap())
>        {
>            osgDB::Registry::instance()->setAuthenticationMap(new
> osgDB::AuthenticationMap);
>
>  
> osgDB::Registry::instance()->getAuthenticationMap()->addAuthenticationDetails(
>                url,
>                new osgDB::AuthenticationDetails(username, password)
>            );
>        }
>    }
>
>    unsigned int createViews = 1;
>    while (arguments.read("--create", createViews));
>
>    bool beforeRealize = true;
>    while (arguments.read("--beforeRealize")) beforeRealize = true;
>    while (arguments.read("--afterRealize")) beforeRealize = false;
>
>    // load the data
>    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
>    if (!loadedModel)
>    {
>        std::cout << arguments.getApplicationName() <<": No data loaded" <<
> std::endl;
>        return 1;
>    }
>
>    // any option left unread are converted into errors to write out later.
>    arguments.reportRemainingOptionsAsUnrecognized();
>
>    // report any errors if they have occurred when parsing the program
> arguments.
>    if (arguments.errors())
>    {
>        arguments.writeErrorMessages(std::cout);
>        return 1;
>    }
>
>
>    if (beforeRealize)
>    {
>        // Create n views at startup, before viewer.realize()
>        for (unsigned int i = 0; i < createViews; i++)
>        {
>            addView(&viewer, loadedModel.get());
>        }
>    }
>
>    viewer.realize();
>
>    if (!beforeRealize)
>    {
>        // Create n views at startup, after viewer.realize()
>        for (unsigned int i = 0; i < createViews; i++)
>        {
>            addView(&viewer, loadedModel.get());
>        }
>
>        // Need to set done to false and re-call realize().
>        viewer.setDone(false);
>        viewer.realize();
>    }
>
>    return viewer.run();
> }
>
> _______________________________________________
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to