From e5fef0a093750282bbea7787df75e5e0c9b23341 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Wed, 21 Nov 2018 13:58:39 -0800 Subject: Store paint property constant bitsets with SymbolBucket, so that at draw time we can look up the program that matches the bucket. --- src/mbgl/programs/program.hpp | 6 ++++-- src/mbgl/renderer/buckets/symbol_bucket.cpp | 8 ++++++++ src/mbgl/renderer/buckets/symbol_bucket.hpp | 4 ++++ src/mbgl/renderer/layers/render_symbol_layer.cpp | 20 +++++++++++++------- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp index ddbda30686..6cfd16211b 100644 --- a/src/mbgl/programs/program.hpp +++ b/src/mbgl/programs/program.hpp @@ -115,8 +115,10 @@ public: parameters(std::move(parameters_)) { } - Program& get(const typename PaintProperties::PossiblyEvaluated& currentProperties) { - Bitset bits = PaintPropertyBinders::constants(currentProperties); + Program& get(const typename PaintProperties::PossiblyEvaluated& currentProperties, const optional& bucketConstants = {}) { + // PaintProperties may have changed since the bucket was generated. + // If so, and we have the old program loaded, use it until the bucket updates. + Bitset bits = bucketConstants ? *bucketConstants : PaintPropertyBinders::constants(currentProperties); auto it = programs.find(bits); if (it != programs.end()) { return it->second; diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index a3f652fc6e..d63bfae2fd 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -38,6 +38,14 @@ SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated layo std::piecewise_construct, std::forward_as_tuple(pair.second.first, zoom), std::forward_as_tuple(pair.second.second, zoom))); + + paintPropertyBitsets.emplace( + std::piecewise_construct, + std::forward_as_tuple(pair.first), + std::forward_as_tuple( + std::piecewise_construct, + std::forward_as_tuple(SymbolIconProgram::PaintPropertyBinders::constants(pair.second.first)), + std::forward_as_tuple(SymbolSDFTextProgram::PaintPropertyBinders::constants(pair.second.second)))); } } diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index 5addff40b2..9b64babb58 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -79,6 +79,10 @@ public: std::map> paintPropertyBinders; + + std::map> paintPropertyBitsets; 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 2b3a7195c5..00379fbcf9 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -110,9 +110,10 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { const auto& symbolSizeBinder, const SymbolPropertyValues& values_, const auto& binders, - const auto& paintProperties) + const auto& paintProperties, + const auto& paintPropertyBitset) { - auto& programInstance = program.get(paintProperties); + auto& programInstance = program.get(paintProperties, paintPropertyBitset); const auto allUniformValues = programInstance.computeAllUniformValues( std::move(uniformValues), @@ -187,7 +188,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.iconSizeBinder, values, bucket.paintPropertyBinders.at(getID()).first, - paintPropertyValues); + paintPropertyValues, + bucket.paintPropertyBitsets.at(getID()).first); } if (values.hasFill) { @@ -197,7 +199,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.iconSizeBinder, values, bucket.paintPropertyBinders.at(getID()).first, - paintPropertyValues); + paintPropertyValues, + bucket.paintPropertyBitsets.at(getID()).first); } } else { draw(parameters.programs.symbolIcon, @@ -206,7 +209,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.iconSizeBinder, values, bucket.paintPropertyBinders.at(getID()).first, - paintPropertyValues); + paintPropertyValues, + bucket.paintPropertyBitsets.at(getID()).first); } } @@ -240,7 +244,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.textSizeBinder, values, bucket.paintPropertyBinders.at(getID()).second, - paintPropertyValues); + paintPropertyValues, + bucket.paintPropertyBitsets.at(getID()).second); } if (values.hasFill) { @@ -250,7 +255,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { bucket.textSizeBinder, values, bucket.paintPropertyBinders.at(getID()).second, - paintPropertyValues); + paintPropertyValues, + bucket.paintPropertyBitsets.at(getID()).second); } } -- cgit v1.2.1