From affb21a61248223c81c18f37fb7e2ae7d0ec76a4 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Thu, 27 Jun 2019 17:19:53 +0300 Subject: [PATCH] [core] Geometry tile updates layer render data if its constants mask remains Thus, we do not have to wait for tile update completion in case the updated properties have the same constants mask, i.e. fit the existing bucket. --- src/mbgl/renderer/tile_pyramid.cpp | 7 +------ src/mbgl/tile/geometry_tile.cpp | 5 +++-- src/mbgl/tile/geometry_tile.hpp | 2 +- src/mbgl/tile/tile.hpp | 10 ++++++++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index dee84c4e3..b931b2d27 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -231,12 +231,7 @@ void TilePyramid::update(const std::vector>& l if (holdForFade && typeInfo->fadingTiles == LayerTypeInfo::FadingTiles::NotRequired) { continue; } - // Update layer properties for complete tiles; for incomplete just check the presence. - bool layerRenderableInTile = tile.isComplete() ? tile.updateLayerProperties(layerProperties) - : static_cast(tile.getBucket(*layerProperties->baseImpl)); - if (layerRenderableInTile) { - tile.usedByRenderedLayers = true; - } + tile.usedByRenderedLayers |= tile.layerPropertiesUpdated(layerProperties); } } } diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 7a7b7cb77..1bc7646d1 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -212,13 +212,14 @@ const LayerRenderData* GeometryTile::getLayerRenderData(const style::Layer::Impl return that->getMutableLayerRenderData(layerImpl); } -bool GeometryTile::updateLayerProperties(const Immutable& layerProperties) { +bool GeometryTile::layerPropertiesUpdated(const Immutable& layerProperties) { LayerRenderData* renderData = getMutableLayerRenderData(*layerProperties->baseImpl); if (!renderData) { return false; } - if (renderData->layerProperties != layerProperties) { + if (renderData->layerProperties != layerProperties && + renderData->layerProperties->constantsMask() == layerProperties->constantsMask()) { renderData->layerProperties = layerProperties; } diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index cbc94deed..c206dd115 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -47,7 +47,7 @@ public: void upload(gfx::UploadPass&) override; Bucket* getBucket(const style::Layer::Impl&) const override; const LayerRenderData* getLayerRenderData(const style::Layer::Impl&) const override; - bool updateLayerProperties(const Immutable&) override; + bool layerPropertiesUpdated(const Immutable&) override; void queryRenderedFeatures( std::unordered_map>& result, diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp index 95ee0bc37..17a16b466 100644 --- a/src/mbgl/tile/tile.hpp +++ b/src/mbgl/tile/tile.hpp @@ -58,10 +58,16 @@ public: assert(false); return nullptr; } - // Updates the contained layer render data with the given properties. + // Notifies this tile of the updated layer properties. + // + // Tile implementation should update the contained layer + // render data with the given properties. + // // Returns `true` if the corresponding render layer data is present in this tile (and i.e. it // was succesfully updated); returns `false` otherwise. - virtual bool updateLayerProperties(const Immutable&) { return true; } + virtual bool layerPropertiesUpdated(const Immutable& layerProperties) { + return bool(getBucket(*layerProperties->baseImpl)); + } virtual void setShowCollisionBoxes(const bool) {} virtual void setLayers(const std::vector>&) {} virtual void setMask(TileMask&&) {}