diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-01-03 17:17:57 +0200 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-01-11 11:30:04 +0200 |
commit | 2bdab82dedf545b4272c534b067c68614d0355b7 (patch) | |
tree | ee437a1e8f26a25fe2e30d65db3d4e4e2985ae10 /src/mbgl/renderer/layers | |
parent | 2da9d483ac8bce5bfa7523f9113e1bc4ef2cbfb5 (diff) | |
download | qtlocation-mapboxgl-2bdab82dedf545b4272c534b067c68614d0355b7.tar.gz |
[core] shader program must always match bucket in render symbol layer
Before this change, `RenderSymbolLayer` with updated style was trying to render
symbols using the previous bucket (with paint property binders that matched a previous program).
Now, symbol bucket caches the latest corresponding paint properties (caching is happening on
complete tiles only). As a result, `RenderSymbolLayer` always picks the shader program and
its parameters in sync with the obtained bucket.
Diffstat (limited to 'src/mbgl/renderer/layers')
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.cpp | 78 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.hpp | 12 |
2 files changed, 51 insertions, 39 deletions
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 11ffd74b10..716b06c24d 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -101,7 +101,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { continue; } SymbolBucket& bucket = *bucket_; - + assert(bucket.paintProperties.find(getID()) != bucket.paintProperties.end()); + const auto& evaluated_ = bucket.paintProperties.at(getID()); const auto& layout = bucket.layout; auto draw = [&] (auto& program, @@ -152,8 +153,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { GeometryTile& geometryTile = static_cast<GeometryTile&>(tile.tile); if (bucket.hasIconData()) { - auto values = iconPropertyValues(layout); - auto paintPropertyValues = iconPaintProperties(); + auto values = iconPropertyValues(evaluated_, layout); + const auto& paintPropertyValues = iconPaintProperties(evaluated_); const bool alongLine = layout.get<SymbolPlacement>() != SymbolPlacementType::Point && layout.get<IconRotationAlignment>() == AlignmentType::Map; @@ -213,8 +214,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { if (bucket.hasTextData()) { parameters.context.bindTexture(*geometryTile.glyphAtlasTexture, 0, gl::TextureFilter::Linear); - auto values = textPropertyValues(layout); - auto paintPropertyValues = textPaintProperties(); + auto values = textPropertyValues(evaluated_, layout); + const auto& paintPropertyValues = textPaintProperties(evaluated_); const bool alongLine = layout.get<SymbolPlacement>() != SymbolPlacementType::Point && layout.get<TextRotationAlignment>() == AlignmentType::Map; @@ -328,54 +329,59 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { } } -style::IconPaintProperties::PossiblyEvaluated RenderSymbolLayer::iconPaintProperties() const { +// static +style::IconPaintProperties::PossiblyEvaluated RenderSymbolLayer::iconPaintProperties(const style::SymbolPaintProperties::PossiblyEvaluated& evaluated_) { return style::IconPaintProperties::PossiblyEvaluated { - evaluated.get<style::IconOpacity>(), - evaluated.get<style::IconColor>(), - evaluated.get<style::IconHaloColor>(), - evaluated.get<style::IconHaloWidth>(), - evaluated.get<style::IconHaloBlur>(), - evaluated.get<style::IconTranslate>(), - evaluated.get<style::IconTranslateAnchor>() + evaluated_.get<style::IconOpacity>(), + evaluated_.get<style::IconColor>(), + evaluated_.get<style::IconHaloColor>(), + evaluated_.get<style::IconHaloWidth>(), + evaluated_.get<style::IconHaloBlur>(), + evaluated_.get<style::IconTranslate>(), + evaluated_.get<style::IconTranslateAnchor>() }; } -style::TextPaintProperties::PossiblyEvaluated RenderSymbolLayer::textPaintProperties() const { +// static +style::TextPaintProperties::PossiblyEvaluated RenderSymbolLayer::textPaintProperties(const style::SymbolPaintProperties::PossiblyEvaluated& evaluated_) { return style::TextPaintProperties::PossiblyEvaluated { - evaluated.get<style::TextOpacity>(), - evaluated.get<style::TextColor>(), - evaluated.get<style::TextHaloColor>(), - evaluated.get<style::TextHaloWidth>(), - evaluated.get<style::TextHaloBlur>(), - evaluated.get<style::TextTranslate>(), - evaluated.get<style::TextTranslateAnchor>() + evaluated_.get<style::TextOpacity>(), + evaluated_.get<style::TextColor>(), + evaluated_.get<style::TextHaloColor>(), + evaluated_.get<style::TextHaloWidth>(), + evaluated_.get<style::TextHaloBlur>(), + evaluated_.get<style::TextTranslate>(), + evaluated_.get<style::TextTranslateAnchor>() }; } - -style::SymbolPropertyValues RenderSymbolLayer::iconPropertyValues(const style::SymbolLayoutProperties::PossiblyEvaluated& layout_) const { +// static +style::SymbolPropertyValues RenderSymbolLayer::iconPropertyValues(const style::SymbolPaintProperties::PossiblyEvaluated& evaluated_, + const style::SymbolLayoutProperties::PossiblyEvaluated& layout_) { return style::SymbolPropertyValues { layout_.get<style::IconPitchAlignment>(), layout_.get<style::IconRotationAlignment>(), layout_.get<style::IconKeepUpright>(), - evaluated.get<style::IconTranslate>(), - evaluated.get<style::IconTranslateAnchor>(), - evaluated.get<style::IconHaloColor>().constantOr(Color::black()).a > 0 && - evaluated.get<style::IconHaloWidth>().constantOr(1), - evaluated.get<style::IconColor>().constantOr(Color::black()).a > 0 + evaluated_.get<style::IconTranslate>(), + evaluated_.get<style::IconTranslateAnchor>(), + evaluated_.get<style::IconHaloColor>().constantOr(Color::black()).a > 0 && + evaluated_.get<style::IconHaloWidth>().constantOr(1), + evaluated_.get<style::IconColor>().constantOr(Color::black()).a > 0 }; } -style::SymbolPropertyValues RenderSymbolLayer::textPropertyValues(const style::SymbolLayoutProperties::PossiblyEvaluated& layout_) const { +// static +style::SymbolPropertyValues RenderSymbolLayer::textPropertyValues(const style::SymbolPaintProperties::PossiblyEvaluated& evaluated_, + const style::SymbolLayoutProperties::PossiblyEvaluated& layout_) { return style::SymbolPropertyValues { layout_.get<style::TextPitchAlignment>(), layout_.get<style::TextRotationAlignment>(), layout_.get<style::TextKeepUpright>(), - evaluated.get<style::TextTranslate>(), - evaluated.get<style::TextTranslateAnchor>(), - evaluated.get<style::TextHaloColor>().constantOr(Color::black()).a > 0 && - evaluated.get<style::TextHaloWidth>().constantOr(1), - evaluated.get<style::TextColor>().constantOr(Color::black()).a > 0 + evaluated_.get<style::TextTranslate>(), + evaluated_.get<style::TextTranslateAnchor>(), + evaluated_.get<style::TextHaloColor>().constantOr(Color::black()).a > 0 && + evaluated_.get<style::TextHaloWidth>().constantOr(1), + evaluated_.get<style::TextColor>().constantOr(Color::black()).a > 0 }; } @@ -398,4 +404,8 @@ void RenderSymbolLayer::sortRenderTiles(const TransformState& state) { }); } +void RenderSymbolLayer::updateBucketPaintProperties(Bucket* bucket) const { + static_cast<SymbolBucket*>(bucket)->paintProperties[getID()] = evaluated; +} + } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_symbol_layer.hpp b/src/mbgl/renderer/layers/render_symbol_layer.hpp index 832fb94001..6b43f91a22 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.hpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.hpp @@ -68,11 +68,8 @@ public: bool hasCrossfade() const override; void render(PaintParameters&, RenderSource*) override; - style::IconPaintProperties::PossiblyEvaluated iconPaintProperties() const; - style::TextPaintProperties::PossiblyEvaluated textPaintProperties() const; - - style::SymbolPropertyValues iconPropertyValues(const style::SymbolLayoutProperties::PossiblyEvaluated&) const; - style::SymbolPropertyValues textPropertyValues(const style::SymbolLayoutProperties::PossiblyEvaluated&) const; + static style::IconPaintProperties::PossiblyEvaluated iconPaintProperties(const style::SymbolPaintProperties::PossiblyEvaluated&); + static style::TextPaintProperties::PossiblyEvaluated textPaintProperties(const style::SymbolPaintProperties::PossiblyEvaluated&); std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const override; std::unique_ptr<Layout> createLayout(const BucketParameters&, @@ -97,8 +94,13 @@ public: const style::SymbolLayer::Impl& impl() const; protected: + static style::SymbolPropertyValues iconPropertyValues(const style::SymbolPaintProperties::PossiblyEvaluated&, + const style::SymbolLayoutProperties::PossiblyEvaluated&); + static style::SymbolPropertyValues textPropertyValues(const style::SymbolPaintProperties::PossiblyEvaluated&, + const style::SymbolLayoutProperties::PossiblyEvaluated&); RenderTiles filterRenderTiles(RenderTiles) const final; void sortRenderTiles(const TransformState&) final; + void updateBucketPaintProperties(Bucket*) const final; }; inline const RenderSymbolLayer* toRenderSymbolLayer(const RenderLayer* layer) { |