From fdcb8a8d6954be90f745c94c2b77da4d867404c9 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Wed, 21 Aug 2019 15:41:09 +0300 Subject: [core] Fix GeoJSON tiles update Before this change, GeoJSON tiles data were updated before the corresponding layers were applied, therefore `GeometryTileWorker` parsed new data with the outdated layers. It caused the following render test failure: `mbgl-render-test text-max-width/unlimited regressions/mapbox-gl-native#9976 --recycle-map` Now a GeoJSON tile, which needs relayout, is not parsed until the valid layers are set. --- src/mbgl/renderer/sources/render_geojson_source.cpp | 2 +- src/mbgl/tile/geojson_tile.cpp | 4 ++-- src/mbgl/tile/geojson_tile.hpp | 2 +- src/mbgl/tile/geometry_tile.cpp | 4 ++-- src/mbgl/tile/geometry_tile.hpp | 2 +- src/mbgl/tile/geometry_tile_worker.cpp | 3 ++- src/mbgl/tile/geometry_tile_worker.hpp | 2 +- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/mbgl/renderer/sources/render_geojson_source.cpp b/src/mbgl/renderer/sources/render_geojson_source.cpp index e451dab6d3..035244e371 100644 --- a/src/mbgl/renderer/sources/render_geojson_source.cpp +++ b/src/mbgl/renderer/sources/render_geojson_source.cpp @@ -94,7 +94,7 @@ void RenderGeoJSONSource::update(Immutable baseImpl_, const uint8_t maxZ = impl().getZoomRange().max; for (const auto& pair : tilePyramid.getTiles()) { if (pair.first.canonical.z <= maxZ) { - static_cast(pair.second.get())->updateData(data_->getTile(pair.first.canonical)); + static_cast(pair.second.get())->updateData(data_->getTile(pair.first.canonical), needsRelayout); } } } diff --git a/src/mbgl/tile/geojson_tile.cpp b/src/mbgl/tile/geojson_tile.cpp index 4cf971df84..0782f74d5d 100644 --- a/src/mbgl/tile/geojson_tile.cpp +++ b/src/mbgl/tile/geojson_tile.cpp @@ -13,8 +13,8 @@ GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID, updateData(std::move(features)); } -void GeoJSONTile::updateData(mapbox::feature::feature_collection features) { - setData(std::make_unique(std::move(features))); +void GeoJSONTile::updateData(mapbox::feature::feature_collection features, bool resetLayers) { + setData(std::make_unique(std::move(features)), resetLayers); } void GeoJSONTile::querySourceFeatures( diff --git a/src/mbgl/tile/geojson_tile.hpp b/src/mbgl/tile/geojson_tile.hpp index 725dc4850c..9161e33f0c 100644 --- a/src/mbgl/tile/geojson_tile.hpp +++ b/src/mbgl/tile/geojson_tile.hpp @@ -14,7 +14,7 @@ public: const TileParameters&, mapbox::feature::feature_collection); - void updateData(mapbox::feature::feature_collection); + void updateData(mapbox::feature::feature_collection, bool resetLayers = false); void querySourceFeatures( std::vector& result, diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index a431ae423e..3087b4fc6a 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -176,13 +176,13 @@ void GeometryTile::setError(std::exception_ptr err) { observer->onTileError(*this, err); } -void GeometryTile::setData(std::unique_ptr data_) { +void GeometryTile::setData(std::unique_ptr data_, bool resetLayers) { // Mark the tile as pending again if it was complete before to prevent signaling a complete // state despite pending parse operations. pending = true; ++correlationID; - worker.self().invoke(&GeometryTileWorker::setData, std::move(data_), correlationID); + worker.self().invoke(&GeometryTileWorker::setData, std::move(data_), resetLayers, correlationID); } std::unique_ptr GeometryTile::createRenderData() { diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index 7c46edfc1d..8682c8c76b 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -34,7 +34,7 @@ public: ~GeometryTile() override; void setError(std::exception_ptr); - void setData(std::unique_ptr); + void setData(std::unique_ptr, bool resetLayers = false); std::unique_ptr createRenderData() override; void setLayers(const std::vector>&) override; diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index f4d57e5bfc..428a5b0d5e 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -117,10 +117,11 @@ GeometryTileWorker::~GeometryTileWorker() = default; completed parse. */ -void GeometryTileWorker::setData(std::unique_ptr data_, uint64_t correlationID_) { +void GeometryTileWorker::setData(std::unique_ptr data_, bool resetLayers_, uint64_t correlationID_) { try { data = std::move(data_); correlationID = correlationID_; + if (resetLayers_) layers = nullopt; switch (state) { case Idle: diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp index 258f2cd186..96b4e2e83a 100644 --- a/src/mbgl/tile/geometry_tile_worker.hpp +++ b/src/mbgl/tile/geometry_tile_worker.hpp @@ -39,7 +39,7 @@ public: ~GeometryTileWorker(); void setLayers(std::vector>, uint64_t correlationID); - void setData(std::unique_ptr, uint64_t correlationID); + void setData(std::unique_ptr, bool resetLayers, uint64_t correlationID); void setShowCollisionBoxes(bool showCollisionBoxes_, uint64_t correlationID_); void onGlyphsAvailable(GlyphMap glyphs); -- cgit v1.2.1