From 12295ef3355170d1877da5ef183eecfe7ad982be Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 11 Jan 2019 18:55:56 +0200 Subject: [core] SymbolBucket: use single map for paint properties data Obviates unnecessary lookups, improves readability. --- src/mbgl/layout/symbol_layout.cpp | 6 +++--- src/mbgl/renderer/buckets/symbol_bucket.cpp | 22 +++++++++++----------- src/mbgl/renderer/buckets/symbol_bucket.hpp | 13 +++++++------ src/mbgl/renderer/layers/render_symbol_layer.cpp | 16 +++++++++------- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 4acd0a1ccd..a95c414c82 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -469,9 +469,9 @@ void SymbolLayout::createBucket(const ImagePositions&, std::unique_ptrpaintPropertyBinders) { - pair.second.first.populateVertexVectors(feature, bucket->icon.vertices.vertexSize(), {}, {}); - pair.second.second.populateVertexVectors(feature, bucket->text.vertices.vertexSize(), {}, {}); + for (auto& pair : bucket->paintProperties) { + pair.second.iconBinders.populateVertexVectors(feature, bucket->icon.vertices.vertexSize(), {}, {}); + pair.second.textBinders.populateVertexVectors(feature, bucket->text.vertices.vertexSize(), {}, {}); } } diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index 4947b6b521..969597f5bd 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -9,7 +9,7 @@ namespace mbgl { using namespace style; SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated layout_, - std::map paintProperties_, + const std::map& paintProperties_, const style::PropertyValue& textSize, const style::PropertyValue& iconSize, float zoom, @@ -24,18 +24,18 @@ SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated layo sortFeaturesByY(sortFeaturesByY_), bucketLeaderID(std::move(bucketName_)), symbolInstances(std::move(symbolInstances_)), - paintProperties(std::move(paintProperties_)), textSizeBinder(SymbolSizeBinder::create(zoom, textSize, TextSize::defaultValue())), iconSizeBinder(SymbolSizeBinder::create(zoom, iconSize, IconSize::defaultValue())) { - for (const auto& pair : paintProperties) { - paintPropertyBinders.emplace( + for (const auto& pair : paintProperties_) { + paintProperties.emplace( std::piecewise_construct, std::forward_as_tuple(pair.first), - std::forward_as_tuple( - std::piecewise_construct, - std::forward_as_tuple(RenderSymbolLayer::iconPaintProperties(pair.second), zoom), - std::forward_as_tuple(RenderSymbolLayer::textPaintProperties(pair.second), zoom))); + std::forward_as_tuple(PaintProperties { + pair.second, + { RenderSymbolLayer::iconPaintProperties(pair.second), zoom }, + { RenderSymbolLayer::textPaintProperties(pair.second), zoom } + })); } } @@ -110,9 +110,9 @@ void SymbolBucket::upload(gl::Context& context) { } if (!staticUploaded) { - for (auto& pair : paintPropertyBinders) { - pair.second.first.upload(context); - pair.second.second.upload(context); + for (auto& pair : paintProperties) { + pair.second.iconBinders.upload(context); + pair.second.textBinders.upload(context); } } diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index 76fab2fa0f..0388c5756b 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -40,7 +40,7 @@ public: class SymbolBucket final : public Bucket { public: SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated, - std::map, + const std::map&, const style::PropertyValue& textSize, const style::PropertyValue& iconSize, float zoom, @@ -78,11 +78,12 @@ public: std::vector symbolInstances; - std::map paintProperties; - - std::map> paintPropertyBinders; + struct PaintProperties { + style::SymbolPaintProperties::PossiblyEvaluated evaluated; + SymbolIconProgram::PaintPropertyBinders iconBinders; + SymbolSDFTextProgram::PaintPropertyBinders textBinders; + }; + std::map paintProperties; std::unique_ptr textSizeBinder; diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 61dcf8fa47..bc605fe9eb 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -102,7 +102,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { } SymbolBucket& bucket = *bucket_; assert(bucket.paintProperties.find(getID()) != bucket.paintProperties.end()); - const auto& evaluated_ = bucket.paintProperties.at(getID()); + const auto& bucketPaintProperties = bucket.paintProperties.at(getID()); + const auto& evaluated_ = bucketPaintProperties.evaluated; const auto& layout = bucket.layout; auto draw = [&] (auto& program, @@ -187,7 +188,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.icon, bucket.iconSizeBinder, values, - bucket.paintPropertyBinders.at(getID()).first, + bucketPaintProperties.iconBinders, paintPropertyValues); } @@ -197,7 +198,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.icon, bucket.iconSizeBinder, values, - bucket.paintPropertyBinders.at(getID()).first, + bucketPaintProperties.iconBinders, paintPropertyValues); } } else { @@ -206,7 +207,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.icon, bucket.iconSizeBinder, values, - bucket.paintPropertyBinders.at(getID()).first, + bucketPaintProperties.iconBinders, paintPropertyValues); } } @@ -240,7 +241,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.text, bucket.textSizeBinder, values, - bucket.paintPropertyBinders.at(getID()).second, + bucketPaintProperties.textBinders, paintPropertyValues); } @@ -250,7 +251,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.text, bucket.textSizeBinder, values, - bucket.paintPropertyBinders.at(getID()).second, + bucketPaintProperties.textBinders, paintPropertyValues); } } @@ -405,7 +406,8 @@ void RenderSymbolLayer::sortRenderTiles(const TransformState& state) { } void RenderSymbolLayer::updateBucketPaintProperties(Bucket* bucket) const { - static_cast(bucket)->paintProperties[getID()] = evaluated; + assert(bucket->supportsLayer(*baseImpl)); + static_cast(bucket)->paintProperties.at(getID()).evaluated = evaluated; } } // namespace mbgl -- cgit v1.2.1