From 5dbe89dea1954cf9a6bf4f2a94373c9b20136479 Mon Sep 17 00:00:00 2001 From: mwilsnd <53413200+mwilsnd@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:35:58 -0500 Subject: [PATCH] Hoist symbol dynamic UBO out of drawable loop (#1884) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../renderer/layers/symbol_layer_tweaker.cpp | 17 ++++++++++++----- .../renderer/layers/symbol_layer_tweaker.hpp | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp index 3f062a9aa..6505859f9 100644 --- a/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp +++ b/src/mbgl/renderer/layers/symbol_layer_tweaker.cpp @@ -101,6 +101,10 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete propertiesUpdated = false; } + const SymbolDynamicUBO dynamicUBO = {/*.fade_change=*/parameters.symbolFadeChange, + /*.pad1=*/0, + /*.pad2=*/{0, 0}}; + layerGroup.visitDrawables([&](gfx::Drawable& drawable) { if (!drawable.getTileID() || !drawable.getData()) { return; @@ -120,6 +124,12 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete iconPropertiesUpdated = false; } + if (!dynamicBuffer) { + dynamicBuffer = parameters.context.createUniformBuffer(&dynamicUBO, sizeof(dynamicUBO)); + } else { + dynamicBuffer->update(&dynamicUBO, sizeof(dynamicUBO)); + } + // from RenderTile::translatedMatrix const auto translate = isText ? evaluated.get() : evaluated.get(); const auto anchor = isText ? evaluated.get() @@ -171,13 +181,10 @@ void SymbolLayerTweaker::execute(LayerGroupBase& layerGroup, const PaintParamete /*.pad=*/{0}, }; - const SymbolDynamicUBO dynamicUBO = {/*.fade_change=*/parameters.symbolFadeChange, - /*.pad1=*/0, - /*.pad2=*/{0, 0}}; - auto& uniforms = drawable.mutableUniformBuffers(); uniforms.createOrUpdate(idSymbolDrawableUBOName, &drawableUBO, context); - uniforms.createOrUpdate(idSymbolDynamicUBOName, &dynamicUBO, context); + + uniforms.addOrReplace(idSymbolDynamicUBOName, dynamicBuffer); uniforms.addOrReplace(idSymbolDrawablePaintUBOName, isText ? textPaintBuffer : iconPaintBuffer); #if MLN_RENDER_BACKEND_METAL diff --git a/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp b/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp index 4e0f6b556..2b57d7be7 100644 --- a/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp +++ b/src/mbgl/renderer/layers/symbol_layer_tweaker.hpp @@ -29,6 +29,7 @@ public: private: gfx::UniformBufferPtr textPaintBuffer; gfx::UniformBufferPtr iconPaintBuffer; + gfx::UniformBufferPtr dynamicBuffer; bool textPropertiesUpdated = false; bool iconPropertiesUpdated = false;