@@ -785,6 +785,61 @@ TEST(
785
785
latch.Wait ();
786
786
}
787
787
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
+
788
843
TEST (RasterizerTest,
789
844
drawLayerTreeWithCorrectFrameTimingWhenPipelineIsMoreAvailable) {
790
845
std::string test_name =
0 commit comments