Equalizer  1.6.1
include/eq/fabric/pipe.h
1 
2 /* Copyright (c) 2010-2013, Stefan Eilemann <eile@equalizergraphics.com>
3  * 2010, Cedric Stalder <cedric.stalder@gmail.com>
4  *
5  * This library is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Lesser General Public License version 2.1 as published
7  * by the Free Software Foundation.
8  *
9  * This library is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12  * details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this library; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #ifndef EQFABRIC_PIPE_H
20 #define EQFABRIC_PIPE_H
21 
22 #include <eq/fabric/object.h> // base class
23 #include <eq/fabric/pixelViewport.h> // property
24 #include <eq/fabric/types.h>
25 
26 namespace eq
27 {
28 namespace fabric
29 {
31  template< class N, class P, class W, class V > class Pipe : public Object
32  {
33  public:
35  typedef std::vector< W* > Windows;
36 
40  N* getNode() { return _node; }
42  const N* getNode() const { return _node; }
43 
45  const Windows& getWindows() const { return _windows; }
46 
58  uint32_t getPort() const { return _port; }
59 
60  EQFABRIC_INL void setPort( const uint32_t port );
61 
73  uint32_t getDevice() const { return _device; }
74 
75  EQFABRIC_INL void setDevice( const uint32_t device );
76 
78  const PixelViewport& getPixelViewport() const { return _data.pvp; }
79 
89  EQFABRIC_INL void setPixelViewport( const PixelViewport& pvp );
90 
92  void notifyPixelViewportChanged();
93 
95  EQFABRIC_INL PipePath getPath() const;
96 
104  EQFABRIC_INL VisitorResult accept( V& visitor );
105 
107  EQFABRIC_INL VisitorResult accept( V& visitor ) const;
109 
114  {
115  // Note: also update string array initialization in pipe.cpp
119  IATTR_LAST,
120  IATTR_ALL = IATTR_LAST + 5
121  };
122 
124  EQFABRIC_INL void setIAttribute( const IAttribute attr,
125  const int32_t value );
126 
128  int32_t getIAttribute( const IAttribute attr ) const
129  { return _iAttributes[attr]; }
130 
132  bool isThreaded() const
133  { return (getIAttribute( IATTR_HINT_THREAD ) == 1 ); }
134 
136  EQFABRIC_INL static const std::string& getIAttributeString(
137  const IAttribute attr );
139 
142  EQFABRIC_INL virtual void backup();
143  EQFABRIC_INL virtual void restore();
144  void create( W** window );
145  void release( W* window );
146  virtual void output( std::ostream& ) const {}
147 
148  EQFABRIC_INL virtual uint128_t commit( const uint32_t incarnation =
149  CO_COMMIT_NEXT );
151 
152  protected:
153  //-------------------- Members --------------------
154 
156  Pipe( N* parent );
157  EQFABRIC_INL virtual ~Pipe( );
158 
159  virtual void attach( const UUID& id,
160  const uint32_t instanceID );
161 
162  EQFABRIC_INL virtual void serialize( co::DataOStream& os,
163  const uint64_t dirtyBits );
165  EQFABRIC_INL virtual void deserialize( co::DataIStream& is,
166  const uint64_t dirtyBits );
167 
168  EQFABRIC_INL virtual void notifyDetach();
169 
171  EQFABRIC_INL virtual void setDirty( const uint64_t bits );
172 
174  virtual ChangeType getChangeType() const { return UNBUFFERED; }
175 
176  W* _findWindow( const UUID& id );
177 
178  enum DirtyBits
179  {
180  DIRTY_ATTRIBUTES = Object::DIRTY_CUSTOM << 0,
181  DIRTY_WINDOWS = Object::DIRTY_CUSTOM << 1,
182  DIRTY_PIXELVIEWPORT = Object::DIRTY_CUSTOM << 2,
183  DIRTY_MEMBER = Object::DIRTY_CUSTOM << 3,
184  DIRTY_PIPE_BITS =
185  DIRTY_ATTRIBUTES | DIRTY_WINDOWS | DIRTY_PIXELVIEWPORT |
186  DIRTY_MEMBER | DIRTY_OBJECT_BITS
187  };
188 
190  virtual uint64_t getRedistributableBits() const
191  { return DIRTY_PIPE_BITS; }
192 
193  private:
195  N* const _node;
196 
198  Windows _windows;
199 
201  int32_t _iAttributes[IATTR_ALL];
202 
204  uint32_t _port;
205 
207  uint32_t _device;
208 
209  struct BackupData
210  {
212  PixelViewport pvp;
213  }
214  _data, _backup;
215 
216  struct Private;
217  Private* _private; // placeholder for binary-compatible changes
218 
219  void _addWindow( W* window );
220  EQFABRIC_INL bool _removeWindow( W* window );
221  template< class, class, class > friend class Window;
222 
224  bool _mapNodeObjects() { return _node->_mapNodeObjects(); }
225 
226  typedef co::CommandFunc< Pipe< N, P, W, V > > CmdFunc;
227  bool _cmdNewWindow( co::ICommand& command );
228  bool _cmdNewWindowReply( co::ICommand& command );
229  };
230 
231  template< class N, class P, class W, class V > EQFABRIC_INL
232  std::ostream& operator << ( std::ostream&, const Pipe< N, P, W, V >& );
233 }
234 }
235 
236 #endif // EQFABRIC_PIPE_H
Internal base class for all distributed, inheritable Equalizer objects.
Definition: object.h:39
Base data transport class for pipes.
IAttribute
Possible values for integer attributes.
Definition: iAttribute.h:30
const PixelViewport & getPixelViewport() const
EQFABRIC_INL VisitorResult accept(V &visitor)
Perform a depth-first traversal of this pipe.
const Windows & getWindows() const
std::vector< W * > Windows
A vector of pointers to windows.
int32_t getIAttribute(const IAttribute attr) const
EQFABRIC_INL void setPixelViewport(const PixelViewport &pvp)
Set the pipe&#39;s pixel viewport.
const N * getNode() const
Holds a 2D pixel viewport with methods for manipulation.
Definition: pixelViewport.h:34
uint32_t getPort() const
Returns the port number of this pipe.
uint32_t getDevice() const
Returns the device number of this pipe.
Bind render thread to subset of cores.
Execute tasks in separate thread (default)