diff --git a/include/openspace/engine/syncengine.h b/include/openspace/engine/syncengine.h index 3adc64aabb..b3dd233978 100644 --- a/include/openspace/engine/syncengine.h +++ b/include/openspace/engine/syncengine.h @@ -41,9 +41,11 @@ class SyncBuffer; class SyncEngine { public: + void presync(bool isMaster); void encode(SyncBuffer* syncBuffer); void decode(SyncBuffer* syncBuffer); - void applySyncedUpdates(); + void postsync(bool isMaster); + void addSyncable(Syncable* syncable); void addSyncables(const std::vector& syncables); diff --git a/include/openspace/util/syncdata.h b/include/openspace/util/syncdata.h index bf5494a4dd..b9cfe67dc3 100644 --- a/include/openspace/util/syncdata.h +++ b/include/openspace/util/syncdata.h @@ -26,6 +26,7 @@ #define __SYNC_DATA_H__ #include +#include #include #include @@ -41,9 +42,10 @@ public: protected: friend class SyncEngine; + virtual void presync(bool isMaster) {}; virtual void encode(SyncBuffer* syncBuffer) = 0; - virtual void decode(SyncBuffer* syncBuffer, bool directDecode = false) = 0; - virtual void applySyncedUpdate() = 0; + virtual void decode(SyncBuffer* syncBuffer) = 0; + virtual void postsync(bool isMaster) {}; }; @@ -53,6 +55,9 @@ public: SyncData() {}; SyncData(const T& val) : data(val) {}; + SyncData(const SyncData& o) : data(o.data) { + // should not be copied! + }; SyncData& operator=(const T& rhs) { data = rhs; @@ -69,24 +74,30 @@ public: protected: virtual void encode(SyncBuffer* syncBuffer) { + _mutex.lock(); syncBuffer->encode(data); + _mutex.unlock(); } - virtual void decode(SyncBuffer* syncBuffer, bool directDecode = false) { - if (directDecode) { - syncBuffer->decode(data); - } - else { - syncBuffer->decode(doubleBufferedData); - } + virtual void decode(SyncBuffer* syncBuffer) { + _mutex.lock(); + syncBuffer->decode(doubleBufferedData); + _mutex.unlock(); } - virtual void applySyncedUpdate() { - data = doubleBufferedData; + virtual void postsync(bool isMaster) { + // apply synced update + if (!isMaster) { + _mutex.lock(); + data = doubleBufferedData; + _mutex.unlock(); + } }; T data; T doubleBufferedData; + std::mutex _mutex; + }; diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 36ef7ff861..d0dcf0acf3 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -787,11 +787,7 @@ void OpenSpaceEngine::preSynchronization() { void OpenSpaceEngine::postSynchronizationPreDraw() { double t1 = Time::ref().j2000Seconds(); - if (!_isMaster) { - if (_settingsEngine->useDoubleBuffering()) { - _syncEngine->applySyncedUpdates(); - } - } + _syncEngine->postsync(_isMaster); if (_isInShutdownMode) { if (_shutdownCountdown <= 0.f) { @@ -972,7 +968,7 @@ void OpenSpaceEngine::decode() { _syncEngine->decode(_syncBuffer.get()); _scriptEngine->deserialize(_syncBuffer.get()); - //_renderEngine->deserialize(_syncBuffer.get(), _settingsEngine->useDoubleBuffering()); + } } diff --git a/src/engine/syncengine.cpp b/src/engine/syncengine.cpp index 333d826d7b..46401da7cb 100644 --- a/src/engine/syncengine.cpp +++ b/src/engine/syncengine.cpp @@ -37,6 +37,11 @@ namespace { namespace openspace { + void SyncEngine::presync(bool isMaster) { + for (const auto& syncable : _syncables) { + syncable->presync(isMaster); + } + } // should be called on sgct master void SyncEngine::encode(SyncBuffer* syncBuffer) { @@ -52,12 +57,14 @@ namespace openspace { } } - void SyncEngine::applySyncedUpdates() { + void SyncEngine::postsync(bool isMaster) { for (const auto& syncable : _syncables) { - syncable->applySyncedUpdate(); + syncable->postsync(isMaster); } } + + void SyncEngine::addSyncable(Syncable* syncable) { _syncables.push_back(syncable); }