From 31419c2644cb75afb7508aa9d08403b7cbd9184c Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Mon, 1 Jul 2019 14:07:53 +0300 Subject: [core] Geometry tile keeps layout result as a shared pointer --- src/mbgl/tile/geometry_tile.cpp | 57 ++++++++++++++++++++-------------- src/mbgl/tile/geometry_tile.hpp | 22 +++++-------- src/mbgl/tile/geometry_tile_worker.cpp | 4 +-- 3 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 1bc7646d1e..7fe6343889 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -123,24 +123,15 @@ void GeometryTile::setShowCollisionBoxes(const bool showCollisionBoxes_) { } } -void GeometryTile::onLayout(LayoutResult result, const uint64_t resultCorrelationID) { +void GeometryTile::onLayout(std::shared_ptr result, const uint64_t resultCorrelationID) { loaded = true; renderable = true; if (resultCorrelationID == correlationID) { pending = false; } - - layerIdToLayerRenderData = std::move(result.renderData); - - latestFeatureIndex = std::move(result.featureIndex); - - if (result.glyphAtlasImage) { - glyphAtlasImage = std::move(*result.glyphAtlasImage); - } - if (result.iconAtlas.image.valid()) { - iconAtlas = std::move(result.iconAtlas); - } + layoutResult = std::move(result); + observer->onTileChanged(*this); } @@ -169,36 +160,45 @@ void GeometryTile::getImages(ImageRequestPair pair) { } const optional GeometryTile::getPattern(const std::string& pattern) const { - auto it = iconAtlas.patternPositions.find(pattern); - if (it != iconAtlas.patternPositions.end()) { - return it->second; + if (layoutResult) { + const auto& iconAtlas = layoutResult->iconAtlas; + auto it = iconAtlas.patternPositions.find(pattern); + if (it != iconAtlas.patternPositions.end()) { + return it->second; + } } return nullopt; } +const std::shared_ptr GeometryTile::getFeatureIndex() const { + return layoutResult ? layoutResult->featureIndex : nullptr; +} + void GeometryTile::upload(gfx::UploadPass& uploadPass) { + if (!layoutResult) return; + auto uploadFn = [&] (Bucket& bucket) { if (bucket.needsUpload()) { bucket.upload(uploadPass); } }; - for (auto& entry : layerIdToLayerRenderData) { + for (auto& entry : layoutResult->layerRenderData) { uploadFn(*entry.second.bucket); } - if (glyphAtlasImage) { - glyphAtlasTexture = uploadPass.createTexture(*glyphAtlasImage); - glyphAtlasImage = {}; + if (layoutResult->glyphAtlasImage) { + glyphAtlasTexture = uploadPass.createTexture(*layoutResult->glyphAtlasImage); + layoutResult->glyphAtlasImage = {}; } - if (iconAtlas.image.valid()) { - iconAtlasTexture = uploadPass.createTexture(iconAtlas.image); - iconAtlas.image = {}; + if (layoutResult->iconAtlas.image.valid()) { + iconAtlasTexture = uploadPass.createTexture(layoutResult->iconAtlas.image); + layoutResult->iconAtlas.image = {}; } if (iconAtlasTexture) { - iconAtlas.patchUpdatedImages(uploadPass, *iconAtlasTexture, imageManager); + layoutResult->iconAtlas.patchUpdatedImages(uploadPass, *iconAtlasTexture, imageManager); } } @@ -226,7 +226,16 @@ bool GeometryTile::layerPropertiesUpdated(const ImmutablefeatureIndex) { + return nullptr; + } + return layoutResult->featureIndex->getData(); +} + LayerRenderData* GeometryTile::getMutableLayerRenderData(const style::Layer::Impl& layerImpl) { + if (!layoutResult) return nullptr; + auto& layerIdToLayerRenderData = layoutResult->layerRenderData; auto it = layerIdToLayerRenderData.find(layerImpl.id); if (it == layerIdToLayerRenderData.end()) { return nullptr; @@ -266,7 +275,7 @@ void GeometryTile::queryRenderedFeatures( transformState.matrixFor(posMatrix, id.toUnwrapped()); matrix::multiply(posMatrix, projMatrix, posMatrix); - latestFeatureIndex->query(result, + layoutResult->featureIndex->query(result, queryGeometry, transformState, posMatrix, diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index c206dd1157..0373161d10 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -67,8 +67,8 @@ public: class LayoutResult { public: - std::unordered_map renderData; - std::unique_ptr featureIndex; + std::unordered_map layerRenderData; + std::shared_ptr featureIndex; optional glyphAtlasImage; ImageAtlas iconAtlas; @@ -76,12 +76,12 @@ public: std::unique_ptr featureIndex_, optional glyphAtlasImage_, ImageAtlas iconAtlas_) - : renderData(std::move(renderData_)), + : layerRenderData(std::move(renderData_)), featureIndex(std::move(featureIndex_)), glyphAtlasImage(std::move(glyphAtlasImage_)), iconAtlas(std::move(iconAtlas_)) {} }; - void onLayout(LayoutResult, uint64_t correlationID); + void onLayout(std::shared_ptr, uint64_t correlationID); void onError(std::exception_ptr, uint64_t correlationID); @@ -90,15 +90,12 @@ public: void markRenderedPreviously() override; void performedFadePlacement() override; const optional getPattern(const std::string& pattern) const; - const std::shared_ptr getFeatureIndex() const { return latestFeatureIndex; } + const std::shared_ptr getFeatureIndex() const; const std::string sourceID; protected: - const GeometryTileData* getData() { - return latestFeatureIndex ? latestFeatureIndex->getData() : nullptr; - } - + const GeometryTileData* getData() const; LayerRenderData* getMutableLayerRenderData(const style::Layer::Impl&); private: @@ -116,12 +113,7 @@ private: uint64_t correlationID = 0; - std::unordered_map layerIdToLayerRenderData; - - std::shared_ptr latestFeatureIndex; - - optional glyphAtlasImage; - ImageAtlas iconAtlas; + std::shared_ptr layoutResult; const MapMode mode; diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index ad9de2c07b..a69825d346 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -460,12 +460,12 @@ void GeometryTileWorker::finalizeLayout() { " Canonical: " << static_cast(id.canonical.z) << "/" << id.canonical.x << "/" << id.canonical.y << " Time"); - parent.invoke(&GeometryTile::onLayout, GeometryTile::LayoutResult { + parent.invoke(&GeometryTile::onLayout, std::make_shared( std::move(renderData), std::move(featureIndex), std::move(glyphAtlasImage), std::move(iconAtlas) - }, correlationID); + ), correlationID); } } // namespace mbgl -- cgit v1.2.1