From 102c5ae11c7443a917370712106a810989eac069 Mon Sep 17 00:00:00 2001 From: luckysmg <2539699336@qq.com> Date: Fri, 6 Jan 2023 16:57:40 +0800 Subject: [PATCH 1/7] ++ --- shell/common/rasterizer.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc index 479988440a6cc..3383a03d184c8 100644 --- a/shell/common/rasterizer.cc +++ b/shell/common/rasterizer.cc @@ -504,6 +504,8 @@ RasterStatus Rasterizer::DrawToSurfaceUnsafe( embedder_root_canvas = external_view_embedder_->GetRootCanvas(); } + frame_timings_recorder.RecordRasterStart(fml::TimePoint::Now()); + // On Android, the external view embedder deletes surfaces in `BeginFrame`. // // Deleting a surface also clears the GL context. Therefore, acquire the @@ -536,7 +538,6 @@ RasterStatus Rasterizer::DrawToSurfaceUnsafe( ); if (compositor_frame) { compositor_context_->raster_cache().BeginFrame(); - frame_timings_recorder.RecordRasterStart(fml::TimePoint::Now()); std::unique_ptr damage; // when leaf layer tracing is enabled we wish to repaint the whole frame From 2765737be35c98af612466f21e4ad3f01841b1c5 Mon Sep 17 00:00:00 2001 From: luckysmg <2539699336@qq.com> Date: Fri, 6 Jan 2023 18:36:48 +0800 Subject: [PATCH 2/7] ++ --- shell/common/rasterizer.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc index 3383a03d184c8..a9397aacaf02f 100644 --- a/shell/common/rasterizer.cc +++ b/shell/common/rasterizer.cc @@ -512,6 +512,8 @@ RasterStatus Rasterizer::DrawToSurfaceUnsafe( // frame after calling `BeginFrame` as this operation resets the GL context. auto frame = surface_->AcquireFrame(layer_tree.frame_size()); if (frame == nullptr) { + frame_timings_recorder.RecordRasterEnd( + &compositor_context_->raster_cache()); return RasterStatus::kFailed; } From bcdc9a5bc420c837e1fc216df4cfe0f6a07d351f Mon Sep 17 00:00:00 2001 From: luckysmg <2539699336@qq.com> Date: Sun, 8 Jan 2023 14:53:53 +0800 Subject: [PATCH 3/7] Add tests --- shell/common/rasterizer_unittests.cc | 55 ++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index 99333d0dd1cae..df47539e188c1 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -785,6 +785,61 @@ TEST( latch.Wait(); } +TEST( + RasterizerTest, + FrameTimingRecorderShouldStartRecordingRasterTimeBeforeSurfaceAcquireFrame) { + std::string test_name = + ::testing::UnitTest::GetInstance()->current_test_info()->name(); + ThreadHost thread_host("io.flutter.test." + test_name + ".", + ThreadHost::Type::Platform | ThreadHost::Type::RASTER | + ThreadHost::Type::IO | ThreadHost::Type::UI); + TaskRunners task_runners("test", thread_host.platform_thread->GetTaskRunner(), + thread_host.raster_thread->GetTaskRunner(), + thread_host.ui_thread->GetTaskRunner(), + thread_host.io_thread->GetTaskRunner()); + NiceMock delegate; + Settings settings; + ON_CALL(delegate, GetSettings()).WillByDefault(ReturnRef(settings)); + EXPECT_CALL(delegate, GetTaskRunners()) + .WillRepeatedly(ReturnRef(task_runners)); + EXPECT_CALL(delegate, OnFrameRasterized(_)) + .WillOnce([&](const FrameTiming& frame_timing) { + fml::TimePoint now = fml::TimePoint::Now(); + fml::TimePoint raster_start = + frame_timing.Get(FrameTiming::kRasterStart); + EXPECT_TRUE(now - raster_start < fml::TimeDelta::FromSecondsF(1)); + }); + + auto rasterizer = std::make_unique(delegate); + auto surface = std::make_unique>(); + auto is_gpu_disabled_sync_switch = + std::make_shared(false); + ON_CALL(delegate, GetIsGpuDisabledSyncSwitch()) + .WillByDefault(Return(is_gpu_disabled_sync_switch)); + ON_CALL(*surface, AcquireFrame(SkISize())) + .WillByDefault(::testing::Invoke([] { return nullptr; })); + EXPECT_CALL(*surface, AcquireFrame(SkISize())); + EXPECT_CALL(*surface, MakeRenderContextCurrent()) + .WillOnce(Return(ByMove(std::make_unique(true)))); + rasterizer->Setup(std::move(surface)); + fml::AutoResetWaitableEvent latch; + thread_host.raster_thread->GetTaskRunner()->PostTask([&] { + auto pipeline = std::make_shared(/*depth=*/10); + auto layer_tree = std::make_shared(/*frame_size=*/SkISize(), + /*device_pixel_ratio=*/2.0f); + auto layer_tree_item = std::make_unique( + std::move(layer_tree), CreateFinishedBuildRecorder()); + PipelineProduceResult result = + pipeline->Produce().Complete(std::move(layer_tree_item)); + EXPECT_TRUE(result.success); + auto no_discard = [](LayerTree&) { return false; }; + RasterStatus status = rasterizer->Draw(pipeline, no_discard); + EXPECT_EQ(status, RasterStatus::kFailed); + latch.Signal(); + }); + latch.Wait(); +} + TEST(RasterizerTest, drawLayerTreeWithCorrectFrameTimingWhenPipelineIsMoreAvailable) { std::string test_name = From bd5a0b19248512dbf06180064de3c2690901e9b4 Mon Sep 17 00:00:00 2001 From: luckysmg <2539699336@qq.com> Date: Sun, 8 Jan 2023 15:14:03 +0800 Subject: [PATCH 4/7] Add missing trace --- shell/gpu/gpu_surface_metal_skia.mm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shell/gpu/gpu_surface_metal_skia.mm b/shell/gpu/gpu_surface_metal_skia.mm index d61931ce0688f..e3195f91563f4 100644 --- a/shell/gpu/gpu_surface_metal_skia.mm +++ b/shell/gpu/gpu_surface_metal_skia.mm @@ -86,6 +86,7 @@ // |Surface| std::unique_ptr GPUSurfaceMetalSkia::AcquireFrame(const SkISize& frame_size) { + TRACE_EVENT0("flutter", "GPUSurfaceMetalSkia::AcquireFrame"); if (!IsValid()) { FML_LOG(ERROR) << "Metal surface was invalid."; return nullptr; @@ -118,6 +119,7 @@ std::unique_ptr GPUSurfaceMetalSkia::AcquireFrameFromCAMetalLayer( const SkISize& frame_info) { + TRACE_EVENT0("flutter", "GPUSurfaceMetalSkia::AcquireFrameFromCAMetalLayer"); auto layer = delegate_->GetCAMetalLayer(frame_info); if (!layer) { FML_LOG(ERROR) << "Invalid CAMetalLayer given by the embedder."; @@ -199,6 +201,7 @@ std::unique_ptr GPUSurfaceMetalSkia::AcquireFrameFromMTLTexture( const SkISize& frame_info) { + TRACE_EVENT0("flutter", "GPUSurfaceMetalSkia::AcquireFrameFromMTLTexture"); GPUMTLTextureInfo texture = delegate_->GetMTLTexture(frame_info); id mtl_texture = (id)(texture.texture); From 5446f6677bffbfd0a3ab12870d5c214c88d87151 Mon Sep 17 00:00:00 2001 From: luckysmg <2539699336@qq.com> Date: Sun, 8 Jan 2023 15:36:08 +0800 Subject: [PATCH 5/7] ++ --- shell/gpu/gpu_surface_metal_skia.mm | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/gpu/gpu_surface_metal_skia.mm b/shell/gpu/gpu_surface_metal_skia.mm index e3195f91563f4..6c6174b2a66d4 100644 --- a/shell/gpu/gpu_surface_metal_skia.mm +++ b/shell/gpu/gpu_surface_metal_skia.mm @@ -201,7 +201,6 @@ std::unique_ptr GPUSurfaceMetalSkia::AcquireFrameFromMTLTexture( const SkISize& frame_info) { - TRACE_EVENT0("flutter", "GPUSurfaceMetalSkia::AcquireFrameFromMTLTexture"); GPUMTLTextureInfo texture = delegate_->GetMTLTexture(frame_info); id mtl_texture = (id)(texture.texture); From f7967e6d6024a359de26c67249ced87f83a67ea3 Mon Sep 17 00:00:00 2001 From: luckysmg <2539699336@qq.com> Date: Sun, 8 Jan 2023 16:00:40 +0800 Subject: [PATCH 6/7] ++ --- shell/gpu/gpu_surface_metal_skia.mm | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/gpu/gpu_surface_metal_skia.mm b/shell/gpu/gpu_surface_metal_skia.mm index 6c6174b2a66d4..ed64dab6eb604 100644 --- a/shell/gpu/gpu_surface_metal_skia.mm +++ b/shell/gpu/gpu_surface_metal_skia.mm @@ -119,7 +119,6 @@ std::unique_ptr GPUSurfaceMetalSkia::AcquireFrameFromCAMetalLayer( const SkISize& frame_info) { - TRACE_EVENT0("flutter", "GPUSurfaceMetalSkia::AcquireFrameFromCAMetalLayer"); auto layer = delegate_->GetCAMetalLayer(frame_info); if (!layer) { FML_LOG(ERROR) << "Invalid CAMetalLayer given by the embedder."; From cbbd955efb8a07639e42452092cd68bc7d4d0033 Mon Sep 17 00:00:00 2001 From: luckysmg <2539699336@qq.com> Date: Sun, 8 Jan 2023 16:11:58 +0800 Subject: [PATCH 7/7] ++ --- shell/gpu/gpu_surface_metal_skia.mm | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/gpu/gpu_surface_metal_skia.mm b/shell/gpu/gpu_surface_metal_skia.mm index ed64dab6eb604..d61931ce0688f 100644 --- a/shell/gpu/gpu_surface_metal_skia.mm +++ b/shell/gpu/gpu_surface_metal_skia.mm @@ -86,7 +86,6 @@ // |Surface| std::unique_ptr GPUSurfaceMetalSkia::AcquireFrame(const SkISize& frame_size) { - TRACE_EVENT0("flutter", "GPUSurfaceMetalSkia::AcquireFrame"); if (!IsValid()) { FML_LOG(ERROR) << "Metal surface was invalid."; return nullptr;