From 7ba69ce52b0b9d274a44d11ebd7d6189ff7c0c0f Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Wed, 4 Feb 2026 19:01:30 +0200 Subject: [PATCH] core: Avoid unnecessary raster buffer updates (#4085) --- include/mbgl/vulkan/renderer_backend.hpp | 2 +- .../renderer/layers/render_raster_layer.cpp | 5 ++--- src/mbgl/vulkan/context.cpp | 17 ++++++++++++----- src/mbgl/vulkan/renderer_backend.cpp | 9 +++++++-- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/include/mbgl/vulkan/renderer_backend.hpp b/include/mbgl/vulkan/renderer_backend.hpp index 0d841d3fd..8f2f21107 100644 --- a/include/mbgl/vulkan/renderer_backend.hpp +++ b/include/mbgl/vulkan/renderer_backend.hpp @@ -94,7 +94,7 @@ protected: virtual void initCommandPool(); virtual void initFrameCapture(); - virtual void destroyResources(); + void destroyResources(); protected: vk::DynamicLoader dynamicLoader; diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index 35f9c9b8b..10d1848ad 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -187,8 +187,7 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, [&](const gfx::UniqueDrawableBuilder& builder, gfx::Drawable* drawable, const RasterBucket& bucket) { // The bucket may later add, remove, or change masking. In that case, the tile's // shared data and segments are not updated, and it needs to be re-created. - if (drawable && - (bucket.sharedVertices->isModifiedAfter(drawable->createTime) || bucket.sharedTriangles->getDirty())) { + if (drawable && bucket.sharedVertices->isModifiedAfter(drawable->createTime)) { return false; } @@ -311,7 +310,7 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders, } }); - if (tileUpdateTime && (bucket.vertices.isModifiedAfter(*tileUpdateTime) || bucket.indices.getDirty())) { + if (tileUpdateTime && (bucket.vertices.isModifiedAfter(*tileUpdateTime))) { removeTile(renderPass, tileID); cleared = true; } diff --git a/src/mbgl/vulkan/context.cpp b/src/mbgl/vulkan/context.cpp index f04dd53a1..b6315d05e 100644 --- a/src/mbgl/vulkan/context.cpp +++ b/src/mbgl/vulkan/context.cpp @@ -42,8 +42,9 @@ constexpr uint32_t drawableUniformDescriptorPoolSize = 3 * 1024; constexpr uint32_t drawableImageDescriptorPoolSize = drawableUniformDescriptorPoolSize / 2; namespace { +std::mutex glslangMutex; uint32_t glslangRefCount = 0; -} +} // namespace class RenderbufferResource : public gfx::RenderbufferResource { public: @@ -54,8 +55,11 @@ Context::Context(RendererBackend& backend_) : gfx::Context(vulkan::maximumVertexBindingCount), backend(backend_), globalUniformBuffers(DescriptorSetType::Global, 0, 0, shaders::globalUBOCount) { - if (glslangRefCount++ == 0) { - glslang::InitializeProcess(); + { + std::scoped_lock lock(glslangMutex); + if (glslangRefCount++ == 0) { + glslang::InitializeProcess(); + } } initFrameResources(); @@ -66,8 +70,11 @@ Context::~Context() noexcept { destroyResources(); - if (--glslangRefCount == 0) { - glslang::FinalizeProcess(); + { + std::scoped_lock lock(glslangMutex); + if (--glslangRefCount == 0) { + glslang::FinalizeProcess(); + } } #if !defined(NDEBUG) diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index ec1a7d5b1..766de3d44 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -40,13 +40,18 @@ #define VMA_DEBUG_DETECT_CORRUPTION 1 #define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1 -#define VMA_LEAK_LOG_FORMAT(format, ...) \ +#define VMA_HEAVY_ASSERT(expr) VMA_ASSERT(expr) + +#define VMA_DEBUG_LOG_FORMAT(format, ...) \ { \ char buffer[4096]; \ sprintf(buffer, format, __VA_ARGS__); \ mbgl::Log::Info(mbgl::Event::Render, buffer); \ } +#define VMA_DEBUG_LOG(str) VMA_DEBUG_LOG_FORMAT("%s", (str)) +#define VMA_LEAK_LOG_FORMAT(...) VMA_DEBUG_LOG_FORMAT(__VA_ARGS__) + #endif #define VMA_IMPLEMENTATION @@ -100,7 +105,7 @@ RendererBackend::RendererBackend(const gfx::ContextMode contextMode_) allocator(nullptr) {} RendererBackend::~RendererBackend() { - destroyResources(); // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall) + destroyResources(); } std::unique_ptr RendererBackend::createContext() {