summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-05-15 14:24:26 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-05-19 18:15:33 +0300
commit0e45138547e906a0a3d918e9ace262e53d35fb46 (patch)
treee12a7f16cc440b48f1ce5563340ac15876c31def
parent52a69044e8a5dfc1df518673e83909b184040615 (diff)
downloadqtlocation-mapboxgl-0e45138547e906a0a3d918e9ace262e53d35fb46.tar.gz
[core] RenderLayerSymbolInterface is not used in CrossTileSymbolIndex
-rw-r--r--src/mbgl/renderer/bucket.hpp12
-rw-r--r--src/mbgl/renderer/buckets/symbol_bucket.cpp12
-rw-r--r--src/mbgl/renderer/buckets/symbol_bucket.hpp5
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.cpp9
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.hpp2
-rw-r--r--src/mbgl/renderer/render_layer.hpp15
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp21
-rw-r--r--src/mbgl/text/cross_tile_symbol_index.cpp33
-rw-r--r--src/mbgl/text/cross_tile_symbol_index.hpp5
9 files changed, 71 insertions, 43 deletions
diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp
index a0d2895b70..92f2c76e4e 100644
--- a/src/mbgl/renderer/bucket.hpp
+++ b/src/mbgl/renderer/bucket.hpp
@@ -13,6 +13,8 @@ class UploadPass;
} // namespace gfx
class RenderLayer;
+class CrossTileSymbolLayerIndex;
+class OverscaledTileID;
class PatternDependency;
using PatternLayerMap = std::map<std::string, PatternDependency>;
@@ -48,7 +50,15 @@ public:
// Implementations of this class check at least that this bucket has
// the same layer type with the given layer, but extra checks are also
// possible.
- virtual bool supportsLayer(const style::Layer::Impl&) const = 0;
+ virtual bool supportsLayer(const style::Layer::Impl&) const = 0;
+ // The following methods are implemented by buckets that require cross-tile indexing and placement.
+
+ // Returns a pair, the first element of which is a bucket cross-tile id
+ // on success call; `0` otherwise. The second element is `true` if
+ // the bucket was originally registered; `false` otherwise.
+ virtual std::pair<uint32_t, bool> registerAtCrossTileIndex(CrossTileSymbolLayerIndex&, const OverscaledTileID&, uint32_t&) {
+ return std::make_pair(0u, false);
+ }
protected:
Bucket() = default;
diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp
index f290288114..3192e694c8 100644
--- a/src/mbgl/renderer/buckets/symbol_bucket.cpp
+++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp
@@ -2,11 +2,15 @@
#include <mbgl/renderer/layers/render_symbol_layer.hpp>
#include <mbgl/renderer/bucket_parameters.hpp>
#include <mbgl/style/layers/symbol_layer_impl.hpp>
+#include <mbgl/text/cross_tile_symbol_index.hpp>
#include <mbgl/text/glyph_atlas.hpp>
namespace mbgl {
using namespace style;
+namespace {
+ std::atomic<uint32_t> maxBucketInstanceId;
+} // namespace
SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated layout_,
const std::map<std::string, Immutable<style::LayerProperties>>& paintProperties_,
@@ -27,7 +31,8 @@ SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated layo
symbolInstances(std::move(symbolInstances_)),
textSizeBinder(SymbolSizeBinder::create(zoom, textSize, TextSize::defaultValue())),
iconSizeBinder(SymbolSizeBinder::create(zoom, iconSize, IconSize::defaultValue())),
- tilePixelRatio(tilePixelRatio_) {
+ tilePixelRatio(tilePixelRatio_),
+ bucketInstanceId(++maxBucketInstanceId) {
for (const auto& pair : paintProperties_) {
const auto& evaluated = getEvaluated<SymbolLayerProperties>(pair.second);
@@ -239,4 +244,9 @@ bool SymbolBucket::hasFormatSectionOverrides() const {
return *hasFormatSectionOverrides_;
}
+std::pair<uint32_t, bool> SymbolBucket::registerAtCrossTileIndex(CrossTileSymbolLayerIndex& index, const OverscaledTileID& tileID, uint32_t& maxCrossTileID) {
+ bool added = index.addBucket(tileID, *this, maxCrossTileID);
+ return std::make_pair(bucketInstanceId, added);
+}
+
} // namespace mbgl
diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp
index 0b9c5e583f..8e24e711d6 100644
--- a/src/mbgl/renderer/buckets/symbol_bucket.hpp
+++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp
@@ -16,6 +16,8 @@
namespace mbgl {
+class CrossTileSymbolLayerIndex;
+
class PlacedSymbol {
public:
PlacedSymbol(Point<float> anchorPoint_, uint16_t segment_, float lowerSize_, float upperSize_,
@@ -57,6 +59,7 @@ public:
void upload(gfx::UploadPass&) override;
bool hasData() const override;
bool supportsLayer(const style::Layer::Impl&) const override;
+ std::pair<uint32_t, bool> registerAtCrossTileIndex(CrossTileSymbolLayerIndex&, const OverscaledTileID&, uint32_t& maxCrossTileID) override;
bool hasTextData() const;
bool hasIconData() const;
bool hasCollisionBoxData() const;
@@ -132,7 +135,7 @@ public:
} collisionCircle;
const float tilePixelRatio;
- uint32_t bucketInstanceId = 0;
+ uint32_t bucketInstanceId;
bool justReloaded = false;
mutable optional<bool> hasFormatSectionOverrides_;
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp
index 576bdd92d8..53b141816d 100644
--- a/src/mbgl/renderer/layers/render_symbol_layer.cpp
+++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp
@@ -681,6 +681,15 @@ void RenderSymbolLayer::setRenderTiles(RenderTiles tiles, const TransformState&
return std::tie(b.get().id.canonical.z, par.y, par.x) < std::tie(a.get().id.canonical.z, pbr.y, pbr.x);
});
+
+ placementData.clear();
+ for (RenderTile& renderTile : renderTiles) {
+ auto bucket = renderTile.tile.getBucket<SymbolBucket>(*baseImpl);
+ if (bucket && bucket->bucketLeaderID == getID()) {
+ // Only place this layer if it's the "group leader" for the bucket
+ placementData.push_back({*bucket, renderTile});
+ }
+ }
}
} // namespace mbgl
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.hpp b/src/mbgl/renderer/layers/render_symbol_layer.hpp
index 67b8a58314..ca9b42728c 100644
--- a/src/mbgl/renderer/layers/render_symbol_layer.hpp
+++ b/src/mbgl/renderer/layers/render_symbol_layer.hpp
@@ -69,7 +69,7 @@ private:
void upload(gfx::UploadPass&, UploadParameters&) override;
void render(PaintParameters&, RenderSource*) override;
void setRenderTiles(RenderTiles, const TransformState&) override;
-
+
// RenderLayerSymbolInterface overrides
const RenderLayerSymbolInterface* getSymbolInterface() const override;
const std::string& layerID() const override;
diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp
index 8b01739c31..271e38f320 100644
--- a/src/mbgl/renderer/render_layer.hpp
+++ b/src/mbgl/renderer/render_layer.hpp
@@ -19,6 +19,7 @@ class RenderSource;
class RenderLayerSymbolInterface;
class RenderTile;
class TransformState;
+class GeometryTile;
class LayerRenderData {
public:
@@ -26,6 +27,12 @@ public:
Immutable<style::LayerProperties> layerProperties;
};
+class LayerPlacementData {
+public:
+ std::reference_wrapper<Bucket> bucket;
+ std::reference_wrapper<RenderTile> tile;
+};
+
class RenderLayer {
protected:
RenderLayer(Immutable<style::LayerProperties>);
@@ -79,6 +86,10 @@ public:
using RenderTiles = std::vector<std::reference_wrapper<RenderTile>>;
virtual void setRenderTiles(RenderTiles, const TransformState&);
+ const std::vector<LayerPlacementData>& getPlacementData() const {
+ return placementData;
+ }
+
// Latest evaluated properties.
Immutable<style::LayerProperties> evaluatedProperties;
// Private implementation
@@ -96,12 +107,14 @@ protected:
protected:
// Stores current set of tiles to be rendered for this layer.
- std::vector<std::reference_wrapper<RenderTile>> renderTiles;
+ RenderTiles renderTiles;
// Stores what render passes this layer is currently enabled for. This depends on the
// evaluated StyleProperties object and is updated accordingly.
RenderPass passes = RenderPass::None;
+ std::vector<LayerPlacementData> placementData;
+
private:
RenderTiles filterRenderTiles(RenderTiles) const;
// Some layers may not render correctly on some hardware when the vertex attribute limit of
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp
index 3f9b59a14a..f987bb8666 100644
--- a/src/mbgl/renderer/renderer_impl.cpp
+++ b/src/mbgl/renderer/renderer_impl.cpp
@@ -224,7 +224,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
};
std::set<RenderItem> renderItems;
- std::vector<const RenderLayerSymbolInterface*> renderItemsWithSymbols;
+ std::vector<std::reference_wrapper<RenderLayer>> symbolLayers;
auto renderItemsEmplaceHint = renderItems.begin();
// Update all sources and initialize renderItems.
@@ -299,7 +299,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
RenderLayer& renderLayer = renderItem.layer;
renderLayer.setRenderTiles(renderItem.source->getRenderTiles(), updateParameters.transformState);
if (const RenderLayerSymbolInterface* symbolLayer = renderLayer.getSymbolInterface()) {
- renderItemsWithSymbols.push_back(symbolLayer);
+ symbolLayers.push_back(renderLayer);
}
}
@@ -320,15 +320,15 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
std::move(placement));
}
- for (auto it = renderItemsWithSymbols.rbegin(); it != renderItemsWithSymbols.rend(); ++it) {
- const RenderLayerSymbolInterface *symbolLayer = *it;
- if (crossTileSymbolIndex.addLayer(*symbolLayer, updateParameters.transformState.getLatLng().longitude())) symbolBucketsChanged = true;
+ for (auto it = symbolLayers.rbegin(); it != symbolLayers.rend(); ++it) {
+ const RenderLayer& symbolLayer = *it;
+ if (crossTileSymbolIndex.addLayer(symbolLayer, updateParameters.transformState.getLatLng().longitude())) symbolBucketsChanged = true;
if (placementChanged) {
- usedSymbolLayers.insert(symbolLayer->layerID());
+ usedSymbolLayers.insert(symbolLayer.getID());
mat4 projMatrix;
updateParameters.transformState.getProjMatrix(projMatrix);
- placement->placeLayer(*symbolLayer, projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision);
+ placement->placeLayer(*symbolLayer.getSymbolInterface(), projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision);
}
}
@@ -340,11 +340,10 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
placement->setStale();
}
-
if (placementChanged || symbolBucketsChanged) {
- for (auto it = renderItemsWithSymbols.rbegin(); it != renderItemsWithSymbols.rend(); ++it) {
- const RenderLayerSymbolInterface *symbolLayer = *it;
- placement->updateLayerOpacities(*symbolLayer);
+ for (auto it = symbolLayers.rbegin(); it != symbolLayers.rend(); ++it) {
+ const RenderLayer& symbolLayer = *it;
+ placement->updateLayerOpacities(*symbolLayer.getSymbolInterface());
}
}
}
diff --git a/src/mbgl/text/cross_tile_symbol_index.cpp b/src/mbgl/text/cross_tile_symbol_index.cpp
index 3af583ebd3..780a0f551d 100644
--- a/src/mbgl/text/cross_tile_symbol_index.cpp
+++ b/src/mbgl/text/cross_tile_symbol_index.cpp
@@ -164,36 +164,21 @@ bool CrossTileSymbolLayerIndex::removeStaleBuckets(const std::unordered_set<uint
CrossTileSymbolIndex::CrossTileSymbolIndex() = default;
-bool CrossTileSymbolIndex::addLayer(const RenderLayerSymbolInterface& symbolInterface, float lng) {
-
- auto& layerIndex = layerIndexes[symbolInterface.layerID()];
+bool CrossTileSymbolIndex::addLayer(const RenderLayer& layer, float lng) {
+ auto& layerIndex = layerIndexes[layer.getID()];
bool symbolBucketsChanged = false;
std::unordered_set<uint32_t> currentBucketIDs;
layerIndex.handleWrapJump(lng);
- for (const RenderTile& renderTile : symbolInterface.getRenderTiles()) {
- assert(renderTile.tile.isRenderable());
-
- auto bucket = symbolInterface.getSymbolBucket(renderTile);
- if (!bucket) {
- continue;
- }
- SymbolBucket& symbolBucket = *bucket;
-
- if (symbolBucket.bucketLeaderID != symbolInterface.layerID()) {
- // Only add this layer if it's the "group leader" for the bucket
- continue;
- }
-
- if (!symbolBucket.bucketInstanceId) {
- symbolBucket.bucketInstanceId = ++maxBucketInstanceId;
- }
-
- const bool bucketAdded = layerIndex.addBucket(renderTile.tile.id, symbolBucket, maxCrossTileID);
- symbolBucketsChanged = symbolBucketsChanged || bucketAdded;
- currentBucketIDs.insert(symbolBucket.bucketInstanceId);
+ for (const auto& item : layer.getPlacementData()) {
+ RenderTile& renderTile = item.tile;
+ Bucket& bucket = item.bucket;
+ auto result = bucket.registerAtCrossTileIndex(layerIndex, renderTile.tile.id, maxCrossTileID);
+ assert(result.first != 0u);
+ symbolBucketsChanged = symbolBucketsChanged || result.second;
+ currentBucketIDs.insert(result.first);
}
if (layerIndex.removeStaleBuckets(currentBucketIDs)) {
diff --git a/src/mbgl/text/cross_tile_symbol_index.hpp b/src/mbgl/text/cross_tile_symbol_index.hpp
index 528147f146..d905aeb569 100644
--- a/src/mbgl/text/cross_tile_symbol_index.hpp
+++ b/src/mbgl/text/cross_tile_symbol_index.hpp
@@ -15,7 +15,7 @@
namespace mbgl {
class SymbolInstance;
-class RenderLayerSymbolInterface;
+class RenderLayer;
class SymbolBucket;
class IndexedSymbolInstance {
@@ -58,14 +58,13 @@ class CrossTileSymbolIndex {
public:
CrossTileSymbolIndex();
- bool addLayer(const RenderLayerSymbolInterface&, float lng);
+ bool addLayer(const RenderLayer& layer, float lng);
void pruneUnusedLayers(const std::set<std::string>&);
void reset();
private:
std::map<std::string, CrossTileSymbolLayerIndex> layerIndexes;
uint32_t maxCrossTileID = 0;
- uint32_t maxBucketInstanceId = 0;
};
} // namespace mbgl