From 1360f83328b8c8930101de5a9f9fa9b20d64af4a Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 9 Sep 2024 17:51:18 -0700 Subject: [PATCH 1/3] [CP] fix memory leak in host buffer reset. --- shell/gpu/gpu_surface_metal_impeller.mm | 3 +-- shell/gpu/gpu_surface_metal_impeller_unittests.mm | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm index 04a48a06c5e19..f6e9c4f1315ee 100644 --- a/shell/gpu/gpu_surface_metal_impeller.mm +++ b/shell/gpu/gpu_surface_metal_impeller.mm @@ -187,13 +187,12 @@ impeller::DlDispatcher impeller_dispatcher(cull_rect); display_list->Dispatch(impeller_dispatcher, sk_cull_rect); auto picture = impeller_dispatcher.EndRecordingAsPicture(); - const bool reset_host_buffer = surface_frame.submit_info().frame_boundary; return renderer->Render( std::move(surface), fml::MakeCopyable([aiks_context, picture = std::move(picture), reset_host_buffer](impeller::RenderTarget& render_target) -> bool { - return aiks_context->Render(picture, render_target, reset_host_buffer); + return aiks_context->Render(picture, render_target, /*reset_host_buffer=*/true); })); #endif }); diff --git a/shell/gpu/gpu_surface_metal_impeller_unittests.mm b/shell/gpu/gpu_surface_metal_impeller_unittests.mm index 13ccbba3f6906..883f949e17e8d 100644 --- a/shell/gpu/gpu_surface_metal_impeller_unittests.mm +++ b/shell/gpu/gpu_surface_metal_impeller_unittests.mm @@ -97,7 +97,7 @@ GPUCAMetalLayerHandle GetCAMetalLayer(const SkISize& frame_info) const override ASSERT_TRUE(frame->Submit()); } -TEST(GPUSurfaceMetalImpeller, ResetHostBufferBasedOnFrameBoundary) { +TEST(GPUSurfaceMetalImpeller, DoesNotResetHostBufferBasedOnFrameBoundary) { auto delegate = std::make_shared(); delegate->SetDevice(); @@ -115,13 +115,13 @@ GPUCAMetalLayerHandle GetCAMetalLayer(const SkISize& frame_info) const override frame->set_submit_info({.frame_boundary = false}); ASSERT_TRUE(frame->Submit()); - EXPECT_EQ(host_buffer.GetStateForTest().current_frame, 0u); + EXPECT_EQ(host_buffer.GetStateForTest().current_frame, 1u); frame = surface->AcquireFrame(SkISize::Make(100, 100)); frame->set_submit_info({.frame_boundary = true}); ASSERT_TRUE(frame->Submit()); - EXPECT_EQ(host_buffer.GetStateForTest().current_frame, 1u); + EXPECT_EQ(host_buffer.GetStateForTest().current_frame, 2u); } } // namespace testing From e23f22078eb9c14393ae9c17d12f2e26d7a90bd1 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 9 Sep 2024 18:23:17 -0700 Subject: [PATCH 2/3] Update gpu_surface_metal_impeller.mm --- shell/gpu/gpu_surface_metal_impeller.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm index f6e9c4f1315ee..f8d13087e6189 100644 --- a/shell/gpu/gpu_surface_metal_impeller.mm +++ b/shell/gpu/gpu_surface_metal_impeller.mm @@ -190,8 +190,8 @@ return renderer->Render( std::move(surface), - fml::MakeCopyable([aiks_context, picture = std::move(picture), - reset_host_buffer](impeller::RenderTarget& render_target) -> bool { + fml::MakeCopyable([aiks_context, picture = std::move(picture)] + (impeller::RenderTarget& render_target) -> bool { return aiks_context->Render(picture, render_target, /*reset_host_buffer=*/true); })); #endif From acf4e9a487eee3f68f66fdb80fc83da836e6ca79 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 9 Sep 2024 18:48:28 -0700 Subject: [PATCH 3/3] Update gpu_surface_metal_impeller.mm --- shell/gpu/gpu_surface_metal_impeller.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/gpu/gpu_surface_metal_impeller.mm b/shell/gpu/gpu_surface_metal_impeller.mm index f8d13087e6189..e096ee0d1c39d 100644 --- a/shell/gpu/gpu_surface_metal_impeller.mm +++ b/shell/gpu/gpu_surface_metal_impeller.mm @@ -190,8 +190,8 @@ return renderer->Render( std::move(surface), - fml::MakeCopyable([aiks_context, picture = std::move(picture)] - (impeller::RenderTarget& render_target) -> bool { + fml::MakeCopyable([aiks_context, picture = std::move(picture)]( + impeller::RenderTarget& render_target) -> bool { return aiks_context->Render(picture, render_target, /*reset_host_buffer=*/true); })); #endif