diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-05-22 16:41:40 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-05-24 10:54:06 +0300 |
commit | aa3a7cf02f2b5d0b99bec9d335c9681dcfa38426 (patch) | |
tree | 08d9826c1b419960a1e7a03b6fefb6d21aeab923 /src/mbgl/renderer/buckets/symbol_bucket.cpp | |
parent | d8e9acd0f510a811f5c1fa87738be646ff83b715 (diff) | |
download | qtlocation-mapboxgl-aa3a7cf02f2b5d0b99bec9d335c9681dcfa38426.tar.gz |
[core] SymbolBucket updates complete at placement stage
`RenderSymbolLayer` does not have to update dynamic vertices of its buckets, this logic is moved to placement (which is already updates opacity vertices).
* fixes clustering of labels when text variable placement enabled - as assignes `usesVariablePlacement` per bucket
* simplifies the code in `RenderSymbolLayer` (the `RenderSymbolLayer::upload()` is now omitted).
* symbol buckets are not modified after orchestration finishes
Diffstat (limited to 'src/mbgl/renderer/buckets/symbol_bucket.cpp')
-rw-r--r-- | src/mbgl/renderer/buckets/symbol_bucket.cpp | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index 381ef5b24b..06fccb8ffd 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -10,7 +10,7 @@ namespace mbgl { using namespace style; namespace { - std::atomic<uint32_t> maxBucketInstanceId; +std::atomic<uint32_t> maxBucketInstanceId; } // namespace SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated layout_, @@ -62,7 +62,11 @@ void SymbolBucket::upload(gfx::UploadPass& uploadPass) { } if (!dynamicUploaded) { - text.dynamicVertexBuffer = uploadPass.createVertexBuffer(std::move(text.dynamicVertices), gfx::BufferUsageType::StreamDraw); + if (!text.dynamicVertexBuffer) { + text.dynamicVertexBuffer = uploadPass.createVertexBuffer(std::move(text.dynamicVertices), gfx::BufferUsageType::StreamDraw); + } else { + uploadPass.updateVertexBuffer(*text.dynamicVertexBuffer, std::move(text.dynamicVertices)); + } } if (!placementChangesUploaded) { if (!text.opacityVertexBuffer) { @@ -84,7 +88,11 @@ void SymbolBucket::upload(gfx::UploadPass& uploadPass) { uploadPass.updateIndexBuffer(*icon.indexBuffer, std::move(icon.triangles)); } if (!dynamicUploaded) { - icon.dynamicVertexBuffer = uploadPass.createVertexBuffer(std::move(icon.dynamicVertices), gfx::BufferUsageType::StreamDraw); + if (!icon.dynamicVertexBuffer) { + icon.dynamicVertexBuffer = uploadPass.createVertexBuffer(std::move(icon.dynamicVertices), gfx::BufferUsageType::StreamDraw); + } else { + uploadPass.updateVertexBuffer(*icon.dynamicVertexBuffer, std::move(icon.dynamicVertices)); + } } if (!placementChangesUploaded) { if (!icon.opacityVertexBuffer) { @@ -150,11 +158,6 @@ bool SymbolBucket::hasCollisionCircleData() const { return !collisionCircle.segments.empty(); } -void SymbolBucket::updateOpacity() { - placementChangesUploaded = false; - uploaded = false; -} - void addPlacedSymbol(gfx::IndexVector<gfx::Triangles>& triangles, const PlacedSymbol& placedSymbol) { auto endIndex = placedSymbol.vertexStartIndex + placedSymbol.glyphOffsets.size() * 4; for (auto vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) { @@ -242,8 +245,8 @@ bool SymbolBucket::hasFormatSectionOverrides() const { } std::pair<uint32_t, bool> SymbolBucket::registerAtCrossTileIndex(CrossTileSymbolLayerIndex& index, const OverscaledTileID& tileID, uint32_t& maxCrossTileID) { - bool added = index.addBucket(tileID, *this, maxCrossTileID); - return std::make_pair(bucketInstanceId, added); + bool firstTimeAdded = index.addBucket(tileID, *this, maxCrossTileID); + return std::make_pair(bucketInstanceId, firstTimeAdded); } uint32_t SymbolBucket::place(Placement& placement, const BucketPlacementParameters& params, std::set<uint32_t>& seenIds) { @@ -251,8 +254,14 @@ uint32_t SymbolBucket::place(Placement& placement, const BucketPlacementParamete return bucketInstanceId; } -void SymbolBucket::updateOpacities(Placement& placement, std::set<uint32_t>& seenIds) { - placement.updateBucketOpacities(*this, seenIds); +void SymbolBucket::updateVertices(Placement& placement, bool updateOpacities, const RenderTile& tile, std::set<uint32_t>& seenIds) { + if (updateOpacities) { + placement.updateBucketOpacities(*this, seenIds); + placementChangesUploaded = false; + } + placement.updateBucketDynamicVertices(*this, tile); + dynamicUploaded = false; + uploaded = false; } } // namespace mbgl |