summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Loer <chris.loer@gmail.com>2018-11-21 13:58:39 -0800
committerChris Loer <chris.loer@gmail.com>2018-11-21 13:58:39 -0800
commite5fef0a093750282bbea7787df75e5e0c9b23341 (patch)
tree362aa2ad44aed4aab5313d8dbd312d4179eeb648
parent6bb1e977eafc61af39d47df083bb3de13205fae9 (diff)
downloadqtlocation-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.hpp6
-rw-r--r--src/mbgl/renderer/buckets/symbol_bucket.cpp8
-rw-r--r--src/mbgl/renderer/buckets/symbol_bucket.hpp4
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.cpp20
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);
}
}