Hi Mark,

I've just re-read the thread I'm I do know that I've done some work on
the management of contexts front but I can't recall if this was prior
to 2.6.0 or after.

I'm a bit overload with prep for 2.8 right nowso could you have a look
at the svn/tunk or 2.7.7 version of the OSG to see that address your
issue as there is reasonable chance that it might.  Looking at the svn
logs for files such GraphicsContext.cpp and Camera.cpp and in
osgViewer might give you hints about what changes I've done on this
topic (the commit messages all mention what the work was).

Robert.

On Mon, Dec 15, 2008 at 5:14 PM, Mark Sciabica <[email protected]> wrote:
> Hi Robert,
>
> I'm using version 2.6.0.
>
> Mark
>
> Robert Osfield wrote:
>
> Hi Mark,
>
> Thanks for the test code.  What version of the OSG are you using?
>
> Robert.
>
> On Thu, Dec 11, 2008 at 10:17 PM, Mark Sciabica <[email protected]>
> wrote:
>
>
> Hi Robert,
>
> I was testing how osg handled changing a texture's image when the texture
> was used in multiple viewers when I ran into the problem. Attached is my
> test code. Closing one of the windows unexpectedly reloaded the texture in
> the other window.
>
> My texture testing exposed another bug when changing the image attached to a
> texture. I'll provide a description and sample in a separate e-mail.
>
> Mark
>
>
> Robert Osfield wrote:
>
> Hi Mark,
>
> Could you modify one of the OSG examples to recreate this issue, once
> I can recreate it at my end I'll be able to look into solve the bug.
>
> Robert.
>
> On Thu, Dec 11, 2008 at 7:44 PM, Mark Sciabica <[email protected]> wrote:
>
>
> I encountered some unexpected behavior when a Viewer is destroyed. When the
> viewer is destructing, it destroys its contained camera, which removes
> itself from its graphics context. During the removal process, the graphics
> context calls releaseGLObjects on the camera's children, passing in the
> GraphicsContext's _state member as a parameter. The problem is that at this
> point, the state has been already been reset to zero so that
> releaseGLObjects releases objects for ALL contextIDs. This will cause all
> objects that are used in multiple contexts to reload whenever a Viewer
> window is closed. This is potentially expensive and should be avoided if
> possible.
>
> It appears that GraphicsContext::close already releases the GL objects from
> the relevant cameras so it may be that this call is redundant. Perhaps
> GraphicsContext::removeCamera can simply not call releaseGLObjects if it
> does not have a valid _state object. This fix seems to work for my code, but
> I'm using a modified version of osg that isn't dependent on cameras for
> cleanup of OpenGL resources.
>
>
> Mark
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
> #include <osg/Texture2D>
> #include <osg/Geometry>
>
> #include <osgViewer/Viewer>
> #include <osgGA/TrackballManipulator>
>
> int main()
> {
>    osg::ref_ptr<osg::Texture2D> texture1 = new osg::Texture2D;
>    osg::ref_ptr<osg::Image> images[4];
>    static unsigned char bytes[16] = {
>        0xff, 0x00, 0x00, 0xff,
>        0x00, 0xff, 0x00, 0xff,
>        0x00, 0x00, 0xff, 0xff,
>        0xff, 0x00, 0xff, 0xff,
>    };
>    for( int i = 0; i < 4; ++i )
>    {
>        images[i] = new osg::Image;
>        images[i]->setImage(i+1, 1, 1, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE,
> &bytes[0], osg::Image::NO_DELETE, 1);
>    }
>
>    osg::ref_ptr<osg::Geode> geode = new osg::Geode();
>    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
>    geode->addDrawable(geom.get());
>
>    osg::ref_ptr<osg::Vec3Array> pVertices = new osg::Vec3Array;
>    pVertices->push_back( osg::Vec3(0, 0, 0) );
>    pVertices->push_back( osg::Vec3(0, 0, 1) );
>    pVertices->push_back( osg::Vec3(1, 0, 1) );
>    pVertices->push_back( osg::Vec3(1, 0, 0) );
>    geom->setVertexArray(pVertices.get());
>
>    osg::ref_ptr<osg::Vec2Array> pTexCoords = new osg::Vec2Array;
>    pTexCoords->push_back( osg::Vec2(0, 0) );
>    pTexCoords->push_back( osg::Vec2(0, 1) );
>    pTexCoords->push_back( osg::Vec2(1, 1) );
>    pTexCoords->push_back( osg::Vec2(1, 0) );
>    geom->setTexCoordArray(0, pTexCoords.get());
>    osg::ref_ptr<osg::DrawArrays> pDrawArrays = new osg::DrawArrays(GL_QUADS,
> 0, 4);
>    geom->addPrimitiveSet(pDrawArrays.get());
>
>    osg::StateSet* stateset = new osg::StateSet();
>    stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
>    stateset->setTextureAttributeAndModes(0, texture1.get(),
> osg::StateAttribute::ON);
>    geode->setStateSet( stateset );
>    texture1->setImage(images[1].get());
>    texture1->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
>    texture1->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
>    texture1->setResizeNonPowerOfTwoHint(false);
>    texture1->setFilter( osg::Texture::MAG_FILTER, osg::Texture::NEAREST );
>    texture1->setFilter( osg::Texture::MIN_FILTER, osg::Texture::NEAREST );
>
>
>    osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer;
>    osg::ref_ptr<osgViewer::Viewer> viewer2 = new osgViewer::Viewer;
>    viewer1->setUpViewInWindow(20, 50, 200, 200);
>    viewer2->setUpViewInWindow(240, 300, 200, 200);
>    viewer1->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
>    viewer2->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
>
>    viewer1->setSceneData( geode.get() );
>    viewer2->setSceneData( geode.get() );
>
>    viewer1->setCameraManipulator(new osgGA::TrackballManipulator());
>    viewer2->setCameraManipulator(new osgGA::TrackballManipulator());
>
>    int nFrame = 0;
>    while( viewer1.get() || viewer2.get() )
>    {
>        if( nFrame == 1 )
>        {
>            texture1->setImage(images[2].get());
>        }
>
>        if( viewer1.get() )
>        {
>            if( !viewer1->done() )
>                viewer1->frame();
>            else
>                viewer1 = 0;
>        }
>
>        if( viewer2.get() )
>        {
>            if( !viewer2->done() )
>                viewer2->frame();
>            else
>                viewer2 = 0;
>        }
>
>        ++nFrame;
>    }
>
>    return 0;
> }
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to