From a9ead54d737b883eeec0141cdaefd4fb08d542c9 Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Tue, 3 Oct 2023 14:15:59 -0700 Subject: [PATCH] Fix line properties on Metal --- include/mbgl/renderer/layer_tweaker.hpp | 13 +++++++------ src/mbgl/renderer/layer_tweaker.cpp | 14 ++++++++++++++ src/mbgl/renderer/layers/render_line_layer.cpp | 8 ++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/include/mbgl/renderer/layer_tweaker.hpp b/include/mbgl/renderer/layer_tweaker.hpp index 31d6868eb..06c388c57 100644 --- a/include/mbgl/renderer/layer_tweaker.hpp +++ b/include/mbgl/renderer/layer_tweaker.hpp @@ -41,32 +41,33 @@ using StringIdentity = std::size_t; class LayerTweaker { protected: LayerTweaker(std::string id, Immutable properties); - + public: LayerTweaker() = delete; virtual ~LayerTweaker() = default; - + const std::string& getID() const { return id; } - + #if MLN_RENDER_BACKEND_METAL /// Build the common expression inupts UBO static shaders::ExpressionInputsUBO buildExpressionUBO(double zoom, uint64_t frameCount); - + /// @brief Check whether a property name exists within the previously set collection. bool hasPropertyAsUniform(StringIdentity) const; shaders::AttributeSource getAttributeSource(StringIdentity) const; - + template shaders::AttributeSource getAttributeSource(size_t index) { using ShaderClass = shaders::ShaderSource; return getAttributeSource(ShaderClass::attributes[index].nameID); } #endif // MLN_RENDER_BACKEND_METAL - + /// @brief Set the collection of attribute names which will be provided at uniform values rather than per-vertex /// attributes. /// @details These values should not have "a_" prefixes, as produced by `readDataDrivenPaintProperties`. void setPropertiesAsUniforms(const std::unordered_set&); + const std::unordered_set& getPropertiesAsUniforms() const; void enableOverdrawInspector(bool); diff --git a/src/mbgl/renderer/layer_tweaker.cpp b/src/mbgl/renderer/layer_tweaker.cpp index 1fbb1d574..682445df7 100644 --- a/src/mbgl/renderer/layer_tweaker.cpp +++ b/src/mbgl/renderer/layer_tweaker.cpp @@ -85,6 +85,20 @@ void LayerTweaker::setPropertiesAsUniforms([[maybe_unused]] const std::unordered #endif } +#if !MLN_RENDER_BACKEND_METAL +namespace { +const std::unordered_set emptyIDSet; +} +#endif + +const std::unordered_set& LayerTweaker::getPropertiesAsUniforms() const { +#if MLN_RENDER_BACKEND_METAL + return propertiesAsUniforms; +#else + return emptyIDSet; +#endif +} + void LayerTweaker::enableOverdrawInspector(bool value) { if (overdrawInspector != value) { overdrawInspector = value; diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index aae15c80d..ee8f692ff 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -83,6 +83,12 @@ void RenderLineLayer::evaluate(const PropertyEvaluationParameters& parameters) { #if MLN_DRAWABLE_RENDERER if (layerGroup) { auto newTweaker = std::make_shared(getID(), evaluatedProperties); + + // propertiesAsUniforms isn't recalculated every update, so carry it over + if (layerTweaker) { + newTweaker->setPropertiesAsUniforms(layerTweaker->getPropertiesAsUniforms()); + } + replaceTweaker(layerTweaker, std::move(newTweaker), {layerGroup}); } #endif @@ -566,6 +572,8 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders, else if (shaderUniforms.get(idLineSDFInterpolationUBOName)) { drawableUniforms.createOrUpdate(idLineSDFInterpolationUBOName, &lineSDFInterpolationUBO, context); } + + // TODO: vertex attributes or `propertiesAsUniforms` updated, is that needed? }); if (tileLayerGroup->getDrawableCount(renderPass, tileID) > 0) {