LCOV - code coverage report
Current view: top level - eq/fabric - view.ipp (source / functions) Hit Total Coverage
Test: lcov2.info Lines: 167 217 77.0 %
Date: 2014-06-18 Functions: 27 64 42.2 %

          Line data    Source code
       1             : 
       2             : /* Copyright (c) 2008-2013, Stefan Eilemann <eile@equalizergraphics.com>
       3             :  *               2011-2012, Daniel Nachbaur <danielnachbaur@gmail.com>
       4             :  *                    2010, Cedric Stalder <cedric.stalder@gmail.com>
       5             :  *
       6             :  * This library is free software; you can redistribute it and/or modify it under
       7             :  * the terms of the GNU Lesser General Public License version 2.1 as published
       8             :  * by the Free Software Foundation.
       9             :  *
      10             :  * This library is distributed in the hope that it will be useful, but WITHOUT
      11             :  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
      12             :  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
      13             :  * details.
      14             :  *
      15             :  * You should have received a copy of the GNU Lesser General Public License
      16             :  * along with this library; if not, write to the Free Software Foundation, Inc.,
      17             :  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      18             :  */
      19             : 
      20             : #include "view.h"
      21             : 
      22             : #include "equalizerTypes.h"
      23             : #include "leafVisitor.h"
      24             : #include "log.h"
      25             : #include "paths.h"
      26             : 
      27             : #include <co/dataIStream.h>
      28             : #include <co/dataOStream.h>
      29             : 
      30             : namespace eq
      31             : {
      32             : namespace fabric
      33             : {
      34             : template< class L, class V, class O >
      35         478 : View< L, V, O >::View( L* layout )
      36             :     : _layout( layout )
      37             :     , _observer( 0 )
      38             :     , _overdraw( Vector2i::ZERO )
      39             :     , _minimumCapabilities( LB_BIT_NONE )
      40             :     , _maximumCapabilities( LB_BIT_ALL_64 )
      41             :     , _capabilities( LB_BIT_ALL_64 )
      42             :     , _equalizers( EQUALIZER_ALL )
      43         478 :     , _modelUnit( EQ_M )
      44             : {
      45             :     // Note: Views are an exception to the strong structuring, since render
      46             :     // client views are multi-buffered (once per pipe) and do not have a parent
      47         478 :     if( layout )
      48         477 :         layout->_addChild( static_cast< V* >( this ));
      49         478 :     LBLOG( LOG_INIT ) << "New " << lunchbox::className( this ) << std::endl;
      50         478 : }
      51             : 
      52             : template< class L, class V, class O >
      53         477 : View< L, V, O >::~View()
      54             : {
      55         477 :     LBLOG( LOG_INIT ) << "Delete " << lunchbox::className( this ) << std::endl;
      56         477 :     if( _layout )
      57         476 :         _layout->_removeChild( static_cast< V* >( this ));
      58         954 : }
      59             : 
      60             : template< class L, class V, class O >
      61         956 : View< L, V, O >::BackupData::BackupData()
      62         956 :     : mode( MODE_MONO )
      63         956 : {}
      64             : 
      65             : template< class L, class V, class O >
      66         227 : void View< L, V, O >::serialize( co::DataOStream& os, const uint64_t dirtyBits )
      67             : {
      68         227 :     Object::serialize( os, dirtyBits );
      69         227 :     if( dirtyBits & DIRTY_OBSERVER )
      70         197 :         os << co::ObjectVersion( _observer );
      71         227 :     if( dirtyBits & DIRTY_FRUSTUM )
      72         142 :         Frustum::serialize( os );
      73         227 :     if( dirtyBits & DIRTY_VIEWPORT )
      74         142 :         os << _data.viewport;
      75         227 :     if( dirtyBits & DIRTY_OVERDRAW )
      76         142 :         os << _overdraw;
      77         227 :     if( dirtyBits & DIRTY_EQUALIZER )
      78         163 :         os << _equalizer;
      79         227 :     if( dirtyBits & DIRTY_MINCAPS )
      80         142 :         os << _minimumCapabilities;
      81         227 :     if( dirtyBits & DIRTY_MAXCAPS )
      82         142 :         os << _maximumCapabilities;
      83         227 :     if( dirtyBits & DIRTY_CAPABILITIES )
      84         142 :         os << _capabilities;
      85         227 :     if( dirtyBits & DIRTY_MODE )
      86         142 :         os << _data.mode;
      87         227 :     if( dirtyBits & DIRTY_EQUALIZERS )
      88         142 :         os << _equalizers;
      89         227 :     if( dirtyBits & DIRTY_MODELUNIT )
      90         142 :         os << _modelUnit;
      91         227 :     if( dirtyBits & DIRTY_DISPLAYCLUSTER )
      92         142 :         os << _displayCluster;
      93         227 : }
      94             : 
      95             : template< class L, class V, class O >
      96         149 : void View< L, V, O >::deserialize( co::DataIStream& is,
      97             :                                    const uint64_t dirtyBits )
      98             : {
      99         149 :     Object::deserialize( is, dirtyBits );
     100         149 :     if( dirtyBits & DIRTY_OBSERVER )
     101             :     {
     102         119 :         co::ObjectVersion observer;
     103         119 :         is >> observer;
     104             : 
     105         119 :         if( observer.identifier == 0 )
     106             :         {
     107           0 :             if( _observer )
     108           0 :                 _observer->removeView( static_cast< V* >( this ));
     109           0 :             _observer = 0;
     110             :         }
     111             :         else
     112             :         {
     113         119 :             if( !_observer && _layout ) // don't map render client observers yet
     114             :             {
     115          63 :                 L* layout = getLayout();
     116          63 :                 LBASSERT( layout && layout->getConfig( ));
     117          63 :                 layout->getConfig()->find( observer.identifier, &_observer );
     118          63 :                 if( _observer )
     119          63 :                     _observer->addView( static_cast< V* >( this ));
     120          63 :                 LBASSERT( _observer );
     121          63 :                 LBASSERT( _observer->getID() == observer.identifier );
     122             :             }
     123         119 :             if( _observer )
     124             :             {
     125         118 :                 LBASSERT( _observer->getID() == observer.identifier );
     126         118 :                 if( _observer->isMaster( ))
     127           0 :                     _observer->sync();
     128             :                 else
     129         118 :                     _observer->sync( observer.version );
     130             :             }
     131             :         }
     132             :     }
     133         149 :     if( dirtyBits & DIRTY_FRUSTUM )
     134          64 :         Frustum::deserialize( is );
     135         149 :     if( dirtyBits & DIRTY_VIEWPORT )
     136          64 :         is >> _data.viewport;
     137         149 :     if( dirtyBits & DIRTY_OVERDRAW )
     138          64 :         is >> _overdraw;
     139         149 :     if( dirtyBits & DIRTY_EQUALIZER )
     140          85 :         is >> _equalizer;
     141         149 :     if( dirtyBits & ( DIRTY_MINCAPS | DIRTY_MAXCAPS ) )
     142             :     {
     143          64 :         if( dirtyBits & DIRTY_MINCAPS )
     144          64 :             is >> _minimumCapabilities;
     145          64 :         if( dirtyBits & DIRTY_MAXCAPS )
     146          64 :             is >> _maximumCapabilities;
     147          64 :         updateCapabilities();
     148             :     }
     149         149 :     if( dirtyBits & DIRTY_CAPABILITIES )
     150          64 :         is >> _capabilities;
     151         149 :     if( dirtyBits & DIRTY_MODE )
     152             :     {
     153             :         uint32_t mode;
     154          64 :         is >> mode;
     155          64 :         activateMode( Mode( mode ));
     156             :     }
     157         149 :     if( dirtyBits & DIRTY_EQUALIZERS )
     158          64 :         is >> _equalizers;
     159         149 :     if( dirtyBits & DIRTY_MODELUNIT )
     160          64 :         is >> _modelUnit;
     161         149 :     if( dirtyBits & DIRTY_DISPLAYCLUSTER )
     162          64 :         is >> _displayCluster;
     163         149 : }
     164             : 
     165             : template< class L, class V, class O >
     166         135 : void View< L, V, O >::setDirty( const uint64_t dirtyBits )
     167             : {
     168         135 :     Object::setDirty( dirtyBits );
     169         135 :     if( _layout )
     170         135 :         _layout->setDirty( L::DIRTY_VIEWS );
     171         135 : }
     172             : 
     173             : template< class L, class V, class O >
     174          88 : void View< L, V, O >::changeMode( const Mode mode )
     175             : {
     176          88 :     if ( _data.mode == mode )
     177         132 :         return;
     178             : 
     179          44 :     _data.mode = mode;
     180          44 :     setDirty( DIRTY_MODE );
     181             : }
     182             : 
     183             : template< class L, class V, class O >
     184           7 : bool View< L, V, O >::isActive() const
     185             : {
     186           7 :     const L* layout = getLayout();
     187           7 :     if( !layout )
     188           0 :         return true; // render client view, active by definition.
     189           7 :     return layout->isActive();
     190             : }
     191             : 
     192             : template< class L, class V, class O >
     193          55 : bool View< L, V, O >::setModelUnit( const float modelUnit )
     194             : {
     195          55 :     if( modelUnit < std::numeric_limits< float >::epsilon() ||
     196             :         _modelUnit == modelUnit )
     197             :     {
     198          55 :         return false;
     199             :     }
     200           0 :     _modelUnit = modelUnit;
     201           0 :     setDirty( DIRTY_MODELUNIT );
     202           0 :     return true;
     203             : }
     204             : 
     205             : template< class L, class V, class O >
     206         394 : float View< L, V, O >::getModelUnit() const
     207             : {
     208         394 :     LBASSERT( _modelUnit > 0.f );
     209         394 :     return _modelUnit;
     210             : }
     211             : 
     212             : template< class L, class V, class O >
     213           0 : void View< L, V, O >::setDisplayCluster( const std::string& hostname )
     214             : {
     215           0 :     _displayCluster = hostname;
     216           0 :     setDirty( DIRTY_DISPLAYCLUSTER );
     217           0 : }
     218             : 
     219             : template< class L, class V, class O >
     220           0 : const std::string& View< L, V, O >::getDisplayCluster() const
     221             : {
     222           0 :     return _displayCluster;
     223             : }
     224             : 
     225             : template< class L, class V, class O >
     226         116 : void View< L, V, O >::setViewport( const Viewport& viewport )
     227             : {
     228         116 :     _data.viewport = viewport;
     229         116 :     setDirty( DIRTY_VIEWPORT );
     230         116 : }
     231             : 
     232          63 : template< class L, class V, class O > void View< L, V, O >::backup()
     233             : {
     234          63 :     _backup = _data;
     235          63 :     Frustum::backup();
     236          63 :     Object::backup();
     237          63 : }
     238             : 
     239           2 : template< class L, class V, class O > void View< L, V, O >::restore()
     240             : {
     241           2 :     Object::restore();
     242           2 :     Frustum::restore();
     243           2 :     _data = _backup;
     244           2 :     _overdraw = Vector2i::ZERO;
     245           2 :     _minimumCapabilities = LB_BIT_NONE;
     246           2 :     _maximumCapabilities = LB_BIT_ALL_64;
     247           2 :     _capabilities = LB_BIT_ALL_64;
     248           2 :     _equalizers = EQUALIZER_ALL;
     249           2 :     _modelUnit = EQ_M;
     250             : 
     251           2 :     setDirty( DIRTY_VIEW_BITS );
     252           2 : }
     253             : 
     254             : template< class L, class V, class O >
     255         402 : void View< L, V, O >::setObserver( O* observer )
     256             : {
     257         402 :     if( _observer == observer )
     258         402 :         return;
     259             : 
     260         402 :     if( _observer )
     261           0 :         _observer->removeView( static_cast< V* >( this ));
     262         402 :     _observer = observer;
     263         402 :     if( _observer )
     264         402 :         _observer->addView( static_cast< V* >( this ));
     265         402 :     setDirty( DIRTY_OBSERVER );
     266             : }
     267             : 
     268             : template< class L, class V, class O >
     269        1896 : const Viewport& View< L, V, O >::getViewport() const
     270             : {
     271        1896 :     return _data.viewport;
     272             : }
     273             : 
     274             : template< class L, class V, class O >
     275           0 : void View< L, V, O >::setOverdraw( const Vector2i& pixels )
     276             : {
     277           0 :     if( _overdraw == pixels )
     278           0 :         return;
     279             : 
     280           0 :     _overdraw = pixels;
     281           0 :     setDirty( DIRTY_OVERDRAW );
     282             : }
     283             : 
     284             : template< class L, class V, class O >
     285           0 : void View< L, V, O >::useEqualizer( uint32_t bitmask )
     286             : {
     287           0 :     if( _equalizers == bitmask )
     288           0 :         return;
     289           0 :     _equalizers = bitmask;
     290           0 :     setDirty( DIRTY_EQUALIZERS );
     291             : }
     292             : 
     293             : template< class L, class V, class O >
     294           0 : const Equalizer& View< L, V, O >::getEqualizer() const
     295             : {
     296           0 :     return _equalizer;
     297             : }
     298             : 
     299             : template< class L, class V, class O >
     300          42 : Equalizer& View< L, V, O >::getEqualizer()
     301             : {
     302          42 :     setDirty( DIRTY_EQUALIZER );
     303          42 :     return _equalizer;
     304             : }
     305             : 
     306             : template< class L, class V, class O >
     307       14840 : VisitorResult View< L, V, O >::accept( LeafVisitor< V >& visitor )
     308             : {
     309       14840 :     return visitor.visit( static_cast< V* >( this ));
     310             : }
     311             : 
     312             : template< class L, class V, class O >
     313           0 : VisitorResult View< L, V, O >::accept( LeafVisitor< V >& visitor ) const
     314             : {
     315           0 :     return visitor.visit( static_cast< const V* >( this ));
     316             : }
     317             : 
     318             : template< class L, class V, class O >
     319           7 : uint32_t View< L, V, O >::getUserDataLatency() const
     320             : {
     321           7 :     return static_cast< const V* >( this )->getConfig()->getLatency();
     322             : }
     323             : 
     324             : template< class L, class V, class O >
     325           0 : void View< L, V, O >::setMinimumCapabilities( uint64_t bitmask )
     326             : {
     327           0 :     if( bitmask == _minimumCapabilities )
     328           0 :         return;
     329             : 
     330           0 :     _minimumCapabilities = bitmask;
     331           0 :     setDirty( DIRTY_MINCAPS );
     332             : }
     333             : 
     334             : template< class L, class V, class O >
     335        1248 : uint64_t View< L, V, O >::getMinimumCapabilities() const
     336             : {
     337        1248 :     return _minimumCapabilities;
     338             : }
     339             : 
     340             : template< class L, class V, class O >
     341           0 : void View< L, V, O >::setMaximumCapabilities( uint64_t bitmask )
     342             : {
     343           0 :     if( bitmask == _maximumCapabilities )
     344           0 :         return;
     345             : 
     346           0 :     _maximumCapabilities = bitmask;
     347           0 :     setDirty( DIRTY_MAXCAPS );
     348             : }
     349             : 
     350             : template< class L, class V, class O >
     351           0 : uint64_t View< L, V, O >::getMaximumCapabilities() const
     352             : {
     353           0 :     return _maximumCapabilities;
     354             : }
     355             : 
     356             : template< class L, class V, class O >
     357           0 : void View< L, V, O >::setCapabilities( uint64_t bitmask )
     358             : {
     359           0 :     if( bitmask == _capabilities )
     360           0 :         return;
     361             : 
     362           0 :     _capabilities = bitmask;
     363           0 :     setDirty( DIRTY_CAPABILITIES );
     364             : }
     365             : 
     366             : template< class L, class V, class O >
     367           0 : uint64_t View< L, V, O >::getCapabilities() const
     368             : {
     369           0 :     return _capabilities;
     370             : }
     371             : 
     372             : template< class L, class V, class O >
     373         299 : std::ostream& operator << ( std::ostream& os, const View< L, V, O >& view )
     374             : {
     375         598 :     os << lunchbox::disableFlush << lunchbox::disableHeader
     376         299 :        << "view" << std::endl;
     377         299 :     os << "{" << std::endl << lunchbox::indent;
     378             : 
     379         299 :     const std::string& name = view.getName();
     380         299 :     if( !name.empty( ))
     381           0 :         os << "name     \"" << name << "\"" << std::endl;
     382             : 
     383         299 :     const Viewport& vp = view.getViewport();
     384         299 :     if( vp.isValid( ) && vp != Viewport::FULL )
     385          58 :         os << "viewport " << vp << std::endl;
     386             : 
     387         299 :     if( view.getMode() == View< L, V, O >::MODE_STEREO )
     388          22 :         os << "mode     STEREO" << std::endl; // MONO is default
     389             : 
     390         299 :     const O* observer = static_cast< const O* >( view.getObserver( ));
     391         299 :     if( observer )
     392             :     {
     393         293 :         const std::string& observerName = observer->getName();
     394         293 :         const L* layout = view.getLayout();
     395         293 :         const O* foundObserver = 0;
     396         293 :         layout->getConfig()->find( observerName, &foundObserver );
     397             : 
     398         293 :         if( layout && foundObserver == observer )
     399             :         {
     400         293 :             os << "observer \"" << observerName << "\"" << std::endl;
     401             :         }
     402             :         else
     403           0 :             os << observer->getPath() << std::endl;
     404             :     }
     405             : 
     406         299 :     return os << static_cast< const Frustum& >( view )
     407         299 :               << lunchbox::exdent << "}" << std::endl << lunchbox::enableHeader
     408         299 :               << lunchbox::enableFlush;
     409             : }
     410             : 
     411             : }
     412             : }

Generated by: LCOV version 1.10