diff options
author | Dane Springmeyer <dane@mapbox.com> | 2019-10-23 15:21:09 -0700 |
---|---|---|
committer | Dane Springmeyer <dane@mapbox.com> | 2019-10-23 15:21:09 -0700 |
commit | d2cc5d7b53c44ebfea7e3d44bc9c0eef625e77f7 (patch) | |
tree | c551d46bae7fbea965e21563f3a3587f68a26fcb | |
parent | 1cfd0c4e92df6d0a4209b3e6517da6b7ca01af46 (diff) | |
download | qtlocation-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.cpp | 13 | ||||
-rw-r--r-- | src/mbgl/geometry/line_atlas.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.cpp | 20 |
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; |