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+ drawWithExternalViewEmbedderExternalViewEmbedderSubmitFrameCalled) {
96100 std::string test_name =
97101 ::testing::UnitTest::GetInstance ()->current_test_info()->name();
98102 ThreadHost thread_host (" io.flutter.test." + test_name + " ." ,
@@ -108,14 +112,85 @@ TEST(RasterizerTest, drawWithExternalViewEmbedder) {
108112 EXPECT_CALL (delegate, OnFrameRasterized (_));
109113 auto rasterizer = std::make_unique<Rasterizer>(delegate);
110114 auto surface = std::make_unique<MockSurface>();
115+
111116 MockExternalViewEmbedder external_view_embedder;
112117 EXPECT_CALL (*surface, GetExternalViewEmbedder ())
113118 .WillRepeatedly (Return (&external_view_embedder));
119+
120+ auto surface_frame = std::make_unique<SurfaceFrame>(
121+ /* surface=*/ nullptr , /* supports_readback=*/ true ,
122+ /* submit_callback=*/ [](const SurfaceFrame&, SkCanvas*) { return true ; });
123+ EXPECT_CALL (*surface, AcquireFrame (SkISize ()))
124+ .WillOnce (Return (ByMove (std::move (surface_frame))));
125+
114126 EXPECT_CALL (external_view_embedder,
115- BeginFrame (SkISize (), nullptr , 2.0 ,
116- fml::RefPtr<fml::RasterThreadMerger>(nullptr )));
127+ BeginFrame (/* frame_size=*/ SkISize (), /* context=*/ nullptr ,
128+ /* device_pixel_ratio=*/ 2.0 ,
129+ /* raster_thread_merger=*/
130+ fml::RefPtr<fml::RasterThreadMerger>(nullptr )))
131+ .Times (1 );
132+ EXPECT_CALL (external_view_embedder, SubmitFrame).Times (1 );
133+ EXPECT_CALL (
134+ external_view_embedder,
135+ EndFrame (/* should_resubmit_frame=*/ false ,
136+ /* raster_thread_merger=*/ fml::RefPtr<fml::RasterThreadMerger>(
137+ nullptr )))
138+ .Times (1 );
139+
140+ rasterizer->Setup (std::move (surface));
141+ fml::AutoResetWaitableEvent latch;
142+ thread_host.raster_thread ->GetTaskRunner ()->PostTask ([&] {
143+ auto pipeline = fml::AdoptRef (new Pipeline<LayerTree>(/* depth=*/ 10 ));
144+ auto layer_tree = std::make_unique<LayerTree>(/* frame_size=*/ SkISize (),
145+ /* device_pixel_ratio=*/ 2 .0f );
146+ bool result = pipeline->Produce ().Complete (std::move (layer_tree));
147+ EXPECT_TRUE (result);
148+ auto no_discard = [](LayerTree&) { return false ; };
149+ rasterizer->Draw (pipeline, no_discard);
150+ latch.Signal ();
151+ });
152+ latch.Wait ();
153+ }
154+
155+ TEST (
156+ RasterizerTest,
157+ drawWithExternalViewEmbedderAndThreadMergerNotMergedExternalViewEmbedderSubmitFrameNotCalled) {
158+ std::string test_name =
159+ ::testing::UnitTest::GetInstance ()->current_test_info()->name();
160+ ThreadHost thread_host (" io.flutter.test." + test_name + " ." ,
161+ ThreadHost::Type::Platform | ThreadHost::Type::GPU |
162+ ThreadHost::Type::IO | ThreadHost::Type::UI);
163+ TaskRunners task_runners (" test" , thread_host.platform_thread ->GetTaskRunner (),
164+ thread_host.raster_thread ->GetTaskRunner (),
165+ thread_host.ui_thread ->GetTaskRunner (),
166+ thread_host.io_thread ->GetTaskRunner ());
167+ MockDelegate delegate;
168+ EXPECT_CALL (delegate, GetTaskRunners ())
169+ .WillRepeatedly (ReturnRef (task_runners));
170+ EXPECT_CALL (delegate, OnFrameRasterized (_));
171+ auto rasterizer = std::make_unique<Rasterizer>(delegate);
172+ auto surface = std::make_unique<MockSurface>();
173+ MockExternalViewEmbedder external_view_embedder;
174+ EXPECT_CALL (*surface, GetExternalViewEmbedder ())
175+ .WillRepeatedly (Return (&external_view_embedder));
176+ EXPECT_CALL (external_view_embedder, SupportsDynamicThreadMerging)
177+ .WillRepeatedly (Return (true ));
178+ auto surface_frame = std::make_unique<SurfaceFrame>(
179+ /* surface=*/ nullptr , /* supports_readback=*/ true ,
180+ /* submit_callback=*/ [](const SurfaceFrame&, SkCanvas*) { return true ; });
181+ EXPECT_CALL (*surface, AcquireFrame (SkISize ()))
182+ .WillOnce (Return (ByMove (std::move (surface_frame))));
183+
117184 EXPECT_CALL (external_view_embedder,
118- EndFrame (false , fml::RefPtr<fml::RasterThreadMerger>(nullptr )));
185+ BeginFrame (/* frame_size=*/ SkISize (), /* context=*/ nullptr ,
186+ /* device_pixel_ratio=*/ 2.0 ,
187+ /* raster_thread_merger=*/ _))
188+ .Times (1 );
189+ EXPECT_CALL (external_view_embedder, SubmitFrame).Times (0 );
190+ EXPECT_CALL (external_view_embedder, EndFrame (/* should_resubmit_frame=*/ false ,
191+ /* raster_thread_merger=*/ _))
192+ .Times (1 );
193+
119194 rasterizer->Setup (std::move (surface));
120195 fml::AutoResetWaitableEvent latch;
121196 thread_host.raster_thread ->GetTaskRunner ()->PostTask ([&] {
@@ -124,12 +199,66 @@ TEST(RasterizerTest, drawWithExternalViewEmbedder) {
124199 /* device_pixel_ratio=*/ 2 .0f );
125200 bool result = pipeline->Produce ().Complete (std::move (layer_tree));
126201 EXPECT_TRUE (result);
127- std::function<bool (LayerTree&)> no_discard = [](LayerTree&) {
128- return false ;
129- };
202+ auto no_discard = [](LayerTree&) { return false ; };
130203 rasterizer->Draw (pipeline, no_discard);
131204 latch.Signal ();
132205 });
133206 latch.Wait ();
134207}
208+
209+ TEST (
210+ RasterizerTest,
211+ drawWithExternalViewEmbedderAndThreadsMergedExternalViewEmbedderSubmitFrameCalled) {
212+ std::string test_name =
213+ ::testing::UnitTest::GetInstance ()->current_test_info()->name();
214+ ThreadHost thread_host (" io.flutter.test." + test_name + " ." ,
215+ ThreadHost::Type::Platform | ThreadHost::Type::GPU |
216+ ThreadHost::Type::IO | ThreadHost::Type::UI);
217+ fml::MessageLoop::EnsureInitializedForCurrentThread ();
218+ TaskRunners task_runners (" test" ,
219+ fml::MessageLoop::GetCurrent ().GetTaskRunner (),
220+ fml::MessageLoop::GetCurrent ().GetTaskRunner (),
221+ thread_host.ui_thread ->GetTaskRunner (),
222+ thread_host.io_thread ->GetTaskRunner ());
223+
224+ MockDelegate delegate;
225+ EXPECT_CALL (delegate, GetTaskRunners ())
226+ .WillRepeatedly (ReturnRef (task_runners));
227+ EXPECT_CALL (delegate, OnFrameRasterized (_));
228+
229+ auto rasterizer = std::make_unique<Rasterizer>(delegate);
230+ auto surface = std::make_unique<MockSurface>();
231+
232+ MockExternalViewEmbedder external_view_embedder;
233+ EXPECT_CALL (*surface, GetExternalViewEmbedder ())
234+ .WillRepeatedly (Return (&external_view_embedder));
235+
236+ auto surface_frame = std::make_unique<SurfaceFrame>(
237+ /* surface=*/ nullptr , /* supports_readback=*/ true ,
238+ /* submit_callback=*/ [](const SurfaceFrame&, SkCanvas*) { return true ; });
239+ EXPECT_CALL (*surface, AcquireFrame (SkISize ()))
240+ .WillOnce (Return (ByMove (std::move (surface_frame))));
241+ EXPECT_CALL (external_view_embedder, SupportsDynamicThreadMerging)
242+ .WillRepeatedly (Return (true ));
243+
244+ EXPECT_CALL (external_view_embedder,
245+ BeginFrame (/* frame_size=*/ SkISize (), /* context=*/ nullptr ,
246+ /* device_pixel_ratio=*/ 2.0 ,
247+ /* raster_thread_merger=*/ _))
248+ .Times (1 );
249+ EXPECT_CALL (external_view_embedder, SubmitFrame).Times (1 );
250+ EXPECT_CALL (external_view_embedder, EndFrame (/* should_resubmit_frame=*/ false ,
251+ /* raster_thread_merger=*/ _))
252+ .Times (1 );
253+
254+ rasterizer->Setup (std::move (surface));
255+
256+ auto pipeline = fml::AdoptRef (new Pipeline<LayerTree>(/* depth=*/ 10 ));
257+ auto layer_tree = std::make_unique<LayerTree>(/* frame_size=*/ SkISize (),
258+ /* device_pixel_ratio=*/ 2 .0f );
259+ bool result = pipeline->Produce ().Complete (std::move (layer_tree));
260+ EXPECT_TRUE (result);
261+ auto no_discard = [](LayerTree&) { return false ; };
262+ rasterizer->Draw (pipeline, no_discard);
263+ }
135264} // namespace flutter
0 commit comments