diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-09-06 15:01:34 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-09-16 12:01:06 -0700 |
commit | 41bbd4e4f7d66465433e370ca024ab0239fcace3 (patch) | |
tree | 8fe15fa31d97aafeb175a808e431b437297af88b /src/mbgl/tile/geometry_tile_worker.hpp | |
parent | 0bd66d40ddf9e75f860fe18e7c80de9c840f48ac (diff) | |
download | qtlocation-mapboxgl-41bbd4e4f7d66465433e370ca024ab0239fcace3.tar.gz |
[core] Use an actor model for tile worker concurrency
Diffstat (limited to 'src/mbgl/tile/geometry_tile_worker.hpp')
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.hpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp new file mode 100644 index 0000000000..cc5e48f9b4 --- /dev/null +++ b/src/mbgl/tile/geometry_tile_worker.hpp @@ -0,0 +1,76 @@ +#pragma once + +#include <mbgl/map/mode.hpp> +#include <mbgl/tile/tile_id.hpp> +#include <mbgl/text/placement_config.hpp> +#include <mbgl/actor/actor_ref.hpp> +#include <mbgl/util/optional.hpp> + +#include <atomic> +#include <memory> +#include <unordered_map> + +namespace mbgl { + +class GeometryTile; +class GeometryTileData; +class SpriteStore; +class GlyphAtlas; +class GlyphStore; +class SymbolLayout; + +namespace style { +class Layer; +} // namespace style + +class GeometryTileWorker { +public: + GeometryTileWorker(ActorRef<GeometryTileWorker> self, + ActorRef<GeometryTile> parent, + OverscaledTileID, + SpriteStore&, + GlyphAtlas&, + GlyphStore&, + const std::atomic<bool>&, + const MapMode); + ~GeometryTileWorker(); + + void setLayers(std::vector<std::unique_ptr<style::Layer>>, uint64_t correlationID); + void setData(std::unique_ptr<const GeometryTileData>, uint64_t correlationID); + void setPlacementConfig(PlacementConfig, uint64_t correlationID); + +private: + void coalesce(); + void coalesced(); + void redoLayout(); + void attemptPlacement(); + + ActorRef<GeometryTileWorker> self; + ActorRef<GeometryTile> parent; + + const OverscaledTileID id; + SpriteStore& spriteStore; + GlyphAtlas& glyphAtlas; + GlyphStore& glyphStore; + const std::atomic<bool>& obsolete; + const MapMode mode; + + enum State { + Idle, + Coalescing, + NeedLayout, + NeedPlacement + }; + + State state = Idle; + uint64_t correlationID = 0; + + // Outer optional indicates whether we've received it or not. + optional<std::vector<std::unique_ptr<style::Layer>>> layers; + optional<std::unique_ptr<const GeometryTileData>> data; + optional<PlacementConfig> placementConfig; + + std::vector<std::unique_ptr<SymbolLayout>> symbolLayouts; +}; + +} // namespace mbgl |