Line data Source code
1 :
2 : /* Copyright (c) 2011-2015, Stefan Eilemann <eile@eyescale.ch>
3 : * Petros Kataras <petroskataras@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 : #include "pipe.h"
20 :
21 : #include "config.h"
22 : #include "node.h"
23 : #include "objectMap.h"
24 : #include "renderer.h"
25 :
26 : #include <seq/application.h>
27 : #include <seq/error.h>
28 : #include <seq/renderer.h>
29 :
30 : namespace seq
31 : {
32 : namespace detail
33 : {
34 2 : Pipe::Pipe(eq::Node* parent)
35 : : eq::Pipe(parent)
36 : , _objects(0)
37 2 : , _renderer(0)
38 : {
39 2 : }
40 :
41 6 : Pipe::~Pipe()
42 : {
43 2 : LBASSERT(!_objects);
44 4 : }
45 :
46 4 : seq::Application* Pipe::getApplication()
47 : {
48 4 : return getConfig()->getApplication();
49 : }
50 :
51 8 : Config* Pipe::getConfig()
52 : {
53 8 : return getNode()->getConfig();
54 : }
55 :
56 8 : Node* Pipe::getNode()
57 : {
58 8 : return static_cast<Node*>(eq::Pipe::getNode());
59 : }
60 :
61 16 : detail::Renderer* Pipe::getRendererImpl()
62 : {
63 16 : LBASSERT(_renderer);
64 16 : if (!_renderer)
65 0 : return 0;
66 16 : return _renderer->getImpl();
67 : }
68 :
69 5 : co::Object* Pipe::getFrameData()
70 : {
71 5 : LBASSERT(_objects);
72 5 : if (_objects)
73 5 : return _objects->getFrameData();
74 0 : return 0;
75 : }
76 :
77 0 : ObjectMap* Pipe::getObjectMap()
78 : {
79 0 : return _objects;
80 : }
81 :
82 2 : bool Pipe::configInit(const uint128_t& initID)
83 : {
84 2 : if (!eq::Pipe::configInit(initID))
85 0 : return false;
86 :
87 2 : LBASSERT(!_renderer);
88 2 : _renderer = getApplication()->createRenderer();
89 2 : if (!_renderer)
90 : {
91 0 : LBASSERT(_renderer);
92 0 : sendError(ERROR_SEQUEL_CREATERENDERER_FAILED);
93 0 : return false;
94 : }
95 2 : getRendererImpl()->setPipe(this);
96 :
97 2 : if (_mapData(initID))
98 2 : return true;
99 :
100 0 : sendError(ERROR_SEQUEL_MAPOBJECT_FAILED);
101 0 : return false;
102 : }
103 :
104 2 : bool Pipe::configExit()
105 : {
106 2 : _unmapData();
107 :
108 2 : if (_renderer)
109 : {
110 2 : getRendererImpl()->setPipe(0);
111 2 : getApplication()->destroyRenderer(_renderer);
112 : }
113 2 : _renderer = 0;
114 :
115 2 : return eq::Pipe::configExit();
116 : }
117 :
118 2 : void Pipe::frameStart(const uint128_t& frameID, const uint32_t frameNumber)
119 : {
120 2 : _syncData(frameID);
121 2 : return eq::Pipe::frameStart(frameID, frameNumber);
122 : }
123 :
124 2 : bool Pipe::_mapData(const uint128_t& initID)
125 : {
126 2 : LBASSERT(!_objects);
127 2 : LBASSERT(_renderer);
128 :
129 2 : Config* config = getConfig();
130 2 : _objects = new ObjectMap(*config, *_renderer);
131 : const uint32_t request =
132 4 : config->mapObjectNB(_objects, initID, co::VERSION_OLDEST,
133 4 : config->getApplicationNode());
134 2 : if (!config->mapObjectSync(request))
135 0 : return false;
136 2 : return true;
137 : }
138 :
139 2 : void Pipe::_syncData(const uint128_t& version)
140 : {
141 2 : LBASSERT(_objects)
142 2 : _objects->sync(version);
143 2 : }
144 :
145 2 : void Pipe::_unmapData()
146 : {
147 2 : LBASSERT(_objects)
148 2 : getConfig()->unmapObject(_objects);
149 2 : _objects->clear();
150 2 : delete _objects;
151 2 : _objects = 0;
152 2 : }
153 : }
154 30 : }
|