From 870d432f34cee2fff2c0b06ddf6d9ac330253cd9 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 4 Nov 2016 13:00:41 -0700 Subject: [core] Separate pathway for notifying workers of new images/glyphs --- src/mbgl/style/source_impl.cpp | 6 ++++ src/mbgl/style/source_impl.hpp | 12 ++++++-- src/mbgl/style/style.cpp | 11 ++++++-- src/mbgl/style/style.hpp | 1 + src/mbgl/tile/geometry_tile.cpp | 4 +++ src/mbgl/tile/geometry_tile.hpp | 1 + src/mbgl/tile/geometry_tile_worker.cpp | 51 +++++++++++++++++++++++++++++----- src/mbgl/tile/geometry_tile_worker.hpp | 2 ++ src/mbgl/tile/tile.hpp | 1 + 9 files changed, 77 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/mbgl/style/source_impl.cpp b/src/mbgl/style/source_impl.cpp index 1fb6d59f0e..73fc30d2dc 100644 --- a/src/mbgl/style/source_impl.cpp +++ b/src/mbgl/style/source_impl.cpp @@ -172,6 +172,12 @@ void Source::Impl::updateTiles(const UpdateParameters& parameters) { } } +void Source::Impl::updateSymbolDependentTiles() { + for (auto& pair : tiles) { + pair.second->symbolDependenciesChanged(); + } +} + void Source::Impl::reloadTiles() { cache.clear(); diff --git a/src/mbgl/style/source_impl.hpp b/src/mbgl/style/source_impl.hpp index 14ed9cd01c..a4dd48444e 100644 --- a/src/mbgl/style/source_impl.hpp +++ b/src/mbgl/style/source_impl.hpp @@ -43,11 +43,17 @@ public: virtual void loadDescription(FileSource&) = 0; bool isLoaded() const; - // Called when the camera has changed or icons or glyphs are loaded. May load new - // tiles, unload obsolete tiles, and trigger further parsing of incomplete tiles or - // re-placement of existing complete tiles. + // Called when the camera has changed. May load new tiles, unload obsolete tiles, or + // trigger re-placement of existing complete tiles. void updateTiles(const UpdateParameters&); + // Called when icons or glyphs are loaded. Triggers further processing of tiles which + // were waiting on such dependencies. + void updateSymbolDependentTiles(); + + // Removes all tiles (by putting them into the cache). + void removeTiles(); + // Request that all loaded tiles re-run the layout operation on the existing source // data with fresh style information. void reloadTiles(); diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index e1cbe56bc5..fbe28e1795 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -218,6 +218,12 @@ void Style::updateTiles(const UpdateParameters& parameters) { } } +void Style::updateSymbolDependentTiles() { + for (const auto& source : sources) { + source->baseImpl->updateSymbolDependentTiles(); + } +} + void Style::relayout() { for (const auto& sourceID : updateBatch.sourceIDs) { Source* source = getSource(sourceID); @@ -463,7 +469,7 @@ void Style::setObserver(style::Observer* observer_) { void Style::onGlyphsLoaded(const FontStack& fontStack, const GlyphRange& glyphRange) { observer->onGlyphsLoaded(fontStack, glyphRange); - observer->onUpdate(Update::Repaint); + updateSymbolDependentTiles(); } void Style::onGlyphsError(const FontStack& fontStack, const GlyphRange& glyphRange, std::exception_ptr error) { @@ -513,7 +519,8 @@ void Style::onTileError(Source& source, const OverscaledTileID& tileID, std::exc void Style::onSpriteLoaded() { observer->onSpriteLoaded(); - observer->onUpdate(Update::Repaint); + observer->onUpdate(Update::Repaint); // For *-pattern properties. + updateSymbolDependentTiles(); } void Style::onSpriteError(std::exception_ptr error) { diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index 21b25857d6..14aef5de42 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -121,6 +121,7 @@ private: std::vector>::const_iterator findLayer(const std::string& layerID) const; void reloadLayerSource(Layer&); + void updateSymbolDependentTiles(); // GlyphStoreObserver implementation. void onGlyphsLoaded(const FontStack&, const GlyphRange&) override; diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 46e2b414fe..c77467ebc1 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -65,6 +65,10 @@ void GeometryTile::setPlacementConfig(const PlacementConfig& desiredConfig) { worker.invoke(&GeometryTileWorker::setPlacementConfig, desiredConfig, correlationID); } +void GeometryTile::symbolDependenciesChanged() { + worker.invoke(&GeometryTileWorker::symbolDependenciesChanged); +} + void GeometryTile::redoLayout() { // Mark the tile as pending again if it was complete before to prevent signaling a complete // state despite pending parse operations. diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index bcc71480af..cb3ca54633 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -35,6 +35,7 @@ public: void setData(std::unique_ptr); void setPlacementConfig(const PlacementConfig&) override; + void symbolDependenciesChanged() override; void redoLayout() override; Bucket* getBucket(const style::Layer&) override; diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index b6f166be56..6ff3c67793 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -42,13 +42,13 @@ GeometryTileWorker::~GeometryTileWorker() { States are indicated by [state], lines are transitions triggered by messages, (parentheses) are actions taken on transition. - [idle] <------------------. - | | - set{Data,Layers,Placement} | - | | - (do layout/placement; self-send "coalesced") | - v | - [coalescing] --- coalesced --. + [idle] <----------------------------. + | | + set{Data,Layers,Placement}, symbolDependenciesChanged | + | | + (do layout/placement; self-send "coalesced") | + v | + [coalescing] --- coalesced ------------. | | .-----------------. .---------------. | | @@ -140,6 +140,31 @@ void GeometryTileWorker::setPlacementConfig(PlacementConfig placementConfig_, ui } } +void GeometryTileWorker::symbolDependenciesChanged() { + try { + switch (state) { + case Idle: + if (hasPendingSymbolDependencies()) { + attemptPlacement(); + coalesce(); + } + break; + + case Coalescing: + if (hasPendingSymbolDependencies()) { + state = NeedPlacement; + } + break; + + case NeedPlacement: + case NeedLayout: + break; + } + } catch (...) { + parent.invoke(&GeometryTile::onError, std::current_exception()); + } +} + void GeometryTileWorker::coalesced() { try { switch (state) { @@ -238,6 +263,18 @@ void GeometryTileWorker::redoLayout() { attemptPlacement(); } +bool GeometryTileWorker::hasPendingSymbolDependencies() const { + bool result = false; + + for (const auto& symbolLayout : symbolLayouts) { + if (symbolLayout->state == SymbolLayout::Pending) { + result = true; + } + } + + return result; +} + void GeometryTileWorker::attemptPlacement() { if (!data || !layers || !placementConfig) { return; diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp index d55b29702c..58b5e23cfd 100644 --- a/src/mbgl/tile/geometry_tile_worker.hpp +++ b/src/mbgl/tile/geometry_tile_worker.hpp @@ -34,12 +34,14 @@ public: void setLayers(std::vector>, uint64_t correlationID); void setData(std::unique_ptr, uint64_t correlationID); void setPlacementConfig(PlacementConfig, uint64_t correlationID); + void symbolDependenciesChanged(); private: void coalesce(); void coalesced(); void redoLayout(); void attemptPlacement(); + bool hasPendingSymbolDependencies() const; ActorRef self; ActorRef parent; diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp index 949bc0e334..eea89bd634 100644 --- a/src/mbgl/tile/tile.hpp +++ b/src/mbgl/tile/tile.hpp @@ -48,6 +48,7 @@ public: virtual Bucket* getBucket(const style::Layer&) = 0; virtual void setPlacementConfig(const PlacementConfig&) {} + virtual void symbolDependenciesChanged() {}; virtual void redoLayout() {} virtual void queryRenderedFeatures( -- cgit v1.2.1