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/Viewer.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*/ 
     
    6666    //arguments.getApplicationUsage()->addCommandLineOption("--collar",""); 
    6767    //arguments.getApplicationUsage()->addCommandLineOption("--im",""); 
    68      
     68 
    6969    std::string filename; 
    7070    bool readConfig = false; 
     
    140140        while (arguments.read("--wow-M",wow_M)) {} 
    141141        while (arguments.read("--wow-C",wow_C)) {} 
    142              
     142 
    143143        if (screenNum<0) screenNum = 0; 
    144          
     144 
    145145        setUpViewForWoWVxDisplay( screenNum, wow_content, wow_factor, wow_offset, wow_Zd, wow_vz, wow_M, wow_C ); 
    146146    } 
     
    175175        if (screenNum>=0) setUpViewInWindow(x, y, width, height, screenNum); 
    176176        else setUpViewInWindow(x,y,width,height); 
    177          
     177 
    178178    } 
    179179    else if (screenNum>=0) 
     
    195195    _eventVisitor->setActionAdapter(this); 
    196196    _eventVisitor->setFrameStamp(_frameStamp.get()); 
    197      
     197 
    198198    _updateVisitor = new osgUtil::UpdateVisitor; 
    199199    _updateVisitor->setFrameStamp(_frameStamp.get()); 
     
    214214 
    215215    stopThreading(); 
    216      
     216 
    217217    if (_scene.valid() && _scene->getDatabasePager()) 
    218218    { 
     
    231231        (*citr)->close(); 
    232232    } 
    233      
     233 
    234234    //osg::notify(osg::NOTICE)<<"finish Viewer::~Viewer()"<<std::endl; 
    235      
     235 
    236236    getAllThreads(threads); 
    237237 
     
    243243{ 
    244244    osgViewer::View::take(rhs); 
    245      
     245 
    246246#if 1 
    247247    osgViewer::Viewer* rhs_viewer = dynamic_cast<osgViewer::Viewer*>(&rhs); 
     
    278278        rhs_viewer->_currentContext = 0; 
    279279    } 
    280 #endif     
     280#endif 
    281281} 
    282282 
     
    284284{ 
    285285    osg::notify(osg::INFO)<<"Viewer::readConfiguration("<<filename<<")"<<std::endl; 
    286      
     286 
    287287    osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(filename); 
    288     if (!object)  
     288    if (!object) 
    289289    { 
    290290        //osg::notify(osg::NOTICE)<<"Error: Unable to load configuration file \""<<filename<<"\""<<std::endl; 
    291291        return false; 
    292292    } 
    293      
     293 
    294294    CompositeViewer* compositeViewer = dynamic_cast<CompositeViewer*>(object.get()); 
    295295    if (compositeViewer) 
     
    298298        return false; 
    299299    } 
    300      
     300 
    301301    View* view = dynamic_cast<osgViewer::View*>(object.get()); 
    302302    if (view) 
     
    307307    } 
    308308    else 
    309     {     
     309    { 
    310310        osg::notify(osg::NOTICE)<<"Error: Config file \""<<filename<<"\" does not contain a valid Viewer configuration."<<std::endl; 
    311311        return false; 
     
    327327        if ((*citr)->isRealized()) ++numRealizedWindows; 
    328328    } 
    329      
     329 
    330330    return numRealizedWindows > 0; 
    331331} 
     
    420420{ 
    421421    //osg::notify(osg::INFO)<<"Viewer::realize()"<<std::endl; 
    422      
     422 
    423423    setCameraWithFocus(0); 
    424424 
    425425    Contexts contexts; 
    426426    getContexts(contexts); 
    427      
     427 
    428428    if (contexts.empty()) 
    429429    { 
    430430        osg::notify(osg::INFO)<<"Viewer::realize() - No valid contexts found, setting up view across all screens."<<std::endl; 
    431      
    432         // no windows are already set up so set up a default view         
    433          
     431 
     432        // no windows are already set up so set up a default view 
     433 
    434434        const char* ptr = 0; 
    435435        if ((ptr = getenv("OSG_CONFIG_FILE")) != 0) 
     
    467467            } 
    468468        } 
    469          
     469 
    470470        getContexts(contexts); 
    471471    } 
     
    477477        return; 
    478478    } 
    479      
     479 
     480    unsigned int maxTexturePoolSize = osg::DisplaySettings::instance()->getMaxTexturePoolSize(); 
     481    if (_camera->getDisplaySettings()) maxTexturePoolSize = std::max(maxTexturePoolSize, _camera->getDisplaySettings()->getMaxTexturePoolSize()); 
     482    if (_displaySettings.valid()) maxTexturePoolSize = std::max(maxTexturePoolSize, _displaySettings->getMaxTexturePoolSize()); 
     483 
     484    unsigned int maxVBOPoolSize = osg::DisplaySettings::instance()->getMaxVBOPoolSize(); 
     485    if (_displaySettings.valid()) maxVBOPoolSize = std::max(maxVBOPoolSize, _displaySettings->getMaxVBOPoolSize()); 
     486    if (_camera->getDisplaySettings()) maxVBOPoolSize = std::max(maxVBOPoolSize, _camera->getDisplaySettings()->getMaxVBOPoolSize()); 
     487 
     488    unsigned int maxFBOPoolSize = osg::DisplaySettings::instance()->getMaxFBOPoolSize(); 
     489    if (_displaySettings.valid()) maxFBOPoolSize = std::max(maxFBOPoolSize, _displaySettings->getMaxFBOPoolSize()); 
     490    if (_camera->getDisplaySettings()) maxFBOPoolSize = std::max(maxFBOPoolSize, _camera->getDisplaySettings()->getMaxFBOPoolSize()); 
     491 
    480492    for(Contexts::iterator citr = contexts.begin(); 
    481493        citr != contexts.end(); 
     
    483495    { 
    484496        osg::GraphicsContext* gc = *citr; 
     497 
     498        // set the pool sizes, 0 the default will result in no GL object pools. 
     499        gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize); 
     500        gc->getState()->setMaxVBOPoolSize(maxVBOPoolSize); 
     501        gc->getState()->setMaxFBOPoolSize(maxFBOPoolSize); 
     502 
    485503        gc->realize(); 
    486          
     504 
    487505        if (_realizeOperation.valid() && gc->valid()) 
    488506        { 
    489507            gc->makeCurrent(); 
    490              
     508 
    491509            (*_realizeOperation)(gc); 
    492              
     510 
    493511            gc->releaseContext(); 
    494512        } 
     
    508526            if (gw) 
    509527            { 
    510                 gw->grabFocusIfPointerInWindow();     
    511             } 
    512         } 
    513     } 
    514      
     528                gw->grabFocusIfPointerInWindow(); 
     529            } 
     530        } 
     531    } 
     532 
    515533    // initialize the global timer to be relative to the current time. 
    516534    osg::Timer::instance()->setStartTick(); 
     
    520538 
    521539    setUpThreading(); 
    522      
     540 
    523541    if (osg::DisplaySettings::instance()->getCompileContextsHint()) 
    524542    { 
     
    535553                gc->getGraphicsThread()->setProcessorAffinity(processNum % numProcessors); 
    536554                gc->getGraphicsThread()->startThread(); 
    537                  
     555 
    538556                ++processNum; 
    539557            } 
    540558        } 
    541559    } 
    542      
     560 
    543561} 
    544562 
     
    564582        _frameStamp->setSimulationTime(simulationTime); 
    565583    } 
    566      
     584 
    567585    if (getViewerStats() && getViewerStats()->collectStats("frame_rate")) 
    568586    { 
     
    591609 
    592610    // osg::notify(osg::NOTICE)<<"Viewer::frameEventTraversal()."<<std::endl; 
    593      
     611 
    594612    // need to copy events from the GraphicsWindow's into local EventQueue; 
    595613    osgGA::EventQueue::Events events; 
     
    598616    getContexts(contexts); 
    599617 
    600     osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState();  
     618    osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState(); 
    601619    osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix(); 
    602     if (getCamera()->getViewport())  
     620    if (getCamera()->getViewport()) 
    603621    { 
    604622        osg::Viewport* viewport = getCamera()->getViewport(); 
     
    620638        { 
    621639            gw->checkEvents(); 
    622              
     640 
    623641            osgGA::EventQueue::Events gw_events; 
    624642            gw->getEventQueue()->takeEvents(gw_events); 
    625              
     643 
    626644            osgGA::EventQueue::Events::iterator itr; 
    627645            for(itr = gw_events.begin(); 
     
    630648            { 
    631649                osgGA::GUIEventAdapter* event = itr->get(); 
    632                  
     650 
    633651                bool pointerEvent = false; 
    634652 
    635653                float x = event->getX(); 
    636654                float y = event->getY(); 
    637                  
     655 
    638656                bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
    639657                if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
    640                  
     658 
    641659                switch(event->getEventType()) 
    642660                { 
     
    647665                    { 
    648666                        pointerEvent = true; 
    649                          
     667 
    650668                        if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus()) 
    651669                        { 
     
    656674                            { 
    657675                                osg::Camera* camera = *citr; 
    658                                 if (camera->getView()==this &&  
     676                                if (camera->getView()==this && 
    659677                                    camera->getAllowEventFocus() && 
    660678                                    camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER) 
    661679                                { 
    662680                                    osg::Viewport* viewport = camera ? camera->getViewport() : 0; 
    663                                     if (viewport &&  
     681                                    if (viewport && 
    664682                                        x >= viewport->x() && y >= viewport->y() && 
    665683                                        x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) ) 
     
    671689                            } 
    672690                        } 
    673                          
     691 
    674692                        break; 
    675693                    } 
     
    677695                        break; 
    678696                } 
    679                  
     697 
    680698                if (pointerEvent) 
    681699                { 
     
    691709 
    692710                        x = new_coord.x(); 
    693                         y = new_coord.y();                                 
     711                        y = new_coord.y(); 
    694712 
    695713                        // osg::notify(osg::NOTICE)<<"pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl; 
     
    712730                        event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
    713731                    } 
    714                      
    715                     // pass along the new pointer events details to the eventState of the viewer  
     732 
     733                    // pass along the new pointer events details to the eventState of the viewer 
    716734                    eventState->setX(x); 
    717735                    eventState->setY(y); 
     
    743761                        bool wasThreading = areThreadsRunning(); 
    744762                        if (wasThreading) stopThreading(); 
    745                          
     763 
    746764                        gw->close(); 
    747                         _currentContext = NULL;  
    748                          
     765                        _currentContext = NULL; 
     766 
    749767                        if (wasThreading) startThreading(); 
    750                          
     768 
    751769                        break; 
    752770                    } 
     
    760778        } 
    761779    } 
    762      
     780 
    763781 
    764782    // osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl; 
     
    816834 
    817835    // osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl; 
    818      
     836 
    819837    if ((_keyEventSetsDone!=0) || _quitEventSetsDone) 
    820838    { 
     
    829847                    if (_keyEventSetsDone && event->getKey()==_keyEventSetsDone) _done = true; 
    830848                    break; 
    831                  
     849 
    832850                case(osgGA::GUIEventAdapter::QUIT_APPLICATION): 
    833851                    if (_quitEventSetsDone) _done = true; 
    834852                    break; 
    835                      
     853 
    836854                default: 
    837855                    break; 
     
    839857        } 
    840858    } 
    841          
     859 
    842860    if (_done) return; 
    843861 
     
    889907            (*hitr)->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *this, 0, 0); 
    890908        } 
    891          
     909 
    892910    } 
    893911 
     
    902920        } 
    903921    } 
    904      
     922 
    905923    if (getViewerStats() && getViewerStats()->collectStats("event")) 
    906924    { 
     
    10041022    OperationThreads operationThreads; 
    10051023    getOperationThreads(operationThreads); 
    1006      
     1024 
    10071025    for(OperationThreads::iterator itr = operationThreads.begin(); 
    10081026        itr != operationThreads.end(); 
     
    10111029        threads.push_back(*itr); 
    10121030    } 
    1013      
     1031 
    10141032 
    10151033    if (_scene.valid()) 
     
    10341052{ 
    10351053    threads.clear(); 
    1036      
     1054 
    10371055    Contexts contexts; 
    10381056    getContexts(contexts); 
     
    10421060    { 
    10431061        osg::GraphicsContext* gc = *gcitr; 
    1044         if (gc->getGraphicsThread() &&  
     1062        if (gc->getGraphicsThread() && 
    10451063            (!onlyActive || gc->getGraphicsThread()->isRunning()) ) 
    10461064        { 
     
    10481066        } 
    10491067    } 
    1050      
     1068 
    10511069    Cameras cameras; 
    10521070    getCameras(cameras); 
     
    10561074    { 
    10571075        osg::Camera* camera = *citr; 
    1058         if (camera->getCameraThread() &&  
     1076        if (camera->getCameraThread() && 
    10591077            (!onlyActive || camera->getCameraThread()->isRunning()) ) 
    10601078        { 
     
    10621080        } 
    10631081    } 
    1064      
     1082 
    10651083} 
    10661084 
     
    10721090    contexts.clear(); 
    10731091 
    1074     if (_camera.valid() &&  
    1075         _camera->getGraphicsContext() &&  
     1092    if (_camera.valid() && 
     1093        _camera->getGraphicsContext() && 
    10761094        (_camera->getGraphicsContext()->valid() || !onlyValid)) 
    10771095    { 
     
    10791097        contexts.push_back(_camera->getGraphicsContext()); 
    10801098    } 
    1081      
     1099 
    10821100    for(unsigned int i=0; i<getNumSlaves(); ++i) 
    10831101    { 
     
    10981116{ 
    10991117    cameras.clear(); 
    1100      
    1101     if (_camera.valid() &&  
     1118 
     1119    if (_camera.valid() && 
    11021120        (!onlyActive || (_camera->getGraphicsContext() && _camera->getGraphicsContext()->valid())) ) cameras.push_back(_camera.get()); 
    11031121