22// Use of this source code is governed by a BSD-style license that can be
33// found in the LICENSE file.
44
5+ #define FML_USED_ON_EMBEDDER
6+
57#include " flutter/shell/common/rasterizer.h"
68
79#include " flutter/shell/common/thread_host.h"
810#include " flutter/testing/testing.h"
911#include " gmock/gmock.h"
1012
1113using testing::_;
14+ using testing::ByMove;
1215using testing::Return;
1316using testing::ReturnRef;
1417
@@ -92,7 +95,8 @@ TEST(RasterizerTest, drawEmptyPipeline) {
9295 latch.Wait ();
9396}
9497
95- TEST (RasterizerTest, drawWithExternalViewEmbedder) {
98+ TEST (RasterizerTest,
99+ drawWithExternalViewEmbedder_ExternalViewEmbedderSubmitFrameCalled) {
96100 std::string test_name =
97101 ::testing::UnitTest::GetInstance ()->current_test_info()->name();
98102 ThreadHost thread_host (" io.flutter.test." + test_name + " ." ,
@@ -111,11 +115,81 @@ TEST(RasterizerTest, drawWithExternalViewEmbedder) {
111115 std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
112116 std::make_shared<MockExternalViewEmbedder>();
113117 rasterizer->SetExternalViewEmbedder (external_view_embedder);
118+
119+ auto surface_frame = std::make_unique<SurfaceFrame>(
120+ /* surface=*/ nullptr , /* supports_readback=*/ true ,
121+ /* submit_callback=*/ [](const SurfaceFrame&, SkCanvas*) { return true ; });
122+ EXPECT_CALL (*surface, AcquireFrame (SkISize ()))
123+ .WillOnce (Return (ByMove (std::move (surface_frame))));
124+
114125 EXPECT_CALL (*external_view_embedder,
115- BeginFrame (SkISize (), nullptr , 2.0 ,
116- fml::RefPtr<fml::RasterThreadMerger>(nullptr )));
126+ BeginFrame (/* frame_size=*/ SkISize (), /* context=*/ nullptr ,
127+ /* device_pixel_ratio=*/ 2.0 ,
128+ /* raster_thread_merger=*/
129+ fml::RefPtr<fml::RasterThreadMerger>(nullptr )))
130+ .Times (1 );
131+ EXPECT_CALL (*external_view_embedder, SubmitFrame).Times (1 );
132+ EXPECT_CALL (
133+ *external_view_embedder,
134+ EndFrame (/* should_resubmit_frame=*/ false ,
135+ /* raster_thread_merger=*/ fml::RefPtr<fml::RasterThreadMerger>(
136+ nullptr )))
137+ .Times (1 );
138+
139+ rasterizer->Setup (std::move (surface));
140+ fml::AutoResetWaitableEvent latch;
141+ thread_host.raster_thread ->GetTaskRunner ()->PostTask ([&] {
142+ auto pipeline = fml::AdoptRef (new Pipeline<LayerTree>(/* depth=*/ 10 ));
143+ auto layer_tree = std::make_unique<LayerTree>(/* frame_size=*/ SkISize (),
144+ /* device_pixel_ratio=*/ 2 .0f );
145+ bool result = pipeline->Produce ().Complete (std::move (layer_tree));
146+ EXPECT_TRUE (result);
147+ auto no_discard = [](LayerTree&) { return false ; };
148+ rasterizer->Draw (pipeline, no_discard);
149+ latch.Signal ();
150+ });
151+ latch.Wait ();
152+ }
153+
154+ TEST (
155+ RasterizerTest,
156+ drawWithExternalViewEmbedderAndThreadMergerNotMerged_ExternalViewEmbedderSubmitFrameNotCalled) {
157+ std::string test_name =
158+ ::testing::UnitTest::GetInstance ()->current_test_info()->name();
159+ ThreadHost thread_host (" io.flutter.test." + test_name + " ." ,
160+ ThreadHost::Type::Platform | ThreadHost::Type::GPU |
161+ ThreadHost::Type::IO | ThreadHost::Type::UI);
162+ TaskRunners task_runners (" test" , thread_host.platform_thread ->GetTaskRunner (),
163+ thread_host.raster_thread ->GetTaskRunner (),
164+ thread_host.ui_thread ->GetTaskRunner (),
165+ thread_host.io_thread ->GetTaskRunner ());
166+ MockDelegate delegate;
167+ EXPECT_CALL (delegate, GetTaskRunners ())
168+ .WillRepeatedly (ReturnRef (task_runners));
169+ EXPECT_CALL (delegate, OnFrameRasterized (_));
170+ auto rasterizer = std::make_unique<Rasterizer>(delegate);
171+ auto surface = std::make_unique<MockSurface>();
172+ std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
173+ std::make_shared<MockExternalViewEmbedder>();
174+ rasterizer->SetExternalViewEmbedder (external_view_embedder);
175+ EXPECT_CALL (*external_view_embedder, SupportsDynamicThreadMerging)
176+ .WillRepeatedly (Return (true ));
177+ auto surface_frame = std::make_unique<SurfaceFrame>(
178+ /* surface=*/ nullptr , /* supports_readback=*/ true ,
179+ /* submit_callback=*/ [](const SurfaceFrame&, SkCanvas*) { return true ; });
180+ EXPECT_CALL (*surface, AcquireFrame (SkISize ()))
181+ .WillOnce (Return (ByMove (std::move (surface_frame))));
182+
117183 EXPECT_CALL (*external_view_embedder,
118- EndFrame (false , fml::RefPtr<fml::RasterThreadMerger>(nullptr )));
184+ BeginFrame (/* frame_size=*/ SkISize (), /* context=*/ nullptr ,
185+ /* device_pixel_ratio=*/ 2.0 ,
186+ /* raster_thread_merger=*/ _))
187+ .Times (1 );
188+ EXPECT_CALL (*external_view_embedder, SubmitFrame).Times (0 );
189+ EXPECT_CALL (*external_view_embedder, EndFrame (/* should_resubmit_frame=*/ false ,
190+ /* raster_thread_merger=*/ _))
191+ .Times (1 );
192+
119193 rasterizer->Setup (std::move (surface));
120194 fml::AutoResetWaitableEvent latch;
121195 thread_host.raster_thread ->GetTaskRunner ()->PostTask ([&] {
@@ -124,12 +198,66 @@ TEST(RasterizerTest, drawWithExternalViewEmbedder) {
124198 /* device_pixel_ratio=*/ 2 .0f );
125199 bool result = pipeline->Produce ().Complete (std::move (layer_tree));
126200 EXPECT_TRUE (result);
127- std::function<bool (LayerTree&)> no_discard = [](LayerTree&) {
128- return false ;
129- };
201+ auto no_discard = [](LayerTree&) { return false ; };
130202 rasterizer->Draw (pipeline, no_discard);
131203 latch.Signal ();
132204 });
133205 latch.Wait ();
134206}
207+
208+ TEST (
209+ RasterizerTest,
210+ drawWithExternalViewEmbedderAndThreadsMerged_ExternalViewEmbedderSubmitFrameCalled) {
211+ std::string test_name =
212+ ::testing::UnitTest::GetInstance ()->current_test_info()->name();
213+ ThreadHost thread_host (" io.flutter.test." + test_name + " ." ,
214+ ThreadHost::Type::Platform | ThreadHost::Type::GPU |
215+ ThreadHost::Type::IO | ThreadHost::Type::UI);
216+ fml::MessageLoop::EnsureInitializedForCurrentThread ();
217+ TaskRunners task_runners (" test" ,
218+ fml::MessageLoop::GetCurrent ().GetTaskRunner (),
219+ fml::MessageLoop::GetCurrent ().GetTaskRunner (),
220+ thread_host.ui_thread ->GetTaskRunner (),
221+ thread_host.io_thread ->GetTaskRunner ());
222+
223+ MockDelegate delegate;
224+ EXPECT_CALL (delegate, GetTaskRunners ())
225+ .WillRepeatedly (ReturnRef (task_runners));
226+ EXPECT_CALL (delegate, OnFrameRasterized (_));
227+
228+ auto rasterizer = std::make_unique<Rasterizer>(delegate);
229+ auto surface = std::make_unique<MockSurface>();
230+
231+ std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
232+ std::make_shared<MockExternalViewEmbedder>();
233+ rasterizer->SetExternalViewEmbedder (external_view_embedder);
234+
235+ auto surface_frame = std::make_unique<SurfaceFrame>(
236+ /* surface=*/ nullptr , /* supports_readback=*/ true ,
237+ /* submit_callback=*/ [](const SurfaceFrame&, SkCanvas*) { return true ; });
238+ EXPECT_CALL (*surface, AcquireFrame (SkISize ()))
239+ .WillOnce (Return (ByMove (std::move (surface_frame))));
240+ EXPECT_CALL (*external_view_embedder, SupportsDynamicThreadMerging)
241+ .WillRepeatedly (Return (true ));
242+
243+ EXPECT_CALL (*external_view_embedder,
244+ BeginFrame (/* frame_size=*/ SkISize (), /* context=*/ nullptr ,
245+ /* device_pixel_ratio=*/ 2.0 ,
246+ /* raster_thread_merger=*/ _))
247+ .Times (1 );
248+ EXPECT_CALL (*external_view_embedder, SubmitFrame).Times (1 );
249+ EXPECT_CALL (*external_view_embedder, EndFrame (/* should_resubmit_frame=*/ false ,
250+ /* raster_thread_merger=*/ _))
251+ .Times (1 );
252+
253+ rasterizer->Setup (std::move (surface));
254+
255+ auto pipeline = fml::AdoptRef (new Pipeline<LayerTree>(/* depth=*/ 10 ));
256+ auto layer_tree = std::make_unique<LayerTree>(/* frame_size=*/ SkISize (),
257+ /* device_pixel_ratio=*/ 2 .0f );
258+ bool result = pipeline->Produce ().Complete (std::move (layer_tree));
259+ EXPECT_TRUE (result);
260+ auto no_discard = [](LayerTree&) { return false ; };
261+ rasterizer->Draw (pipeline, no_discard);
262+ }
135263} // namespace flutter
0 commit comments