[Impeller] fix memory leak during gif upload. (flutter/engine#55920)

Fixes https://github.com/flutter/flutter/issues/156728

Need to periodically flush the TLS command buffer pools in multiframe codec just like single frame codec.
This commit is contained in:
Jonah Williams 2024-10-16 18:17:59 -07:00 committed by GitHub
parent a8961f9449
commit 5c6ab792a2
2 changed files with 10 additions and 0 deletions

View File

@ -483,6 +483,9 @@ ImageDecoderImpeller::UploadTextureToStorage(
}
texture->SetLabel(impeller::SPrintF("ui.Image(%p)", texture.get()).c_str());
context->DisposeThreadLocalCachedResources();
return std::make_pair(impeller::DlImageImpeller::Make(std::move(texture)),
std::string());
}

View File

@ -92,8 +92,12 @@ class TestImpellerContext : public impeller::Context {
tasks_.clear();
}
void DisposeThreadLocalCachedResources() override { did_dispose_ = true; }
void Shutdown() override {}
bool DidDisposeResources() const { return did_dispose_; }
mutable size_t command_buffer_count_ = 0;
private:
@ -103,6 +107,7 @@ class TestImpellerContext : public impeller::Context {
};
std::vector<PendingTask> tasks_;
std::shared_ptr<const Capabilities> capabilities_;
bool did_dispose_ = false;
};
} // namespace impeller
@ -367,12 +372,14 @@ TEST_F(ImageDecoderFixtureTest, ImpellerUploadToSharedNoGpu) {
EXPECT_EQ(no_gpu_access_context->command_buffer_count_, 0ul);
EXPECT_FALSE(invoked);
EXPECT_EQ(no_gpu_access_context->DidDisposeResources(), false);
auto result = ImageDecoderImpeller::UploadTextureToStorage(
no_gpu_access_context, bitmap);
ASSERT_EQ(no_gpu_access_context->command_buffer_count_, 0ul);
ASSERT_EQ(result.second, "");
EXPECT_EQ(no_gpu_access_context->DidDisposeResources(), true);
no_gpu_access_context->FlushTasks(/*fail=*/true);
}