From 4917c51cb07433923868cbc4038e4672732995ef Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Thu, 4 May 2023 19:40:10 -0700 Subject: [PATCH] [Impeller] Do not free a Vulkan command buffer if its command pool has already been destroyed Fixes https://github.com/flutter/flutter/issues/125519 --- impeller/renderer/backend/vulkan/command_encoder_vk.cc | 2 ++ impeller/renderer/backend/vulkan/command_pool_vk.cc | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/impeller/renderer/backend/vulkan/command_encoder_vk.cc b/impeller/renderer/backend/vulkan/command_encoder_vk.cc index fd6cbec90be2a..ec75c30e9eb92 100644 --- a/impeller/renderer/backend/vulkan/command_encoder_vk.cc +++ b/impeller/renderer/backend/vulkan/command_encoder_vk.cc @@ -37,6 +37,8 @@ class TrackedObjectsVK { if (!pool) { VALIDATION_LOG << "Command pool died before a command buffer could be recycled."; + // The buffer can not be freed if its command pool has been destroyed. + buffer_.release(); return; } pool->CollectGraphicsCommandBuffer(std::move(buffer_)); diff --git a/impeller/renderer/backend/vulkan/command_pool_vk.cc b/impeller/renderer/backend/vulkan/command_pool_vk.cc index 25b8a86eba563..42fc7b02d59f8 100644 --- a/impeller/renderer/backend/vulkan/command_pool_vk.cc +++ b/impeller/renderer/backend/vulkan/command_pool_vk.cc @@ -123,6 +123,11 @@ vk::UniqueCommandBuffer CommandPoolVK::CreateGraphicsCommandBuffer() { void CommandPoolVK::CollectGraphicsCommandBuffer( vk::UniqueCommandBuffer buffer) { Lock lock(buffers_to_collect_mutex_); + if (!graphics_pool_) { + // If the command pool has already been destroyed, then its command buffers + // have been freed and are now invalid. + buffer.release(); + } buffers_to_collect_.insert(MakeSharedVK(std::move(buffer))); GarbageCollectBuffersIfAble(); }