Show
Ignore:
Timestamp:
09/22/09 20:45:24 (5 years ago)
Author:
robert
Message:

Preliminary work on support for a texture object pool that is designed to help manage resources down the GPU more tightly.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgViewer/CompositeViewer.cpp

    r10520 r10588  
    1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield  
     1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield 
    22 * 
    3  * This library is open source and may be redistributed and/or modified under   
    4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or  
     3 * This library is open source and may be redistributed and/or modified under 
     4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or 
    55 * (at your option) any later version.  The full license is in LICENSE file 
    66 * included with this distribution, and on the openscenegraph.org website. 
    7  *  
     7 * 
    88 * This library is distributed in the hope that it will be useful, 
    99 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
     10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1111 * OpenSceneGraph Public License for more details. 
    1212*/ 
     
    8585    _frameStamp->setReferenceTime(0); 
    8686    _frameStamp->setSimulationTime(0); 
    87      
     87 
    8888    _eventVisitor = new osgGA::EventVisitor; 
    8989    _eventVisitor->setFrameStamp(_frameStamp.get()); 
    90      
     90 
    9191    _updateVisitor = new osgUtil::UpdateVisitor; 
    9292    _updateVisitor->setFrameStamp(_frameStamp.get()); 
     
    100100 
    101101    stopThreading(); 
    102      
     102 
    103103    Scenes scenes; 
    104104    getScenes(scenes); 
    105      
     105 
    106106    for(Scenes::iterator sitr = scenes.begin(); 
    107107        sitr != scenes.end(); 
     
    149149 
    150150    bool alreadyRealized = isRealized(); 
    151      
     151 
    152152    bool threadsWereRunning = _threadsRunning; 
    153153    if (threadsWereRunning) stopThreading(); 
    154154 
    155155    _views.push_back(view); 
    156      
     156 
    157157    view->_viewerBase = this; 
    158      
     158 
    159159    if (view->getSceneData()) 
    160     {         
     160    { 
    161161        // make sure that existing scene graph objects are allocated with thread safe ref/unref 
    162         if (getThreadingModel()!=ViewerBase::SingleThreaded)  
     162        if (getThreadingModel()!=ViewerBase::SingleThreaded) 
    163163        { 
    164164            view->getSceneData()->setThreadSafeRefUnref(true); 
    165165        } 
    166          
     166 
    167167        // update the scene graph so that it has enough GL object buffer memory for the graphics contexts that will be using it. 
    168168        view->getSceneData()->resizeGLObjectBuffers(osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts()); 
     
    170170 
    171171    view->setFrameStamp(_frameStamp.get()); 
    172      
     172 
    173173    if (alreadyRealized) 
    174174    { 
     
    197197 
    198198    } 
    199      
     199 
    200200    if (threadsWereRunning) startThreading(); 
    201201} 
     
    237237        if ((*citr)->isRealized()) ++numRealizedWindows; 
    238238    } 
    239      
     239 
    240240    return numRealizedWindows > 0; 
    241241} 
     
    281281        } 
    282282    } 
    283          
     283 
    284284    setReleaseContextAtEndOfFrameHint(false); 
    285285 
     
    290290{ 
    291291    _startTick = tick; 
    292      
     292 
    293293    for(RefViews::iterator vitr = _views.begin(); 
    294294        vitr != _views.end(); 
     
    297297        (*vitr)->setStartTick(tick); 
    298298    } 
    299      
     299 
    300300    Contexts contexts; 
    301301    getContexts(contexts,false); 
     
    381381{ 
    382382    cameras.clear(); 
    383      
     383 
    384384    for(RefViews::iterator vitr = _views.begin(); 
    385385        vitr != _views.end(); 
     
    388388        View* view = vitr->get(); 
    389389 
    390         if (view->getCamera() &&  
     390        if (view->getCamera() && 
    391391            (!onlyActive || (view->getCamera()->getGraphicsContext() && view->getCamera()->getGraphicsContext()->valid())) ) cameras.push_back(view->getCamera()); 
    392392 
     
    400400    } 
    401401} 
    402   
     402 
    403403void CompositeViewer::getScenes(Scenes& scenes, bool onlyValid) 
    404404{ 
     
    442442    OperationThreads operationThreads; 
    443443    getOperationThreads(operationThreads); 
    444      
     444 
    445445    for(OperationThreads::iterator itr = operationThreads.begin(); 
    446446        itr != operationThreads.end(); 
     
    452452    Scenes scenes; 
    453453    getScenes(scenes); 
    454      
     454 
    455455    for(Scenes::iterator sitr = scenes.begin(); 
    456456        sitr != scenes.end(); 
     
    477477{ 
    478478    threads.clear(); 
    479      
     479 
    480480    Contexts contexts; 
    481481    getContexts(contexts); 
     
    485485    { 
    486486        osg::GraphicsContext* gc = *gcitr; 
    487         if (gc->getGraphicsThread() &&  
     487        if (gc->getGraphicsThread() && 
    488488            (!onlyActive || gc->getGraphicsThread()->isRunning()) ) 
    489489        { 
     
    491491        } 
    492492    } 
    493      
     493 
    494494    Cameras cameras; 
    495495    getCameras(cameras); 
     
    499499    { 
    500500        osg::Camera* camera = *citr; 
    501         if (camera->getCameraThread() &&  
     501        if (camera->getCameraThread() && 
    502502            (!onlyActive || camera->getCameraThread()->isRunning()) ) 
    503503        { 
     
    505505        } 
    506506    } 
    507      
     507 
    508508} 
    509509 
     
    511511{ 
    512512    //osg::notify(osg::INFO)<<"CompositeViewer::realize()"<<std::endl; 
    513      
     513 
    514514    setCameraWithFocus(0); 
    515515 
     
    523523    Contexts contexts; 
    524524    getContexts(contexts); 
    525      
     525 
    526526    if (contexts.empty()) 
    527527    { 
    528528        osg::notify(osg::INFO)<<"CompositeViewer::realize() - No valid contexts found, setting up view across all screens."<<std::endl; 
    529      
    530         // no windows are already set up so set up a default view         
     529 
     530        // no windows are already set up so set up a default view 
    531531        _views[0]->setUpViewAcrossAllScreens(); 
    532          
     532 
    533533        getContexts(contexts); 
    534534    } 
     
    540540        return; 
    541541    } 
    542      
     542 
     543    unsigned int maxTexturePoolSize = osg::DisplaySettings::instance()->getMaxTexturePoolSize(); 
     544    unsigned int maxVBOPoolSize = osg::DisplaySettings::instance()->getMaxVBOPoolSize(); 
     545    unsigned int maxFBOPoolSize = osg::DisplaySettings::instance()->getMaxFBOPoolSize(); 
     546 
    543547    for(Contexts::iterator citr = contexts.begin(); 
    544548        citr != contexts.end(); 
     
    546550    { 
    547551        osg::GraphicsContext* gc = *citr; 
     552 
     553        // set the pool sizes, 0 the default will result in no GL object pools. 
     554        gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize); 
     555        gc->getState()->setMaxVBOPoolSize(maxVBOPoolSize); 
     556        gc->getState()->setMaxFBOPoolSize(maxFBOPoolSize); 
     557 
    548558        gc->realize(); 
    549          
    550         if (_realizeOperation.valid() && gc->valid())  
     559 
     560        if (_realizeOperation.valid() && gc->valid()) 
    551561        { 
    552562            gc->makeCurrent(); 
    553              
     563 
    554564            (*_realizeOperation)(gc); 
    555              
     565 
    556566            gc->releaseContext(); 
    557567        } 
    558568    } 
    559      
     569 
    560570    // attach contexts to _incrementalCompileOperation if attached. 
    561571    if (_incrementalCompileOperation) _incrementalCompileOperation->assignContexts(contexts); 
     
    572582            if (gw) 
    573583            { 
    574                 gw->grabFocusIfPointerInWindow();     
    575             } 
    576         } 
    577     } 
    578      
    579      
     584                gw->grabFocusIfPointerInWindow(); 
     585            } 
     586        } 
     587    } 
     588 
     589 
    580590    startThreading(); 
    581591 
     
    600610                gc->getGraphicsThread()->setProcessorAffinity(processNum % numProcessors); 
    601611                gc->getGraphicsThread()->startThread(); 
    602                  
     612 
    603613                ++processNum; 
    604614            } 
     
    611621{ 
    612622    if (_done) return; 
    613      
     623 
    614624    double prevousReferenceTime = _frameStamp->getReferenceTime(); 
    615625    int previousFrameNumber = _frameStamp->getFrameNumber(); 
     
    628638        _frameStamp->setSimulationTime(simulationTime); 
    629639    } 
    630      
     640 
    631641    if (getViewerStats() && getViewerStats()->collectStats("frame_rate")) 
    632642    { 
     
    653663        { 
    654664            View* view = vitr->get(); 
    655             if (view->containsCamera(camera))  
     665            if (view->containsCamera(camera)) 
    656666            { 
    657667                _viewWithFocus = view; 
     
    667677{ 
    668678    if (_done) return; 
    669      
     679 
    670680    if (_views.empty()) return; 
    671      
     681 
    672682    double beginEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick()); 
    673683 
    674684    // osg::notify(osg::NOTICE)<<"CompositeViewer::frameEventTraversal()."<<std::endl; 
    675      
     685 
    676686    // need to copy events from the GraphicsWindow's into local EventQueue; 
    677      
     687 
    678688    typedef std::map<osgViewer::View*, osgGA::EventQueue::Events> ViewEventsMap; 
    679689    ViewEventsMap viewEventsMap; 
    680      
     690 
    681691    Contexts contexts; 
    682692    getContexts(contexts); 
     
    686696 
    687697    osgViewer::View* masterView = getViewWithFocus() ? getViewWithFocus() : _views[0].get(); 
    688      
     698 
    689699    osg::Camera* masterCamera = masterView->getCamera(); 
    690     osgGA::GUIEventAdapter* eventState = masterView->getEventQueue()->getCurrentEventState();  
     700    osgGA::GUIEventAdapter* eventState = masterView->getEventQueue()->getCurrentEventState(); 
    691701    osg::Matrix masterCameraVPW = masterCamera->getViewMatrix() * masterCamera->getProjectionMatrix(); 
    692     if (masterCamera->getViewport())  
     702    if (masterCamera->getViewport()) 
    693703    { 
    694704        osg::Viewport* viewport = masterCamera->getViewport(); 
     
    704714        { 
    705715            gw->checkEvents(); 
    706              
     716 
    707717            osgGA::EventQueue::Events gw_events; 
    708718            gw->getEventQueue()->takeEvents(gw_events); 
    709              
     719 
    710720            osgGA::EventQueue::Events::iterator itr; 
    711721            for(itr = gw_events.begin(); 
     
    714724            { 
    715725                osgGA::GUIEventAdapter* event = itr->get(); 
    716                  
     726 
    717727                //osg::notify(osg::NOTICE)<<"event->getGraphicsContext()="<<event->getGraphicsContext()<<std::endl; 
    718                  
     728 
    719729                bool pointerEvent = false; 
    720730 
    721731                float x = event->getX(); 
    722732                float y = event->getY(); 
    723                  
     733 
    724734                bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
    725735                if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
    726                  
     736 
    727737                switch(event->getEventType()) 
    728738                { 
     
    736746                    { 
    737747                        pointerEvent = true; 
    738                          
     748 
    739749                        if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus()) 
    740750                        { 
     
    745755                            { 
    746756                                osg::Camera* camera = *citr; 
    747                                 if (camera->getView() &&  
     757                                if (camera->getView() && 
    748758                                    camera->getAllowEventFocus() && 
    749759                                    camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER) 
    750760                                { 
    751761                                    osg::Viewport* viewport = camera ? camera->getViewport() : 0; 
    752                                     if (viewport &&  
     762                                    if (viewport && 
    753763                                        x >= viewport->x() && y >= viewport->y() && 
    754764                                        x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) ) 
     
    760770                                        { 
    761771                                            eventState->setGraphicsContext(gw); 
    762                                             eventState->setInputRange( viewport->x(), viewport->y(),  
    763                                                                        viewport->x()+viewport->width(), 
    764                                                                        viewport->y()+viewport->height()); 
     772                                            eventState->setInputRange( viewport->x(), viewport->y(), 
     773                                                                    viewport->x()+viewport->width(), 
     774                                                                    viewport->y()+viewport->height()); 
    765775 
    766776                                        } 
     
    775785                                            masterView = getViewWithFocus(); 
    776786                                            masterCamera = masterView->getCamera(); 
    777                                             eventState = masterView->getEventQueue()->getCurrentEventState();  
     787                                            eventState = masterView->getEventQueue()->getCurrentEventState(); 
    778788                                            masterCameraVPW = masterCamera->getViewMatrix() * masterCamera->getProjectionMatrix(); 
    779789 
    780                                             if (masterCamera->getViewport())  
     790                                            if (masterCamera->getViewport()) 
    781791                                            { 
    782792                                                osg::Viewport* viewport = masterCamera->getViewport(); 
     
    789799                                        { 
    790800                                            eventState->setGraphicsContext(gw); 
    791                                             eventState->setInputRange( viewport->x(), viewport->y(),  
    792                                                                        viewport->x()+viewport->width(), 
    793                                                                        viewport->y()+viewport->height()); 
     801                                            eventState->setInputRange( viewport->x(), viewport->y(), 
     802                                                                    viewport->x()+viewport->width(), 
     803                                                                    viewport->y()+viewport->height()); 
    794804 
    795805                                        } 
     
    802812                            } 
    803813                        } 
    804                          
     814 
    805815                        break; 
    806816                    } 
     
    808818                        break; 
    809819                } 
    810                  
     820 
    811821                if (pointerEvent) 
    812822                { 
     
    822832 
    823833                        x = new_coord.x(); 
    824                         y = new_coord.y();                                 
     834                        y = new_coord.y(); 
    825835 
    826836                        event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax()); 
     
    830840 
    831841                    } 
    832                     // pass along the new pointer events details to the eventState of the viewer  
     842                    // pass along the new pointer events details to the eventState of the viewer 
    833843                    eventState->setX(x); 
    834844                    eventState->setY(y); 
     
    858868                        bool wasThreading = areThreadsRunning(); 
    859869                        if (wasThreading) stopThreading(); 
    860                          
     870 
    861871                        gw->close(); 
    862872 
     
    874884        } 
    875885    } 
    876      
     886 
    877887 
    878888    // osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl; 
     
    887897        view->getEventQueue()->takeEvents(viewEventsMap[view]); 
    888898    } 
    889      
     899 
    890900 
    891901    // osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl; 
    892      
     902 
    893903    if ((_keyEventSetsDone!=0) || _quitEventSetsDone) 
    894904    { 
     
    918928        } 
    919929    } 
    920          
     930 
    921931    if (_done) return; 
    922932 
     
    932942            View* view = veitr->first; 
    933943            _eventVisitor->setActionAdapter(view); 
    934              
     944 
    935945            if (view->getSceneData()) 
    936             {             
     946            { 
    937947                for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin(); 
    938948                    itr != veitr->second.end(); 
     
    964974            } 
    965975        } 
    966          
     976 
    967977    } 
    968978 
     
    972982    { 
    973983        View* view = veitr->first; 
    974          
     984 
    975985        for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin(); 
    976986            itr != veitr->second.end(); 
     
    9931003    { 
    9941004        View* view = veitr->first; 
    995          
     1005 
    9961006        for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin(); 
    9971007            itr != veitr->second.end(); 
     
    10071017    } 
    10081018 
    1009      
     1019 
    10101020 
    10111021    if (getViewerStats() && getViewerStats()->collectStats("event")) 
     
    10241034{ 
    10251035    if (_done) return; 
    1026      
     1036 
    10271037    double beginUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick()); 
    10281038 
     
    10851095 
    10861096 
    1087         if (view->getCameraManipulator())  
     1097        if (view->getCameraManipulator()) 
    10881098        { 
    10891099            view->setFusionDistance( view->getCameraManipulator()->getFusionDistanceMode(), 
    1090                                      view->getCameraManipulator()->getFusionDistanceValue() ); 
    1091                                        
     1100                                    view->getCameraManipulator()->getFusionDistanceValue() ); 
     1101 
    10921102            view->getCamera()->setViewMatrix( view->getCameraManipulator()->getInverseMatrix()); 
    10931103        } 
     
    10951105 
    10961106    } 
    1097      
     1107 
    10981108    if (getViewerStats() && getViewerStats()->collectStats("update")) 
    10991109    {