From 98d9a51a31997fac1935a022d97b87cbdf5accf5 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 20 Sep 2023 20:48:47 -0700 Subject: [PATCH] [Impeller] temp work around for cmd pool validation issues. (flutter/engine#46131) I'm not able to reproduce most validation errors in the macrobenchmark app with this change. THe real fix seems to be to track this last cmd buffer but I'm struggling to find a way to do this. --- .../impeller/renderer/backend/vulkan/surface_context_vk.cc | 1 - .../impeller/renderer/backend/vulkan/swapchain_impl_vk.cc | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) 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;