From e14a41c3e0533ec5e6e24946938bd8c207e80763 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Wed, 27 Jul 2022 23:10:27 +0200 Subject: [PATCH 1/5] Fix voxel deadlock and improve performance --- .../src/RenderablePolyVoxEntityItem.cpp | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index ad0b5123ec..b1c7547c48 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -198,13 +198,17 @@ bool isEdged(PolyVoxEntityItem::PolyVoxSurfaceStyle surfaceStyle) { void RenderablePolyVoxEntityItem::setVoxelData(const QByteArray& voxelData) { // accept compressed voxel information from the entity-server + bool is_updated = false; withWriteLock([&] { if (_voxelData != voxelData) { _voxelData = voxelData; _voxelDataDirty = true; - startUpdates(); + is_updated = true; } }); + if (is_updated) { + startUpdates(); + } } void RenderablePolyVoxEntityItem::setVoxelSurfaceStyle(PolyVoxSurfaceStyle voxelSurfaceStyle) { @@ -249,6 +253,9 @@ bool RenderablePolyVoxEntityItem::setVoxel(const ivec3& v, uint8_t toValue) { withWriteLock([&] { result = setVoxelInternal(v, toValue); }); + if (result) { + startUpdates(); + } return result; } @@ -294,10 +301,12 @@ bool RenderablePolyVoxEntityItem::setAll(uint8_t toValue) { result |= setVoxelInternal(v, toValue); }); }); + if (result) { + startUpdates(); + } return result; } - bool RenderablePolyVoxEntityItem::setCuboid(const glm::vec3& lowPosition, const glm::vec3& cuboidSize, int toValue) { bool result = false; if (_locked) { @@ -316,11 +325,12 @@ bool RenderablePolyVoxEntityItem::setCuboid(const glm::vec3& lowPosition, const result |= setVoxelInternal(v, toValue); }); }); + if (result) { + startUpdates(); + } return result; } - - bool RenderablePolyVoxEntityItem::setVoxelInVolume(const vec3& position, uint8_t toValue) { if (_locked) { return false; @@ -350,6 +360,9 @@ bool RenderablePolyVoxEntityItem::setSphereInVolume(const vec3& center, float ra } }); }); + if (result) { + startUpdates(); + } return result; } @@ -407,6 +420,9 @@ bool RenderablePolyVoxEntityItem::setSphere(const vec3& centerWorldCoords, float // } }); }); + if (result) { + startUpdates(); + } return result; } @@ -452,6 +468,9 @@ bool RenderablePolyVoxEntityItem::setCapsule(const vec3& startWorldCoords, const } }); }); + if (result) { + startUpdates(); + } return result; } @@ -718,7 +737,7 @@ void RenderablePolyVoxEntityItem::changeUpdates(bool value) { EntitySimulationPointer simulation = entityTree->getSimulation(); if (simulation) { _updateNeeded = value; - _flags |= Simulation::DIRTY_UPDATEABLE; + markDirtyFlags(Simulation::DIRTY_UPDATEABLE); simulation->changeEntity(getThisPointer()); } } @@ -964,6 +983,7 @@ void RenderablePolyVoxEntityItem::setVoxelMarkNeighbors(int x, int y, int z, uin bool RenderablePolyVoxEntityItem::setVoxelInternal(const ivec3& v, uint8_t toValue) { // set a voxel without recompressing the voxel data. This assumes that the caller has write-locked the entity. + // TODO: could be made much more performant by moving startUpdates() to another function bool result = updateOnCount(v, toValue); if (result) { if (isEdged()) { @@ -972,9 +992,7 @@ bool RenderablePolyVoxEntityItem::setVoxelInternal(const ivec3& v, uint8_t toVal setVoxelMarkNeighbors(v.x, v.y, v.z, toValue); } _volDataDirty = true; - startUpdates(); } - return result; } @@ -1049,7 +1067,7 @@ void RenderablePolyVoxEntityItem::setVoxelsFromData(QByteArray uncompressedData, quint16 voxelXSize, quint16 voxelYSize, quint16 voxelZSize) { // this accepts the payload from uncompressVolumeData ivec3 low{ 0 }; - int index = 0; + bool result = false; withWriteLock([&] { if (isEdged()) { @@ -1057,11 +1075,14 @@ void RenderablePolyVoxEntityItem::setVoxelsFromData(QByteArray uncompressedData, } loop3(ivec3(0), ivec3(voxelXSize, voxelYSize, voxelZSize), [&](const ivec3& v) { int uncompressedIndex = (v.z * (voxelYSize) * (voxelXSize)) + (v.y * (voxelZSize)) + v.x; - setVoxelInternal(v, uncompressedData[uncompressedIndex]); + result |= setVoxelInternal(v, uncompressedData[uncompressedIndex]); }); _state = PolyVoxState::UncompressingFinished; }); + if (result) { + startUpdates(); + } } void RenderablePolyVoxEntityItem::compressVolumeDataAndSendEditPacket() { From 0dea304d72a8abbdbdd758309da9daa6da70be11 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Thu, 28 Jul 2022 01:03:26 +0200 Subject: [PATCH 2/5] Update libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp Co-authored-by: HifiExperiments <53453710+HifiExperiments@users.noreply.github.com> --- libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index b1c7547c48..b90ffba99b 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -198,7 +198,7 @@ bool isEdged(PolyVoxEntityItem::PolyVoxSurfaceStyle surfaceStyle) { void RenderablePolyVoxEntityItem::setVoxelData(const QByteArray& voxelData) { // accept compressed voxel information from the entity-server - bool is_updated = false; + bool changed = false; withWriteLock([&] { if (_voxelData != voxelData) { _voxelData = voxelData; From fac118ec8a628634cf6585ed62e179e11c0a7667 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Thu, 28 Jul 2022 01:07:05 +0200 Subject: [PATCH 3/5] Removed outdated TODO comment --- libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index b90ffba99b..74efc00349 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -983,7 +983,6 @@ void RenderablePolyVoxEntityItem::setVoxelMarkNeighbors(int x, int y, int z, uin bool RenderablePolyVoxEntityItem::setVoxelInternal(const ivec3& v, uint8_t toValue) { // set a voxel without recompressing the voxel data. This assumes that the caller has write-locked the entity. - // TODO: could be made much more performant by moving startUpdates() to another function bool result = updateOnCount(v, toValue); if (result) { if (isEdged()) { From 42cd0ddfca5178f85dff7eca296c2352b7340ce7 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Sat, 30 Jul 2022 12:02:51 +0200 Subject: [PATCH 4/5] Update libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Julian Groß --- libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 74efc00349..238823d259 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -203,7 +203,7 @@ void RenderablePolyVoxEntityItem::setVoxelData(const QByteArray& voxelData) { if (_voxelData != voxelData) { _voxelData = voxelData; _voxelDataDirty = true; - is_updated = true; + changed = true; } }); if (is_updated) { From e60dc098da4f72cab241df15d00019ae174b24c5 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Sat, 30 Jul 2022 12:02:55 +0200 Subject: [PATCH 5/5] Update libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Julian Groß --- libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 238823d259..5373cebead 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -206,7 +206,7 @@ void RenderablePolyVoxEntityItem::setVoxelData(const QByteArray& voxelData) { changed = true; } }); - if (is_updated) { + if (changed) { startUpdates(); } }