@@ -785,6 +785,61 @@ TEST(
785785 latch.Wait ();
786786}
787787
788+ TEST (
789+ RasterizerTest,
790+ FrameTimingRecorderShouldStartRecordingRasterTimeBeforeSurfaceAcquireFrame) {
791+ std::string test_name =
792+ ::testing::UnitTest::GetInstance ()->current_test_info()->name();
793+ ThreadHost thread_host (" io.flutter.test." + test_name + " ." ,
794+ ThreadHost::Type::Platform | ThreadHost::Type::RASTER |
795+ ThreadHost::Type::IO | ThreadHost::Type::UI);
796+ TaskRunners task_runners (" test" , thread_host.platform_thread ->GetTaskRunner (),
797+ thread_host.raster_thread ->GetTaskRunner (),
798+ thread_host.ui_thread ->GetTaskRunner (),
799+ thread_host.io_thread ->GetTaskRunner ());
800+ NiceMock<MockDelegate> delegate;
801+ Settings settings;
802+ ON_CALL (delegate, GetSettings ()).WillByDefault (ReturnRef (settings));
803+ EXPECT_CALL (delegate, GetTaskRunners ())
804+ .WillRepeatedly (ReturnRef (task_runners));
805+ EXPECT_CALL (delegate, OnFrameRasterized (_))
806+ .WillOnce ([&](const FrameTiming& frame_timing) {
807+ fml::TimePoint now = fml::TimePoint::Now ();
808+ fml::TimePoint raster_start =
809+ frame_timing.Get (FrameTiming::kRasterStart );
810+ EXPECT_TRUE (now - raster_start < fml::TimeDelta::FromSecondsF (1 ));
811+ });
812+
813+ auto rasterizer = std::make_unique<Rasterizer>(delegate);
814+ auto surface = std::make_unique<NiceMock<MockSurface>>();
815+ auto is_gpu_disabled_sync_switch =
816+ std::make_shared<const fml::SyncSwitch>(false );
817+ ON_CALL (delegate, GetIsGpuDisabledSyncSwitch ())
818+ .WillByDefault (Return (is_gpu_disabled_sync_switch));
819+ ON_CALL (*surface, AcquireFrame (SkISize ()))
820+ .WillByDefault (::testing::Invoke ([] { return nullptr ; }));
821+ EXPECT_CALL (*surface, AcquireFrame (SkISize ()));
822+ EXPECT_CALL (*surface, MakeRenderContextCurrent ())
823+ .WillOnce (Return (ByMove (std::make_unique<GLContextDefaultResult>(true ))));
824+ rasterizer->Setup (std::move (surface));
825+ fml::AutoResetWaitableEvent latch;
826+ thread_host.raster_thread ->GetTaskRunner ()->PostTask ([&] {
827+ auto pipeline = std::make_shared<LayerTreePipeline>(/* depth=*/ 10 );
828+ auto layer_tree = std::make_shared<LayerTree>(/* frame_size=*/ SkISize (),
829+ /* device_pixel_ratio=*/ 2 .0f );
830+ auto layer_tree_item = std::make_unique<LayerTreeItem>(
831+ std::move (layer_tree), CreateFinishedBuildRecorder ());
832+ PipelineProduceResult result =
833+ pipeline->Produce ().Complete (std::move (layer_tree_item));
834+ EXPECT_TRUE (result.success );
835+ auto no_discard = [](LayerTree&) { return false ; };
836+ RasterStatus status = rasterizer->Draw (pipeline, no_discard);
837+ EXPECT_EQ (status, RasterStatus::kFailed );
838+ latch.Signal ();
839+ });
840+ latch.Wait ();
841+ }
842+
788843TEST (RasterizerTest,
789844 drawLayerTreeWithCorrectFrameTimingWhenPipelineIsMoreAvailable) {
790845 std::string test_name =
0 commit comments