Changeset 7074

Show
Ignore:
Timestamp:
07/06/07 15:08:51 (10 years ago)
Author:
robert
Message:

Added include/osg/GLObjects + .cpp which provide osg::flush*DeletedGLObjects() methods.

Added and cleaned up DeleteHandler? calls in osgViewer to help avoid crashes on exit.

Changed DatabasePager? across to dynamically checcking osg::getCompileContext(..)

Updated wrappers.

Location:
OpenSceneGraph/trunk
Files:
2 added
11 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/applications/osgviewer/osgviewer.cpp

    r7071 r7074  
    158158        int processNum = 0; 
    159159 
    160         osgDB::DatabasePager* dp = viewer.getScene()->getDatabasePager(); 
    161  
    162160        for(unsigned int i=0; i<osg::GraphicsContext::getMaxContextID(); ++i) 
    163161        { 
     
    172170                ++processNum; 
    173171            } 
    174  
    175             dp->addCompileGraphicsContext(gc); 
    176172        } 
    177173    } 
  • OpenSceneGraph/trunk/examples/osgteapot/osgteapot.cpp

    r7053 r7074  
    333333int main(int , char **) 
    334334{ 
    335 #if 1     
     335#if 1 
    336336 
    337337    // create viewer on heap as a test, this looks to be causing problems 
     
    345345    viewer->setSceneData( createTeapot() ); 
    346346 
    347     // create the windows and run the threads. 
    348347    return viewer->run(); 
    349348     
     
    358357    // create the windows and run the threads. 
    359358    return viewer.run(); 
    360  
    361359#endif 
    362360 
  • OpenSceneGraph/trunk/include/osgDB/DatabasePager

    r7017 r7074  
    219219        } 
    220220         
    221          
    222         /** Add a graphics context that should be used to compile/delete OpenGL objects.*/ 
    223         void addCompileGraphicsContext(osg::GraphicsContext* gc); 
    224          
    225         /** Removed a graphics context that should be used to compile/delete OpenGL objects.*/ 
    226         void removeCompileGraphicsContext(osg::GraphicsContext* gc); 
    227  
    228          
    229221        /** Turn the compilation of rendering objects for specfied graphics context on (true) or off(false). */ 
    230222        void setCompileGLObjectsForContextID(unsigned int contextID, bool on); 
     
    232224        /** Get whether the compilation of rendering objects for specfied graphics context on (true) or off(false). */ 
    233225        bool getCompileGLObjectsForContextID(unsigned int contextID); 
    234  
    235226 
    236227        /** Rerturn true if an external draw thread should call compileGLObjects(..) or not.*/ 
     
    376367 
    377368        ActiveGraphicsContexts          _activeGraphicsContexts; 
    378         CompileGraphicsContexts         _compileGraphicsContexts; 
     369        // CompileGraphicsContexts         _compileGraphicsContexts; 
    379370         
    380371        bool                            _doPreCompile; 
  • OpenSceneGraph/trunk/src/osg/CMakeLists.txt

    r7047 r7074  
    6060    ${HEADER_PATH}/GL2Extensions 
    6161    ${HEADER_PATH}/GLExtensions 
     62    ${HEADER_PATH}/GLObjects 
    6263    ${HEADER_PATH}/GLU 
    6364    ${HEADER_PATH}/Geode 
     
    213214    FrontFace.cpp 
    214215    GLExtensions.cpp 
     216    GLObjects.cpp 
    215217    Geode.cpp 
    216218    Geometry.cpp 
  • OpenSceneGraph/trunk/src/osg/GraphicsContext.cpp

    r7073 r7074  
    281281GraphicsContext* GraphicsContext::getCompileContext(unsigned int contextID) 
    282282{ 
    283     osg::notify(osg::NOTICE)<<"GraphicsContext::getCompileContext "<<contextID<<std::endl; 
     283    //osg::notify(osg::NOTICE)<<"GraphicsContext::getCompileContext "<<contextID<<std::endl; 
    284284    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_contextIDMapMutex); 
    285285    return s_contextIDMap[contextID]._compileContext.get(); 
  • OpenSceneGraph/trunk/src/osgDB/DatabasePager.cpp

    r7038 r7074  
    293293            startThread(); 
    294294        } 
    295                  
    296295    } 
    297296} 
     
    595594                } 
    596595                 
    597                 if (loadedObjectsNeedToBeCompiled && !_compileGraphicsContexts.empty()) 
    598                 { 
    599                     for(CompileGraphicsContexts::iterator citr = _compileGraphicsContexts.begin(); 
    600                         citr != _compileGraphicsContexts.end(); 
    601                         ++citr) 
     596                if (loadedObjectsNeedToBeCompiled) 
     597                { 
     598                    for(ActiveGraphicsContexts::iterator itr = _activeGraphicsContexts.begin(); 
     599                        itr != _activeGraphicsContexts.end(); 
     600                        ++itr) 
    602601                    { 
    603                         osg::GraphicsContext* gc = citr->get(); 
     602                        osg::GraphicsContext* gc = osg::GraphicsContext::getCompileContext(*itr); 
    604603                        if (gc) 
    605604                        {    
    606                             osg::OperationsThread* gt = gc->getGraphicsThread();                             
    607                             if (gt) gt->add(new DatabasePager::CompileOperation(this)); 
     605                            osg::OperationsThread* gt = gc->getGraphicsThread(); 
     606                            if (gt) 
     607                            { 
     608                                gt->add(new DatabasePager::CompileOperation(this)); 
     609                            } 
    608610                            else 
    609611                            { 
    610612                                gc->makeCurrent(); 
    611                                  
    612                                 // osg::notify(osg::NOTICE)<<"Database pager thread compiling"<<std::endl; 
    613613                                 
    614614                                compileAllGLObjects(*(gc->getState())); 
     
    618618                        } 
    619619                    } 
     620 
    620621                    // osg::notify(osg::NOTICE)<<"Done compiling in paging thread"<<std::endl;                    
    621622                } 
     
    884885} 
    885886 
    886 void DatabasePager::addCompileGraphicsContext(osg::GraphicsContext* gc) 
    887 { 
    888     for(CompileGraphicsContexts::iterator itr = _compileGraphicsContexts.begin(); 
    889         itr != _compileGraphicsContexts.end(); 
    890         ++itr) 
    891     { 
    892         if (*itr == gc) 
    893         { 
    894             return; 
    895         } 
    896     } 
    897      
    898     _compileGraphicsContexts.push_back(gc); 
    899      
    900     setCompileGLObjectsForContextID(gc->getState()->getContextID(),true); 
    901 } 
    902  
    903 void DatabasePager::removeCompileGraphicsContext(osg::GraphicsContext* gc) 
    904 { 
    905     for(CompileGraphicsContexts::iterator itr = _compileGraphicsContexts.begin(); 
    906         itr != _compileGraphicsContexts.end(); 
    907         ++itr) 
    908     { 
    909         if (*itr == gc) 
    910         { 
    911             _compileGraphicsContexts.erase(itr); 
    912             return; 
    913         } 
    914     } 
    915 } 
    916  
    917887void DatabasePager::setCompileGLObjectsForContextID(unsigned int contextID, bool on) 
    918888{ 
     
    952922{ 
    953923    if (_activeGraphicsContexts.count(contextID)==0) return false; 
    954      
    955     for(CompileGraphicsContexts::const_iterator citr = _compileGraphicsContexts.begin(); 
    956         citr != _compileGraphicsContexts.end(); 
    957         ++citr) 
    958     { 
    959         const osg::GraphicsContext* gc = citr->get(); 
    960         if (gc && gc->getState()->getContextID()==contextID) return false; 
    961     } 
    962  
    963     return true;     
     924 
     925    return osg::GraphicsContext::getCompileContext(contextID)==0; 
    964926} 
    965927 
  • OpenSceneGraph/trunk/src/osgUtil/SceneView.cpp

    r7062 r7074  
    1717#include <osg/Timer> 
    1818#include <osg/GLExtensions> 
     19#include <osg/GLObjects> 
    1920#include <osg/Notify> 
    2021#include <osg/Texture> 
    21 #include <osg/VertexProgram> 
    22 #include <osg/FragmentProgram> 
    2322#include <osg/AlphaFunc> 
    2423#include <osg/TexEnv> 
     
    2625#include <osg/LightModel> 
    2726#include <osg/CollectOccludersVisitor> 
    28 #include <osg/Shader> 
    29 #include <osg/BufferObject> 
    3027 
    3128#include <osg/GLU> 
     
    836833    _requiresFlush = false; 
    837834     
    838     double availableTime = 100.0f; 
     835    osg::flushAllDeletedGLObjects(getState()->getContextID()); 
     836 } 
     837 
     838void SceneView::flushDeletedGLObjects(double& availableTime) 
     839{ 
     840    osg::State* state = _renderInfo.getState(); 
     841 
     842    _requiresFlush = false; 
     843 
    839844    double currentTime = state->getFrameStamp()?state->getFrameStamp()->getReferenceTime():0.0; 
    840      
    841     osg::FrameBufferObject::flushDeletedFrameBufferObjects(state->getContextID(),currentTime,availableTime); 
    842     osg::RenderBuffer::flushDeletedRenderBuffers(state->getContextID(),currentTime,availableTime); 
    843     osg::Texture::flushAllDeletedTextureObjects(state->getContextID()); 
    844     osg::Drawable::flushAllDeletedDisplayLists(state->getContextID()); 
    845     osg::Drawable::flushDeletedVertexBufferObjects(state->getContextID(),currentTime,availableTime); 
    846     osg::VertexProgram::flushDeletedVertexProgramObjects(state->getContextID(),currentTime,availableTime); 
    847     osg::FragmentProgram::flushDeletedFragmentProgramObjects(state->getContextID(),currentTime,availableTime); 
    848     osg::Program::flushDeletedGlPrograms(state->getContextID(),currentTime,availableTime); 
    849     osg::Shader::flushDeletedGlShaders(state->getContextID(),currentTime,availableTime); 
    850     osg::BufferObject::flushDeletedBufferObjects(state->getContextID(),currentTime,availableTime); 
    851  } 
    852  
    853 void SceneView::flushDeletedGLObjects(double& availableTime) 
    854 { 
    855     osg::State* state = _renderInfo.getState(); 
    856  
    857     _requiresFlush = false; 
    858  
    859     double currentTime = state->getFrameStamp()?state->getFrameStamp()->getReferenceTime():0.0; 
    860  
    861     osg::FrameBufferObject::flushDeletedFrameBufferObjects(state->getContextID(),currentTime,availableTime); 
    862     osg::RenderBuffer::flushDeletedRenderBuffers(state->getContextID(),currentTime,availableTime); 
    863     osg::Texture::flushDeletedTextureObjects(state->getContextID(),currentTime,availableTime); 
    864     osg::Drawable::flushDeletedDisplayLists(state->getContextID(),availableTime); 
    865     osg::Drawable::flushDeletedVertexBufferObjects(state->getContextID(),currentTime,availableTime); 
    866     osg::VertexProgram::flushDeletedVertexProgramObjects(state->getContextID(),currentTime,availableTime); 
    867     osg::FragmentProgram::flushDeletedFragmentProgramObjects(state->getContextID(),currentTime,availableTime); 
    868     osg::Program::flushDeletedGlPrograms(state->getContextID(),currentTime,availableTime); 
    869     osg::Shader::flushDeletedGlShaders(state->getContextID(),currentTime,availableTime); 
    870     osg::BufferObject::flushDeletedBufferObjects(state->getContextID(),currentTime,availableTime); 
     845 
     846    osg::flushDeletedGLObjects(getState()->getContextID(), currentTime, availableTime); 
    871847} 
    872848 
  • OpenSceneGraph/trunk/src/osgViewer/GraphicsWindowCarbon.cpp

    r7066 r7074  
    344344     
    345345    /** dtor */ 
    346     ~OSXCarbonWindowingSystemInterface() { 
    347         if (_displayIds) 
    348             delete[] _displayIds; 
     346    ~OSXCarbonWindowingSystemInterface() 
     347    { 
     348        if (osg::Referenced::getDeleteHandler()) 
     349        { 
     350            osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0); 
     351            osg::Referenced::getDeleteHandler()->flushAll(); 
     352        } 
     353 
     354        if (_displayIds) delete[] _displayIds; 
    349355        _displayIds = NULL; 
    350356    } 
     
    11351141    ~RegisterWindowingSystemInterfaceProxy() 
    11361142    { 
     1143        if (osg::Referenced::getDeleteHandler()) 
     1144        { 
     1145            osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0); 
     1146            osg::Referenced::getDeleteHandler()->flushAll(); 
     1147        } 
     1148 
    11371149        osg::GraphicsContext::setWindowingSystemInterface(0); 
    11381150    } 
  • OpenSceneGraph/trunk/src/osgViewer/GraphicsWindowWin32.cpp

    r7067 r7074  
    568568Win32WindowingSystem::~Win32WindowingSystem() 
    569569{ 
     570    if (osg::Referenced::getDeleteHandler()) 
     571    { 
     572        osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0); 
     573        osg::Referenced::getDeleteHandler()->flushAll(); 
     574    } 
     575     
    570576    unregisterWindowClasses(); 
    571577} 
     
    21852191    ~RegisterWindowingSystemInterfaceProxy() 
    21862192    { 
     2193        if (osg::Referenced::getDeleteHandler()) 
     2194        { 
     2195            osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0); 
     2196            osg::Referenced::getDeleteHandler()->flushAll(); 
     2197        } 
     2198 
    21872199        osg::GraphicsContext::setWindowingSystemInterface(0); 
    21882200    } 
  • OpenSceneGraph/trunk/src/osgViewer/GraphicsWindowX11.cpp

    r7071 r7074  
    1919#include <osgViewer/api/X11/GraphicsWindowX11> 
    2020#include <osgViewer/api/X11/PixelBufferX11> 
     21 
     22#include <osg/DeleteHandler> 
    2123 
    2224#include <X11/Xlib.h> 
     
    11791181    ~X11WindowingSystemInterface() 
    11801182    { 
     1183        if (osg::Referenced::getDeleteHandler()) 
     1184        { 
     1185            osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0); 
     1186            osg::Referenced::getDeleteHandler()->flushAll(); 
     1187        } 
     1188 
    11811189        //osg::notify(osg::NOTICE)<<"~X11WindowingSystemInterface()"<<std::endl; 
    11821190        XSetErrorHandler(0); 
     
    12521260    { 
    12531261        osg::notify(osg::INFO)<<"~RegisterWindowingSystemInterfaceProxy()"<<std::endl; 
     1262 
     1263        if (osg::Referenced::getDeleteHandler()) 
     1264        { 
     1265            osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0); 
     1266            osg::Referenced::getDeleteHandler()->flushAll(); 
     1267        } 
     1268 
    12541269        osg::GraphicsContext::setWindowingSystemInterface(0); 
     1270 
    12551271    } 
    12561272}; 
  • OpenSceneGraph/trunk/src/osgWrappers/osgDB/DatabasePager.cpp

    r7024 r7074  
    260260                  "Merge the changes to the scene graph by calling calling removeExpiredSubgraphs then addLoadedDataToSceneGraph. ", 
    261261                  "Note, must only be called from single thread update phase. "); 
    262         I_Method1(void, addCompileGraphicsContext, IN, osg::GraphicsContext *, gc, 
    263                   Properties::NON_VIRTUAL, 
    264                   __void__addCompileGraphicsContext__osg_GraphicsContext_P1, 
    265                   "Add a graphics context that should be used to compile/delete OpenGL objects. ", 
    266                   ""); 
    267         I_Method1(void, removeCompileGraphicsContext, IN, osg::GraphicsContext *, gc, 
    268                   Properties::NON_VIRTUAL, 
    269                   __void__removeCompileGraphicsContext__osg_GraphicsContext_P1, 
    270                   "Removed a graphics context that should be used to compile/delete OpenGL objects. ", 
    271                   ""); 
    272262        I_Method2(void, setCompileGLObjectsForContextID, IN, unsigned int, contextID, IN, bool, on, 
    273263                  Properties::NON_VIRTUAL,