From af3898d980d43663d15884fa85d8fbb6339bfbdc Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 2 Mar 2017 11:57:37 -0800 Subject: [PATCH] [core] Avoid copy construction of PaintPropertyBinders --- src/mbgl/renderer/circle_bucket.cpp | 6 ++++-- src/mbgl/renderer/fill_bucket.cpp | 6 ++++-- src/mbgl/renderer/line_bucket.cpp | 6 ++++-- src/mbgl/renderer/symbol_bucket.cpp | 11 +++++++---- src/mbgl/style/paint_property_binder.hpp | 3 +++ 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/mbgl/renderer/circle_bucket.cpp b/src/mbgl/renderer/circle_bucket.cpp index 6722d0449..e437eff13 100644 --- a/src/mbgl/renderer/circle_bucket.cpp +++ b/src/mbgl/renderer/circle_bucket.cpp @@ -13,8 +13,10 @@ using namespace style; CircleBucket::CircleBucket(const BucketParameters& parameters, const std::vector& layers) : mode(parameters.mode) { for (const auto& layer : layers) { - paintPropertyBinders.emplace(layer->getID(), - CircleProgram::PaintPropertyBinders( + paintPropertyBinders.emplace( + std::piecewise_construct, + std::forward_as_tuple(layer->getID()), + std::forward_as_tuple( layer->as()->impl->paint.evaluated, parameters.tileID.overscaledZ)); } diff --git a/src/mbgl/renderer/fill_bucket.cpp b/src/mbgl/renderer/fill_bucket.cpp index 64efafb10..d56646167 100644 --- a/src/mbgl/renderer/fill_bucket.cpp +++ b/src/mbgl/renderer/fill_bucket.cpp @@ -29,8 +29,10 @@ struct GeometryTooLongException : std::exception {}; FillBucket::FillBucket(const BucketParameters& parameters, const std::vector& layers) { for (const auto& layer : layers) { - paintPropertyBinders.emplace(layer->getID(), - FillProgram::PaintPropertyBinders( + paintPropertyBinders.emplace( + std::piecewise_construct, + std::forward_as_tuple(layer->getID()), + std::forward_as_tuple( layer->as()->impl->paint.evaluated, parameters.tileID.overscaledZ)); } diff --git a/src/mbgl/renderer/line_bucket.cpp b/src/mbgl/renderer/line_bucket.cpp index c4028f4b3..13caea453 100644 --- a/src/mbgl/renderer/line_bucket.cpp +++ b/src/mbgl/renderer/line_bucket.cpp @@ -18,8 +18,10 @@ LineBucket::LineBucket(const BucketParameters& parameters, : layout(layout_.evaluate(PropertyEvaluationParameters(parameters.tileID.overscaledZ))), overscaling(parameters.tileID.overscaleFactor()) { for (const auto& layer : layers) { - paintPropertyBinders.emplace(layer->getID(), - LineProgram::PaintPropertyBinders( + paintPropertyBinders.emplace( + std::piecewise_construct, + std::forward_as_tuple(layer->getID()), + std::forward_as_tuple( layer->as()->impl->paint.evaluated, parameters.tileID.overscaledZ)); } diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index fa4178dda..0132e2773 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -18,10 +18,13 @@ SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::Evaluated layout_, sdfIcons(sdfIcons_), iconsNeedLinear(iconsNeedLinear_) { for (const auto& pair : layerPaintProperties) { - paintPropertyBinders.emplace(pair.first, std::make_pair( - SymbolIconProgram::PaintPropertyBinders(pair.second.first, zoom), - SymbolSDFTextProgram::PaintPropertyBinders(pair.second.second, zoom) - )); + paintPropertyBinders.emplace( + std::piecewise_construct, + std::forward_as_tuple(pair.first), + std::forward_as_tuple( + std::piecewise_construct, + std::forward_as_tuple(pair.second.first, zoom), + std::forward_as_tuple(pair.second.second, zoom))); } } diff --git a/src/mbgl/style/paint_property_binder.hpp b/src/mbgl/style/paint_property_binder.hpp index 365442447..630c1104f 100644 --- a/src/mbgl/style/paint_property_binder.hpp +++ b/src/mbgl/style/paint_property_binder.hpp @@ -188,6 +188,9 @@ public: (void)z; // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56958 } + PaintPropertyBinders(PaintPropertyBinders&&) = default; + PaintPropertyBinders(const PaintPropertyBinders&) = delete; + void populateVertexVectors(const GeometryTileFeature& feature, std::size_t length) { util::ignore({ (binders.template get()->populateVertexVector(feature, length), 0)...