summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDane Springmeyer <dane@mapbox.com>2019-10-23 15:21:09 -0700
committerDane Springmeyer <dane@mapbox.com>2019-10-23 15:21:09 -0700
commitd2cc5d7b53c44ebfea7e3d44bc9c0eef625e77f7 (patch)
treec551d46bae7fbea965e21563f3a3587f68a26fcb
parent1cfd0c4e92df6d0a4209b3e6517da6b7ca01af46 (diff)
downloadqtlocation-mapboxgl-upstream/dodge-line-atlas-overflow.tar.gz
attempt to keep line atlas from overflowingupstream/dodge-line-atlas-overflow
-rw-r--r--src/mbgl/geometry/line_atlas.cpp13
-rw-r--r--src/mbgl/geometry/line_atlas.hpp2
-rw-r--r--src/mbgl/renderer/render_orchestrator.cpp20
3 files changed, 27 insertions, 8 deletions
diff --git a/src/mbgl/geometry/line_atlas.cpp b/src/mbgl/geometry/line_atlas.cpp
index 106a24d015..3a6838bdc1 100644
--- a/src/mbgl/geometry/line_atlas.cpp
+++ b/src/mbgl/geometry/line_atlas.cpp
@@ -122,6 +122,19 @@ LinePatternPos LineAtlas::addDash(const std::vector<float>& dasharray, LinePatte
return position;
}
+void LineAtlas::clear() {
+ positions.clear();
+ nextRow = 0;
+ dirty = true;
+}
+
+uint32_t LineAtlas::getSpace() const {
+ if (image.size.height > nextRow) {
+ return image.size.height - nextRow;
+ }
+ return 0;
+}
+
Size LineAtlas::getSize() const {
return image.size;
}
diff --git a/src/mbgl/geometry/line_atlas.hpp b/src/mbgl/geometry/line_atlas.hpp
index b43583c9c8..5a5cbd842c 100644
--- a/src/mbgl/geometry/line_atlas.hpp
+++ b/src/mbgl/geometry/line_atlas.hpp
@@ -41,6 +41,8 @@ public:
LinePatternPos getDashPosition(const std::vector<float>&, LinePatternCap);
LinePatternPos addDash(const std::vector<float>& dasharray, LinePatternCap);
+ uint32_t getSpace() const;
+ void clear();
Size getSize() const;
private:
diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp
index 50077784b5..42524ff733 100644
--- a/src/mbgl/renderer/render_orchestrator.cpp
+++ b/src/mbgl/renderer/render_orchestrator.cpp
@@ -50,7 +50,7 @@ private:
bool hasRenderPass(RenderPass pass) const override { return layer.get().hasRenderPass(pass); }
void upload(gfx::UploadPass& pass) const override { layer.get().upload(pass); }
void render(PaintParameters& parameters) const override { layer.get().render(parameters); }
- const std::string& getName() const override { return layer.get().getID(); }
+ const std::string& getName() const override { return layer.get().getID(); }
uint32_t index;
};
@@ -142,6 +142,10 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
if (!isMapModeContinuous) {
// Reset zoom history state.
zoomHistory.first = true;
+ if (lineAtlas->getSpace() < 32) {
+ Log::Warning(Event::OpenGL, "Line atlas free space hit %d: was cleared to avoid overflowing", lineAtlas->getSpace());
+ lineAtlas->clear();
+ }
}
if (LayerManager::annotationsEnabled) {
@@ -329,7 +333,7 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
}
}
continue;
- }
+ }
// Handle layers without source.
if (layerIsVisible && zoomFitsLayer && sourceImpl.get() == sourceImpls->at(0).get()) {
@@ -337,7 +341,7 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
const auto& solidBackground = layer.getSolidBackground();
if (solidBackground) {
renderTreeParameters->backgroundColor = *solidBackground;
- continue; // This layer is shown with background color, and it shall not be added to render items.
+ continue; // This layer is shown with background color, and it shall not be added to render items.
}
}
renderItemsEmplaceHint = layerRenderItems.emplace_hint(renderItemsEmplaceHint, layer, nullptr, index);
@@ -387,7 +391,7 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
bool symbolBucketsAdded = false;
for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) {
- auto result = crossTileSymbolIndex.addLayer(*it, updateParameters.transformState.getLatLng().longitude());
+ auto result = crossTileSymbolIndex.addLayer(*it, updateParameters.transformState.getLatLng().longitude());
symbolBucketsAdded = symbolBucketsAdded || (result & CrossTileSymbolIndex::AddLayerResult::BucketsAdded);
symbolBucketsChanged = symbolBucketsChanged || (result != CrossTileSymbolIndex::AddLayerResult::NoChanges);
}
@@ -467,7 +471,7 @@ std::vector<Feature> RenderOrchestrator::queryRenderedFeatures(const ScreenLineS
return queryRenderedFeatures(geometry, options, layers);
}
-
+
void RenderOrchestrator::queryRenderedSymbols(std::unordered_map<std::string, std::vector<Feature>>& resultsByLayer,
const ScreenLineString& geometry,
const std::unordered_map<std::string, const RenderLayer*>& layers,
@@ -498,7 +502,7 @@ void RenderOrchestrator::queryRenderedSymbols(std::unordered_map<std::string, st
std::tie(a.tileID.canonical.z, a.tileID.canonical.y, a.tileID.wrap, a.tileID.canonical.x) <
std::tie(b.tileID.canonical.z, b.tileID.canonical.y, b.tileID.wrap, b.tileID.canonical.x);
});
-
+
for (auto wrappedQueryData : bucketQueryData) {
auto& queryData = wrappedQueryData.get();
auto bucketSymbols = queryData.featureIndex->lookupSymbolFeatures(renderedSymbols[queryData.bucketInstanceId],
@@ -506,7 +510,7 @@ void RenderOrchestrator::queryRenderedSymbols(std::unordered_map<std::string, st
crossTileSymbolIndexLayers,
queryData.tileID,
queryData.featureSortOrder);
-
+
for (auto layer : bucketSymbols) {
auto& resultFeatures = resultsByLayer[layer.first];
std::move(layer.second.begin(), layer.second.end(), std::inserter(resultFeatures, resultFeatures.end()));
@@ -535,7 +539,7 @@ std::vector<Feature> RenderOrchestrator::queryRenderedFeatures(const ScreenLineS
std::move(sourceResults.begin(), sourceResults.end(), std::inserter(resultsByLayer, resultsByLayer.begin()));
}
}
-
+
queryRenderedSymbols(resultsByLayer, geometry, filteredLayers, options);
std::vector<Feature> result;