From 368ca941ebeef81b9b7c317418c4eaa6ac1fd732 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 25 Oct 2024 13:30:17 -0700 Subject: [PATCH] [Impeller] Lock access to descriptor pool map. (flutter/engine#56113) Speculative fix for https://github.com/flutter/flutter/issues/157565 which looks like the kind of error that might happen if we concurrently mutate this hashmap. --- .../renderer/backend/vulkan/context_vk.cc | 24 ++++++++++++------- .../renderer/backend/vulkan/context_vk.h | 4 +++- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc index eaef668e474..82f3091e61c 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc @@ -503,15 +503,18 @@ std::shared_ptr ContextVK::CreateCommandBuffer() const { // look up a cached descriptor pool for the current frame and reuse it // if it exists, otherwise create a new pool. - DescriptorPoolMap::iterator current_pool = - cached_descriptor_pool_.find(std::this_thread::get_id()); std::shared_ptr descriptor_pool; - if (current_pool == cached_descriptor_pool_.end()) { - descriptor_pool = - (cached_descriptor_pool_[std::this_thread::get_id()] = - std::make_shared(weak_from_this())); - } else { - descriptor_pool = current_pool->second; + { + Lock lock(desc_pool_mutex_); + DescriptorPoolMap::iterator current_pool = + cached_descriptor_pool_.find(std::this_thread::get_id()); + if (current_pool == cached_descriptor_pool_.end()) { + descriptor_pool = + (cached_descriptor_pool_[std::this_thread::get_id()] = + std::make_shared(weak_from_this())); + } else { + descriptor_pool = current_pool->second; + } } auto tracked_objects = std::make_shared( @@ -668,7 +671,10 @@ void ContextVK::InitializeCommonlyUsedShadersIfNeeded() const { } void ContextVK::DisposeThreadLocalCachedResources() { - cached_descriptor_pool_.erase(std::this_thread::get_id()); + { + Lock lock(desc_pool_mutex_); + cached_descriptor_pool_.erase(std::this_thread::get_id()); + } command_pool_recycler_->Dispose(); } diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.h b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.h index 91d4506312d..013e627dad1 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.h +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.h @@ -234,7 +234,9 @@ class ContextVK final : public Context, using DescriptorPoolMap = std::unordered_map>; - mutable DescriptorPoolMap cached_descriptor_pool_; + mutable Mutex desc_pool_mutex_; + mutable DescriptorPoolMap IPLR_GUARDED_BY(desc_pool_mutex_) + cached_descriptor_pool_; bool should_disable_surface_control_ = false; bool should_batch_cmd_buffers_ = false; std::vector> pending_command_buffers_;