summaryrefslogtreecommitdiff
path: root/src/mbgl/tile/geometry_tile_worker.hpp
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-09-06 15:01:34 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-09-16 12:01:06 -0700
commit41bbd4e4f7d66465433e370ca024ab0239fcace3 (patch)
tree8fe15fa31d97aafeb175a808e431b437297af88b /src/mbgl/tile/geometry_tile_worker.hpp
parent0bd66d40ddf9e75f860fe18e7c80de9c840f48ac (diff)
downloadqtlocation-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.hpp76
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