diff options
author | Chris Loer <chris.loer@gmail.com> | 2018-11-21 13:58:39 -0800 |
---|---|---|
committer | Chris Loer <chris.loer@gmail.com> | 2018-11-21 13:58:39 -0800 |
commit | e5fef0a093750282bbea7787df75e5e0c9b23341 (patch) | |
tree | 362aa2ad44aed4aab5313d8dbd312d4179eeb648 | |
parent | 6bb1e977eafc61af39d47df083bb3de13205fae9 (diff) | |
download | qtlocation-mapboxgl-upstream/bucket-bitset.tar.gz |
Store paint property constant bitsets with SymbolBucket, so that at draw time we can look up the program that matches the bucket.upstream/bucket-bitset
-rw-r--r-- | src/mbgl/programs/program.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/symbol_bucket.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/symbol_bucket.hpp | 4 | ||||
-rw-r--r-- | 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<Bitset>& 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<std::string, std::pair< SymbolIconProgram::PaintPropertyBinders, SymbolSDFTextProgram::PaintPropertyBinders>> paintPropertyBinders; + + std::map<std::string, std::pair< + SymbolIconProgram::PaintPropertyBinders::Bitset, + SymbolSDFTextProgram::PaintPropertyBinders::Bitset>> paintPropertyBitsets; std::unique_ptr<SymbolSizeBinder> 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); } } |