diff --git a/src/mbgl/map/tile_worker.cpp b/src/mbgl/map/tile_worker.cpp index 96300a803..0262ed420 100644 --- a/src/mbgl/map/tile_worker.cpp +++ b/src/mbgl/map/tile_worker.cpp @@ -18,10 +18,8 @@ using namespace mbgl; TileWorker::TileWorker(TileID id_, std::string sourceID_, Style& style_, - std::vector> layers_, const std::atomic& state_) - : layers(std::move(layers_)), - id(id_), + : id(id_), sourceID(sourceID_), parameters(id.z), style(style_), @@ -33,7 +31,8 @@ TileWorker::~TileWorker() { style.glyphAtlas->removeGlyphs(reinterpret_cast(this)); } -TileParseResult TileWorker::parseAllLayers(const GeometryTile& geometryTile, +TileParseResult TileWorker::parseAllLayers(std::vector> layers, + const GeometryTile& geometryTile, PlacementConfig config) { // We're doing a fresh parse of the tile, because the underlying data has changed. pending.clear(); @@ -85,6 +84,7 @@ TileParseResult TileWorker::parsePendingLayers() { } void TileWorker::redoPlacement( + std::vector> layers, const std::unordered_map>* buckets, PlacementConfig config) { diff --git a/src/mbgl/map/tile_worker.hpp b/src/mbgl/map/tile_worker.hpp index 44868a12f..fc6844445 100644 --- a/src/mbgl/map/tile_worker.hpp +++ b/src/mbgl/map/tile_worker.hpp @@ -42,16 +42,18 @@ public: TileWorker(TileID, std::string sourceID, Style&, - std::vector>, const std::atomic&); ~TileWorker(); - TileParseResult parseAllLayers(const GeometryTile&, PlacementConfig); - TileParseResult parsePendingLayers(); - void redoPlacement(const std::unordered_map>*, - PlacementConfig); + TileParseResult parseAllLayers(std::vector>, + const GeometryTile&, + PlacementConfig); - std::vector> layers; + TileParseResult parsePendingLayers(); + + void redoPlacement(std::vector>, + const std::unordered_map>*, + PlacementConfig); private: void parseLayer(const StyleLayer&, const GeometryTile&); diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index 90603c0a6..0f383295f 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -16,16 +16,16 @@ VectorTileData::VectorTileData(const TileID& id_, Style& style_, const std::function& callback) : TileData(id_), + style(style_), worker(style_.workers), tileWorker(id_, sourceID, style_, - style_.layers, state), monitor(std::move(monitor_)) { state = State::loading; - req = monitor->monitorTile([callback, sourceID, this](std::exception_ptr err, std::unique_ptr tile) { + req = monitor->monitorTile([callback, this](std::exception_ptr err, std::unique_ptr tile) { if (err) { try { std::rethrow_exception(err); @@ -54,7 +54,7 @@ VectorTileData::VectorTileData(const TileID& id_, // when tile data changed. Replacing the workdRequest will cancel a pending work // request in case there is one. workRequest.reset(); - workRequest = worker.parseGeometryTile(tileWorker, std::move(tile), targetConfig, [callback, sourceID, this, config = targetConfig] (TileParseResult result) { + workRequest = worker.parseGeometryTile(tileWorker, style.layers, std::move(tile), targetConfig, [callback, this, config = targetConfig] (TileParseResult result) { workRequest.reset(); if (state == State::obsolete) { return; @@ -162,7 +162,7 @@ void VectorTileData::redoPlacement(const PlacementConfig newConfig) { void VectorTileData::redoPlacement() { workRequest.reset(); - workRequest = worker.redoPlacement(tileWorker, buckets, targetConfig, [this, config = targetConfig] { + workRequest = worker.redoPlacement(tileWorker, style.layers, buckets, targetConfig, [this, config = targetConfig] { workRequest.reset(); // Persist the configuration we just placed so that we can later check whether we need to diff --git a/src/mbgl/map/vector_tile_data.hpp b/src/mbgl/map/vector_tile_data.hpp index 1a082fc61..81064e313 100644 --- a/src/mbgl/map/vector_tile_data.hpp +++ b/src/mbgl/map/vector_tile_data.hpp @@ -36,6 +36,7 @@ public: void cancel() override; private: + Style& style; Worker& worker; TileWorker tileWorker; diff --git a/src/mbgl/util/worker.cpp b/src/mbgl/util/worker.cpp index b0005eda6..9940fb649 100644 --- a/src/mbgl/util/worker.cpp +++ b/src/mbgl/util/worker.cpp @@ -30,11 +30,12 @@ public: } void parseGeometryTile(TileWorker* worker, + std::vector> layers, std::unique_ptr tile, PlacementConfig config, std::function callback) { try { - callback(worker->parseAllLayers(*tile, config)); + callback(worker->parseAllLayers(layers, *tile, config)); } catch (const std::exception& ex) { callback(TileParseResult(ex.what())); } @@ -50,10 +51,11 @@ public: } void redoPlacement(TileWorker* worker, + std::vector> layers, const std::unordered_map>* buckets, PlacementConfig config, std::function callback) { - worker->redoPlacement(buckets, config); + worker->redoPlacement(layers, buckets, config); callback(); } }; @@ -78,12 +80,13 @@ Worker::parseRasterTile(std::unique_ptr bucket, std::unique_ptr Worker::parseGeometryTile(TileWorker& worker, + std::vector> layers, std::unique_ptr tile, PlacementConfig config, std::function callback) { current = (current + 1) % threads.size(); return threads[current]->invokeWithCallback(&Worker::Impl::parseGeometryTile, callback, &worker, - std::move(tile), config); + std::move(layers), std::move(tile), config); } std::unique_ptr @@ -96,12 +99,13 @@ Worker::parsePendingGeometryTileLayers(TileWorker& worker, std::unique_ptr Worker::redoPlacement(TileWorker& worker, + std::vector> layers, const std::unordered_map>& buckets, PlacementConfig config, std::function callback) { current = (current + 1) % threads.size(); return threads[current]->invokeWithCallback(&Worker::Impl::redoPlacement, callback, &worker, - &buckets, config); + layers, &buckets, config); } } // end namespace mbgl diff --git a/src/mbgl/util/worker.hpp b/src/mbgl/util/worker.hpp index e7bd3daad..f0f291e24 100644 --- a/src/mbgl/util/worker.hpp +++ b/src/mbgl/util/worker.hpp @@ -40,6 +40,7 @@ public: std::function callback); Request parseGeometryTile(TileWorker&, + std::vector>, std::unique_ptr, PlacementConfig, std::function callback); @@ -48,6 +49,7 @@ public: std::function callback); Request redoPlacement(TileWorker&, + std::vector>, const std::unordered_map>&, PlacementConfig config, std::function callback);