mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 18:50:00 +02:00
Merge pull request #7358 from zzmp/fix/px-dirty-atomic
Make procedural dirty marker atomic
This commit is contained in:
commit
1240f144d4
2 changed files with 14 additions and 5 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
Loading…
Reference in a new issue