diff --git a/include/mbgl/renderer/layer_group.hpp b/include/mbgl/renderer/layer_group.hpp index 7710bae5b..561bfdb6b 100644 --- a/include/mbgl/renderer/layer_group.hpp +++ b/include/mbgl/renderer/layer_group.hpp @@ -77,9 +77,10 @@ public: ~TileLayerGroup() override; void updateLayerIndex(int32_t newLayerIndex); + std::size_t getDrawableCount() const; + std::size_t getDrawableCount(mbgl::RenderPass, const OverscaledTileID&) const; - const gfx::UniqueDrawable& getDrawable(mbgl::RenderPass, const OverscaledTileID&) const; std::vector removeDrawables(mbgl::RenderPass, const OverscaledTileID&); void addDrawable(mbgl::RenderPass, const OverscaledTileID&, gfx::UniqueDrawable&&); @@ -87,7 +88,11 @@ public: void observeDrawables(std::function) const override; void observeDrawables(std::function) override; - void clearDrawables(); + /// Call the provided function for each drawable for the given tile + void observeDrawables(mbgl::RenderPass, const OverscaledTileID&, + std::function) const; + + std::size_t clearDrawables(); protected: struct Impl; diff --git a/src/mbgl/renderer/layer_group.cpp b/src/mbgl/renderer/layer_group.cpp index 69cec2abe..f834e53d2 100644 --- a/src/mbgl/renderer/layer_group.cpp +++ b/src/mbgl/renderer/layer_group.cpp @@ -48,9 +48,9 @@ std::size_t TileLayerGroup::getDrawableCount() const { static const gfx::UniqueDrawable no_tile; -const gfx::UniqueDrawable& TileLayerGroup::getDrawable(mbgl::RenderPass pass, const OverscaledTileID& id) const { - const auto hit = impl->tileDrawables.find({pass, id}); - return (hit == impl->tileDrawables.end()) ? no_tile : hit->second; +std::size_t TileLayerGroup::getDrawableCount(mbgl::RenderPass pass, const OverscaledTileID& id) const { + const auto range = impl->tileDrawables.equal_range({pass, id}); + return std::distance(range.first, range.second); } std::vector TileLayerGroup::removeDrawables(mbgl::RenderPass pass, const OverscaledTileID& id) { @@ -100,8 +100,16 @@ void TileLayerGroup::observeDrawables(std::function } } -void TileLayerGroup::clearDrawables() { +void TileLayerGroup::observeDrawables(mbgl::RenderPass pass, const OverscaledTileID& tileID, + std::function f) const { + const auto range = impl->tileDrawables.equal_range({pass, tileID}); + std::for_each(range.first, range.second, [&f](const auto& pair){ f(*pair.second); }); +} + +std::size_t TileLayerGroup::clearDrawables() { + const auto count = impl->tileDrawables.size(); impl->tileDrawables.clear(); + return count; } } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index 7ec4a9a05..13834ad24 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -286,19 +286,9 @@ void RenderBackgroundLayer::update(gfx::ShaderRegistry& shaders, // For each tile in the cover set, add a tile drawable if one doesn't already exist. // We currently assume only one drawable per tile. for (const auto& tileID : tileCover) { - auto& tileDrawable = tileLayerGroup->getDrawable(renderPass, tileID); - - if (!(renderPass & drawPasses)) { - // Not in this pass - if (tileDrawable) { - tileLayerGroup->removeDrawables(renderPass, tileID); - ++stats.tileDrawablesRemoved; - } - continue; - } - - if (tileDrawable) { - // Already created, update it. + // If we already have drawables for this tile, skip. + // If a drawable needs to be updated, that's handled in the layer tweaker. + if (tileLayerGroup->getDrawableCount(renderPass, tileID) > 0) { continue; } diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index 530d6edcf..eaf51d900 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -311,8 +311,7 @@ void RenderCircleLayer::update(gfx::ShaderRegistry& shaders, for (const RenderTile& tile : *renderTiles) { const auto& tileID = tile.getOverscaledTileID(); - auto& tileDrawable = tileLayerGroup->getDrawable(renderPass, tileID); - if (tileDrawable) { + if (tileLayerGroup->getDrawableCount(renderPass, tileID) > 0) { continue; } diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 254c8a295..2f6e595eb 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include namespace mbgl { @@ -287,8 +288,7 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, if (!renderTiles || renderTiles->empty()) { if (tileLayerGroup) { - stats.tileDrawablesRemoved += tileLayerGroup->getDrawableCount(); - tileLayerGroup->clearDrawables(); + stats.tileDrawablesRemoved += tileLayerGroup->clearDrawables(); } return; } @@ -359,7 +359,11 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, for (const RenderTile& tile : *renderTiles) { const auto& tileID = tile.getOverscaledTileID(); - auto& tileDrawable = tileLayerGroup->getDrawable(renderPass, tileID); + // If we already have drawables for this tile, skip. + // If a drawable needs to be updated, that's handled in the layer tweaker. + if (tileLayerGroup->getDrawableCount(renderPass, tileID) > 0) { + continue; + } const LayerRenderData* renderData = getRenderDataForPass(tile, renderPass); if (!renderData) { @@ -449,10 +453,6 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, } } - if (tileDrawable) { - continue; - } - if (doFill && !fillBuilder && fillShader) { fillBuilder = context.createDrawableBuilder("fill"); fillBuilder->setShader(fillShader);