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_;