summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Loer <chris.loer@gmail.com>2018-01-19 11:38:31 -0800
committerChris Loer <chris.loer@gmail.com>2018-01-19 11:38:31 -0800
commitf06eb0a6cfc1ff746959ce864aa5a35a5e080c92 (patch)
tree6ba639c20443d7d8b757c3f79ad9e9b9313f7439
parent7c2e8c5eb1cda536be73e97afbc4b5276735fb51 (diff)
downloadqtlocation-mapboxgl-upstream/cloer-10939.tar.gz
Prune unused layers from CrossTileSymbolIndexupstream/cloer-10939
Fixes issue #10939 -- removed layers would leak entries in the CrossTileSymbolIndex.
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp3
-rw-r--r--src/mbgl/text/cross_tile_symbol_index.cpp12
-rw-r--r--src/mbgl/text/cross_tile_symbol_index.hpp1
3 files changed, 16 insertions, 0 deletions
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp
index 8e5968d4c2..c38f1d56cb 100644
--- a/src/mbgl/renderer/renderer_impl.cpp
+++ b/src/mbgl/renderer/renderer_impl.cpp
@@ -382,8 +382,10 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
bool placementChanged = false;
if (!placement->stillRecent(parameters.timePoint)) {
auto newPlacement = std::make_unique<Placement>(parameters.state, parameters.mapMode);
+ std::set<std::string> usedSymbolLayers;
for (auto it = order.rbegin(); it != order.rend(); ++it) {
if (it->layer.is<RenderSymbolLayer>()) {
+ usedSymbolLayers.insert(it->layer.getID());
newPlacement->placeLayer(*it->layer.as<RenderSymbolLayer>(), parameters.projMatrix, parameters.debugOptions & MapDebugOptions::Collision);
}
}
@@ -393,6 +395,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
// started. If we violate this assumption, then we need to either make CollisionIndex completely independendent of
// FeatureIndex, or find a way for its entries to point to multiple FeatureIndexes.
commitFeatureIndexes();
+ crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers);
if (placementChanged || symbolBucketsChanged) {
placement = std::move(newPlacement);
}
diff --git a/src/mbgl/text/cross_tile_symbol_index.cpp b/src/mbgl/text/cross_tile_symbol_index.cpp
index 8f4956c4ea..f88bab9d6f 100644
--- a/src/mbgl/text/cross_tile_symbol_index.cpp
+++ b/src/mbgl/text/cross_tile_symbol_index.cpp
@@ -169,6 +169,18 @@ bool CrossTileSymbolIndex::addLayer(RenderSymbolLayer& symbolLayer) {
return symbolBucketsChanged;
}
+void CrossTileSymbolIndex::pruneUnusedLayers(const std::set<std::string>& usedLayers) {
+ std::vector<std::string> unusedLayers;
+ for (auto layerIndex : layerIndexes) {
+ if (usedLayers.find(layerIndex.first) == usedLayers.end()) {
+ unusedLayers.push_back(layerIndex.first);
+ }
+ }
+ for (auto unusedLayer : unusedLayers) {
+ layerIndexes.erase(unusedLayer);
+ }
+}
+
void CrossTileSymbolIndex::reset() {
layerIndexes.clear();
}
diff --git a/src/mbgl/text/cross_tile_symbol_index.hpp b/src/mbgl/text/cross_tile_symbol_index.hpp
index 5abcde241c..541c2e3661 100644
--- a/src/mbgl/text/cross_tile_symbol_index.hpp
+++ b/src/mbgl/text/cross_tile_symbol_index.hpp
@@ -57,6 +57,7 @@ public:
CrossTileSymbolIndex();
bool addLayer(RenderSymbolLayer&);
+ void pruneUnusedLayers(const std::set<std::string>&);
void reset();
private: