diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/surface_context_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/surface_context_vk.cc index 2e20d2af5c..88150f5ba7 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/surface_context_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/surface_context_vk.cc @@ -80,7 +80,6 @@ std::unique_ptr SurfaceContextVK::AcquireNextSurface() { if (auto allocator = parent_->GetResourceAllocator()) { allocator->DidAcquireSurfaceFrame(); } - parent_->GetCommandPoolRecycler()->Dispose(); return surface; } diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc index d9146d9056..7a9ca108de 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc @@ -424,6 +424,13 @@ bool SwapchainImplVK::Present(const std::shared_ptr& image, //---------------------------------------------------------------------------- /// Transition the image to color-attachment-optimal. /// + + // Increment the frame count right before allocating the cmd buffer below to + // force this to use the next frame's pool. This cmd buffer is completely + // untracked, and so we may end up resetting the cmd pool before all buffers + // have been collected. + context.GetCommandPoolRecycler()->Dispose(); + sync->final_cmd_buffer = context.CreateCommandBuffer(); if (!sync->final_cmd_buffer) { return false;