<div dir="ltr"><div>Hi Chris,</div><div><br></div><div>I have spent the day merging submissions, I have a bit more to do, then I'll see if I can recreate the bug with your latest test program, if I don't get to it today, I'll have a bash tomorrow before I head away for a family break.  What versions of the OSG have you tested with this test program?  What versions of the OSG should I expect to see problems?<br></div><div><br></div><div>Cheers,<br></div><div>Robert.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 1 Jul 2019 at 03:02, Chris Djali <<a href="mailto:krizdjali@gmail.com">krizdjali@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
Hopefully this example illustrates the underlying problem with osgText::Text::releaseGLObjects without the multiple viewer schenanigans in my previous example:<br>
<br>
<br>
Code:<br>
<br>
#include <osg/AutoTransform><br>
#include <osgGA/TrackballManipulator><br>
#include <osgText/Text><br>
#include <osgViewer/Viewer><br>
<br>
<br>
<br>
int main()<br>
{<br>
    osgViewer::Viewer viewer;<br>
    // Single-threaded mode so we don't need to worry about things still being used by the draw traversal<br>
    viewer.setThreadingModel(osgViewer::ViewerBase::SingleThreaded);<br>
<br>
    // Use an auto transform so the text actually faces the screen<br>
    osg::ref_ptr<osg::AutoTransform> scene = new osg::AutoTransform();<br>
    scene->setAutoRotateMode(osg::AutoTransform::ROTATE_TO_SCREEN);<br>
    viewer.setSceneData(scene);<br>
<br>
    // Add two text nodes sharing the same font<br>
    osg::ref_ptr<osgText::Font> font = osgText::readRefFontFile("trebuc.ttf");<br>
<br>
    osg::ref_ptr<osgText::Text> text1 = new osgText::Text();<br>
    text1->setFont(font);<br>
    text1->setText("text1");<br>
    scene->addChild(text1);<br>
<br>
    osg::ref_ptr<osgText::Text> text2 = new osgText::Text();<br>
    text2->setFont(font);<br>
    text2->setText("text2");<br>
    scene->addChild(text2);<br>
<br>
    // Display one or more frames<br>
    viewer.setCameraManipulator(new osgGA::TrackballManipulator());<br>
    for (int i = 0; i < 100; ++i)<br>
        viewer.frame();<br>
<br>
    // Remove a text node<br>
    scene->removeChild(text1);<br>
<br>
    // Pick which path depending on whether we prefer leaks or rebuilding things we're still using and potential errors<br>
    if (true)<br>
    {<br>
        text1->releaseGLObjects();<br>
        // text2 must now compile its program again - osg::Program::compileGLObjects is called the next frame.<br>
        // Also, the glyph texture (which text2 still needs) is added to the pending orphaned texture list.<br>
        // I'm not sure how OSG would normally delete orphaned textures, so I can't trigger that, but I imagine OSG doesn't keep them all around forever.<br>
    }<br>
    else<br>
    {<br>
        // text2 can still use its program and the glyph texture, but text1's objects leak.<br>
    }<br>
<br>
    text1 = nullptr;<br>
<br>
    return viewer.run();<br>
}<br>
<br>
<br>
<br>
<br>
All that happens here is we create a viewer, add two text nodes with the same font, and 100 frames later, remove one of them again. The text node that remains has to recompile its shader program (a very minor but unnecessary performance hit) and its glyph texture ends up in the orphaned texture list (which I'm pretty sure means it could be deleted at any time).<br>
<br>
If I knew how OSG typically cleans up orphaned textures, I could add extra steps to this and make it actually produce OpenGL errors when the texture is deleted, but as-is it just hangs around in the orphaned list indefinitely.<br>
<br>
Cheers,<br>
Chris<br>
<br>
------------------<br>
Read this topic online here:<br>
<a href="http://forum.openscenegraph.org/viewtopic.php?p=76345#76345" rel="noreferrer" target="_blank">http://forum.openscenegraph.org/viewtopic.php?p=76345#76345</a><br>
<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org" target="_blank">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" rel="noreferrer" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</blockquote></div>