Merge pull request #7358 from zzmp/fix/px-dirty-atomic

Make procedural dirty marker atomic
This commit is contained in:
samcake 2016-03-16 18:41:12 -07:00
commit 1240f144d4
2 changed files with 14 additions and 5 deletions

View file

@ -62,13 +62,13 @@ QJsonValue Procedural::getProceduralData(const QString& proceduralJson) {
return doc.object()[PROCEDURAL_USER_DATA_KEY]; return doc.object()[PROCEDURAL_USER_DATA_KEY];
} }
Procedural::Procedural() { Procedural::Procedural() : _state { std::make_shared<gpu::State>() } {
_state = std::make_shared<gpu::State>(); _proceduralDataDirty = false;
} }
Procedural::Procedural(const QString& userDataJson) { Procedural::Procedural(const QString& userDataJson) : Procedural() {
parse(userDataJson); parse(userDataJson);
_state = std::make_shared<gpu::State>(); _proceduralDataDirty = true;
} }
void Procedural::parse(const QString& userDataJson) { void Procedural::parse(const QString& userDataJson) {
@ -77,6 +77,9 @@ void Procedural::parse(const QString& userDataJson) {
// This will be called by Procedural::ready // This will be called by Procedural::ready
std::lock_guard<std::mutex> lock(_proceduralDataMutex); std::lock_guard<std::mutex> lock(_proceduralDataMutex);
_proceduralData = proceduralData.toObject(); _proceduralData = proceduralData.toObject();
// Mark as dirty after modifying _proceduralData, but before releasing lock
// to avoid setting it after parsing has begun
_proceduralDataDirty = true; _proceduralDataDirty = true;
} }
@ -166,9 +169,13 @@ void Procedural::parse(const QJsonObject& proceduralData) {
bool Procedural::ready() { bool Procedural::ready() {
// Load any changes to the procedural // Load any changes to the procedural
// Check for changes atomically, in case they are currently being made
if (_proceduralDataDirty) { if (_proceduralDataDirty) {
std::lock_guard<std::mutex> lock(_proceduralDataMutex); std::lock_guard<std::mutex> lock(_proceduralDataMutex);
parse(_proceduralData); parse(_proceduralData);
// Reset dirty flag after reading _proceduralData, but before releasing lock
// to avoid resetting it after more data is set
_proceduralDataDirty = false; _proceduralDataDirty = false;
} }

View file

@ -10,6 +10,8 @@
#ifndef hifi_RenderableProcedrualItem_h #ifndef hifi_RenderableProcedrualItem_h
#define hifi_RenderableProcedrualItem_h #define hifi_RenderableProcedrualItem_h
#include <atomic>
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#include <QtCore/QString> #include <QtCore/QString>
#include <QtCore/QUrl> #include <QtCore/QUrl>
@ -74,7 +76,7 @@ protected:
NetworkShaderPointer _networkShader; NetworkShaderPointer _networkShader;
QJsonObject _parsedUniforms; QJsonObject _parsedUniforms;
QJsonArray _parsedChannels; QJsonArray _parsedChannels;
bool _proceduralDataDirty { true }; std::atomic_bool _proceduralDataDirty;
bool _shaderDirty { true }; bool _shaderDirty { true };
bool _uniformsDirty { true }; bool _uniformsDirty { true };
bool _channelsDirty { true }; bool _channelsDirty { true };