From 0131a502cc509e46ba52f32cf9f65c71931a7966 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 30 Jun 2015 15:01:19 -0700 Subject: [PATCH] adding locking to updateGeometry method to prevent race conditions --- .../src/RenderableQuadEntityItem.cpp | 49 +++++++++++-------- .../src/RenderableQuadEntityItem.h | 2 + libraries/entities/src/QuadEntityItem.cpp | 16 +++--- libraries/entities/src/QuadEntityItem.h | 1 + 4 files changed, 41 insertions(+), 27 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index dcc6682456..45b4c23b92 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -23,6 +23,8 @@ + + EntityItemPointer RenderableQuadEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return EntityItemPointer(new RenderableQuadEntityItem(entityID, properties)); } @@ -70,25 +72,28 @@ int generateColor() { } void RenderableQuadEntityItem::updateGeometry() { - if (_pointsChanged) { - int compactColor = generateColor(); - _numVertices = 0; - _verticesBuffer.reset(new gpu::Buffer()); - int vertexIndex = 0; - for (int i = 0; i < _normals.size(); i++) { - compactColor = generateColor(); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex++)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); - - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex++)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); - - _numVertices +=2; - } - _pointsChanged = false; + + int compactColor = generateColor(); + _numVertices = 0; + _verticesBuffer.reset(new gpu::Buffer()); + int vertexIndex = 0; + for (int i = 0; i < _normals.size(); i++) { + compactColor = generateColor(); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); + vertexIndex++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); + vertexIndex++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); + + _numVertices +=2; } + _pointsChanged = false; + + + } @@ -101,13 +106,15 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { if (!_pipeline) { createPipeline(); } - PerformanceTimer perfTimer("RenderableQuadEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Quad); Q_ASSERT(args->_batch); - updateGeometry(); + if (_pointsChanged) { + updateGeometry(); + } + gpu::Batch& batch = *args->_batch; Transform transform = Transform(); @@ -120,7 +127,7 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { batch.setInputFormat(_format); batch.setInputBuffer(0, _verticesBuffer, 0, _format->getChannels().at(0)._stride); - + batch.draw(gpu::TRIANGLE_STRIP, _numVertices, 0); RenderableDebugableEntityItem::render(this, args); diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.h b/libraries/entities-renderer/src/RenderableQuadEntityItem.h index 36cf33f4c0..f4708a2f64 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.h +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.h @@ -17,6 +17,7 @@ #include "RenderableDebugableEntityItem.h" #include "RenderableEntityItem.h" #include +#include class RenderableQuadEntityItem : public QuadEntityItem { public: @@ -35,6 +36,7 @@ protected: void updateGeometry(); gpu::BufferPointer _verticesBuffer; unsigned int _numVertices; + }; diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index dab16c0606..e0066f9b92 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -44,7 +44,7 @@ _vertices(QVector(0)) } EntityItemProperties QuadEntityItem::getProperties() const { - + _quadReadWriteLock.lockForWrite(); EntityItemProperties properties = EntityItem::getProperties(); // get the properties from our base class @@ -59,11 +59,12 @@ EntityItemProperties QuadEntityItem::getProperties() const { properties._glowLevel = getGlowLevel(); properties._glowLevelChanged = false; - + _quadReadWriteLock.unlock(); return properties; } bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { + _quadReadWriteLock.lockForWrite(); bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class @@ -83,7 +84,10 @@ bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { } setLastEdited(properties._lastEdited); } + + _quadReadWriteLock.unlock(); return somethingChanged; + } bool QuadEntityItem::appendPoint(const glm::vec3& point) { @@ -106,7 +110,6 @@ bool QuadEntityItem::setNormals(const QVector &normals) { return false; } _normals = normals; - qDebug() << "NORMALS: " << normals; _vertices.clear(); //Go through and create vertices for triangle strip based on normals if (_normals.size() != _points.size()) { @@ -114,10 +117,11 @@ bool QuadEntityItem::setNormals(const QVector &normals) { } glm::vec3 v1, v2, tangent, binormal, point; for (int i = 0; i < _points.size()-1; i++) { + float width = (static_cast (rand()) / static_cast (RAND_MAX) * .1) + .02; point = _points.at(i); //Get tangent tangent = _points.at(i+1) - point; - binormal = glm::normalize(glm::cross(tangent, normals.at(i))) * _lineWidth; + binormal = glm::normalize(glm::cross(tangent, normals.at(i))) * width; v1 = point + binormal; v2 = point - binormal; _vertices << v1 << v2; @@ -172,7 +176,7 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { - + _quadReadWriteLock.lockForWrite(); int bytesRead = 0; const unsigned char* dataAt = data; @@ -181,7 +185,7 @@ int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); - + _quadReadWriteLock.unlock(); return bytesRead; } diff --git a/libraries/entities/src/QuadEntityItem.h b/libraries/entities/src/QuadEntityItem.h index 3fa0651f58..341dbb9c2e 100644 --- a/libraries/entities/src/QuadEntityItem.h +++ b/libraries/entities/src/QuadEntityItem.h @@ -81,6 +81,7 @@ class QuadEntityItem : public EntityItem { QVector _points; QVector _vertices; QVector _normals; + mutable QReadWriteLock _quadReadWriteLock; }; #endif // hifi_QuadEntityItem_h