diff --git a/impeller/renderer/backend/vulkan/command_pool_vk.cc b/impeller/renderer/backend/vulkan/command_pool_vk.cc index 380623c1cdc88..796672bad74f5 100644 --- a/impeller/renderer/backend/vulkan/command_pool_vk.cc +++ b/impeller/renderer/backend/vulkan/command_pool_vk.cc @@ -92,8 +92,15 @@ bool CommandPoolVK::IsValid() const { void CommandPoolVK::Reset() { Lock lock(buffers_to_collect_mutex_); - GarbageCollectBuffersIfAble(); graphics_pool_.reset(); + + // When the command pool is destroyed, all of its command buffers are freed. + // Handles allocated from that pool are now invalid and must be discarded. + for (vk::UniqueCommandBuffer& buffer : buffers_to_collect_) { + buffer.release(); + } + buffers_to_collect_.clear(); + is_valid_ = false; } @@ -133,7 +140,7 @@ void CommandPoolVK::CollectGraphicsCommandBuffer( // have been freed and are now invalid. buffer.release(); } - buffers_to_collect_.insert(MakeSharedVK(std::move(buffer))); + buffers_to_collect_.emplace_back(std::move(buffer)); GarbageCollectBuffersIfAble(); } diff --git a/impeller/renderer/backend/vulkan/command_pool_vk.h b/impeller/renderer/backend/vulkan/command_pool_vk.h index a059da8390419..9948af0f524b7 100644 --- a/impeller/renderer/backend/vulkan/command_pool_vk.h +++ b/impeller/renderer/backend/vulkan/command_pool_vk.h @@ -42,7 +42,7 @@ class CommandPoolVK { std::weak_ptr device_holder_; vk::UniqueCommandPool graphics_pool_; Mutex buffers_to_collect_mutex_; - std::set> buffers_to_collect_ + std::vector buffers_to_collect_ IPLR_GUARDED_BY(buffers_to_collect_mutex_); bool is_valid_ = false;