From ccfe42f0e350b74d48cb694260bfaf112373d78d Mon Sep 17 00:00:00 2001 From: xiaowei-guan Date: Tue, 23 Dec 2025 11:59:17 +0800 Subject: [PATCH 1/2] Fix GPU memory leak issue --- .../embedder/embedder_external_texture_vulkan.cc | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc b/engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc index ced35eb6d5e85..ddf49cc69ea39 100644 --- a/engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc +++ b/engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc @@ -139,12 +139,10 @@ sk_sp EmbedderExternalTextureVulkan::ResolveTextureImpeller( return nullptr; } - const auto& impeller_context = + auto& impeller_context = impeller::ContextVK::Cast(*aiks_context->GetContext()); - auto texture_source = std::make_shared( aiks_context->GetContext(), texture_desc.get()); - auto texture = std::make_shared( aiks_context->GetContext(), texture_source); // Transition the layout to shader read. @@ -152,7 +150,6 @@ sk_sp EmbedderExternalTextureVulkan::ResolveTextureImpeller( auto buffer = impeller_context.CreateCommandBuffer(); impeller::CommandBufferVK& buffer_vk = impeller::CommandBufferVK::Cast(*buffer); - impeller::BarrierVK barrier; barrier.cmd_buffer = buffer_vk.GetCommandBuffer(); barrier.src_access = impeller::vk::AccessFlagBits::eColorAttachmentWrite | @@ -162,17 +159,16 @@ sk_sp EmbedderExternalTextureVulkan::ResolveTextureImpeller( impeller::vk::PipelineStageFlagBits::eTransfer; barrier.dst_access = impeller::vk::AccessFlagBits::eShaderRead; barrier.dst_stage = impeller::vk::PipelineStageFlagBits::eFragmentShader; - barrier.new_layout = impeller::vk::ImageLayout::eShaderReadOnlyOptimal; - if (!texture_source->SetLayout(barrier).ok()) { + if (!texture->SetLayout(barrier)) { return nullptr; } if (!impeller_context.GetCommandQueue()->Submit({buffer}).ok()) { return nullptr; } } - + impeller_context.DisposeThreadLocalCachedResources(); return impeller::DlImageImpeller::Make(texture); } From 70fbf5d9f5e2bea583c4c0b4e6408d9a425bc0ef Mon Sep 17 00:00:00 2001 From: xiaowei-guan Date: Wed, 24 Dec 2025 05:48:00 +0800 Subject: [PATCH 2/2] Revert unnecessary change --- .../platform/embedder/embedder_external_texture_vulkan.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc b/engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc index ddf49cc69ea39..b50d9644b914a 100644 --- a/engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc +++ b/engine/src/flutter/shell/platform/embedder/embedder_external_texture_vulkan.cc @@ -141,8 +141,10 @@ sk_sp EmbedderExternalTextureVulkan::ResolveTextureImpeller( auto& impeller_context = impeller::ContextVK::Cast(*aiks_context->GetContext()); + auto texture_source = std::make_shared( aiks_context->GetContext(), texture_desc.get()); + auto texture = std::make_shared( aiks_context->GetContext(), texture_source); // Transition the layout to shader read. @@ -150,6 +152,7 @@ sk_sp EmbedderExternalTextureVulkan::ResolveTextureImpeller( auto buffer = impeller_context.CreateCommandBuffer(); impeller::CommandBufferVK& buffer_vk = impeller::CommandBufferVK::Cast(*buffer); + impeller::BarrierVK barrier; barrier.cmd_buffer = buffer_vk.GetCommandBuffer(); barrier.src_access = impeller::vk::AccessFlagBits::eColorAttachmentWrite | @@ -159,9 +162,10 @@ sk_sp EmbedderExternalTextureVulkan::ResolveTextureImpeller( impeller::vk::PipelineStageFlagBits::eTransfer; barrier.dst_access = impeller::vk::AccessFlagBits::eShaderRead; barrier.dst_stage = impeller::vk::PipelineStageFlagBits::eFragmentShader; + barrier.new_layout = impeller::vk::ImageLayout::eShaderReadOnlyOptimal; - if (!texture->SetLayout(barrier)) { + if (!texture_source->SetLayout(barrier).ok()) { return nullptr; } if (!impeller_context.GetCommandQueue()->Submit({buffer}).ok()) {