From 0e45138547e906a0a3d918e9ace262e53d35fb46 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Wed, 15 May 2019 14:24:26 +0300 Subject: [core] RenderLayerSymbolInterface is not used in CrossTileSymbolIndex --- src/mbgl/renderer/bucket.hpp | 12 ++++++++- src/mbgl/renderer/buckets/symbol_bucket.cpp | 12 ++++++++- src/mbgl/renderer/buckets/symbol_bucket.hpp | 5 +++- src/mbgl/renderer/layers/render_symbol_layer.cpp | 9 +++++++ src/mbgl/renderer/layers/render_symbol_layer.hpp | 2 +- src/mbgl/renderer/render_layer.hpp | 15 ++++++++++- src/mbgl/renderer/renderer_impl.cpp | 21 +++++++-------- src/mbgl/text/cross_tile_symbol_index.cpp | 33 +++++++----------------- src/mbgl/text/cross_tile_symbol_index.hpp | 5 ++-- 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; @@ -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 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 #include #include +#include #include namespace mbgl { using namespace style; +namespace { + std::atomic maxBucketInstanceId; +} // namespace SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated layout_, const std::map>& 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(pair.second); @@ -239,4 +244,9 @@ bool SymbolBucket::hasFormatSectionOverrides() const { return *hasFormatSectionOverrides_; } +std::pair 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 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 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 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(*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 layerProperties; }; +class LayerPlacementData { +public: + std::reference_wrapper bucket; + std::reference_wrapper tile; +}; + class RenderLayer { protected: RenderLayer(Immutable); @@ -79,6 +86,10 @@ public: using RenderTiles = std::vector>; virtual void setRenderTiles(RenderTiles, const TransformState&); + const std::vector& getPlacementData() const { + return placementData; + } + // Latest evaluated properties. Immutable evaluatedProperties; // Private implementation @@ -96,12 +107,14 @@ protected: protected: // Stores current set of tiles to be rendered for this layer. - std::vector> 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 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 renderItems; - std::vector renderItemsWithSymbols; + std::vector> 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 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&); void reset(); private: std::map layerIndexes; uint32_t maxCrossTileID = 0; - uint32_t maxBucketInstanceId = 0; }; } // namespace mbgl -- cgit v1.2.1