@@ -87,6 +87,7 @@ std::unique_ptr<FlutterWindowsEngine> GetTestEngine(
87
87
GetTestProject (), std::move (windows_proc_table));
88
88
89
89
EngineModifier modifier (engine.get ());
90
+ modifier.SetEGLManager (nullptr );
90
91
91
92
auto key_response_controller = std::make_shared<MockKeyResponseController>();
92
93
key_response_controller->SetChannelResponse (
@@ -243,25 +244,38 @@ TEST(FlutterWindowsViewTest, Shutdown) {
243
244
std::make_unique<NiceMock<MockWindowBindingHandler>>();
244
245
auto egl_manager = std::make_unique<egl::MockManager>();
245
246
auto surface = std::make_unique<egl::MockWindowSurface>();
247
+ egl::MockContext render_context;
246
248
247
249
auto engine_ptr = engine.get ();
248
250
auto surface_ptr = surface.get ();
251
+ auto egl_manager_ptr = egl_manager.get ();
249
252
250
253
EngineModifier modifier{engine.get ()};
251
254
modifier.SetEGLManager (std::move (egl_manager));
252
255
256
+ InSequence s;
257
+ std::unique_ptr<FlutterWindowsView> view;
258
+
259
+ // Mock render surface initialization.
253
260
{
254
- std::unique_ptr<FlutterWindowsView> view =
255
- engine->CreateView (std::move (window_binding_handler));
261
+ EXPECT_CALL (*egl_manager_ptr, CreateWindowSurface)
262
+ .WillOnce (Return (std::move (surface)));
263
+ EXPECT_CALL (*engine_ptr, running).WillOnce (Return (false ));
264
+ EXPECT_CALL (*surface_ptr, IsValid).WillOnce (Return (true ));
265
+ EXPECT_CALL (*surface_ptr, MakeCurrent).WillOnce (Return (true ));
266
+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled).WillOnce (Return (true ));
267
+ EXPECT_CALL (*egl_manager_ptr, render_context)
268
+ .WillOnce (Return (&render_context));
269
+ EXPECT_CALL (render_context, ClearCurrent).WillOnce (Return (true ));
270
+
271
+ view = engine->CreateView (std::move (window_binding_handler));
272
+ }
256
273
274
+ // The view must be removed before the surface can be destroyed.
275
+ {
257
276
auto view_id = view->view_id ();
258
- ViewModifier view_modifier{view.get ()};
259
- view_modifier.SetSurface (std::move (surface));
260
-
261
277
FlutterWindowsViewController controller{std::move (engine), std::move (view)};
262
278
263
- // The view must be removed before the surface can be destroyed.
264
- InSequence s;
265
279
EXPECT_CALL (*engine_ptr, running).WillOnce (Return (true ));
266
280
EXPECT_CALL (*engine_ptr, RemoveView (view_id)).Times (1 );
267
281
EXPECT_CALL (*engine_ptr, running).WillOnce (Return (true ));
@@ -843,11 +857,22 @@ TEST(FlutterWindowsViewTest, WindowResizeTests) {
843
857
auto egl_manager = std::make_unique<egl::MockManager>();
844
858
auto surface = std::make_unique<egl::MockWindowSurface>();
845
859
auto resized_surface = std::make_unique<egl::MockWindowSurface>();
860
+ egl::MockContext render_context;
861
+
862
+ auto surface_ptr = surface.get ();
846
863
auto resized_surface_ptr = resized_surface.get ();
847
864
848
- EXPECT_CALL (*surface.get (), IsValid).WillRepeatedly (Return (true ));
849
- EXPECT_CALL (*surface.get (), Destroy).WillOnce (Return (true ));
865
+ // Mock render surface creation
866
+ EXPECT_CALL (*egl_manager, CreateWindowSurface)
867
+ .WillOnce (Return (std::move (surface)));
868
+ EXPECT_CALL (*surface_ptr, IsValid).WillRepeatedly (Return (true ));
869
+ EXPECT_CALL (*surface_ptr, MakeCurrent).WillOnce (Return (true ));
870
+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled).WillOnce (Return (true ));
871
+ EXPECT_CALL (*egl_manager, render_context).WillOnce (Return (&render_context));
872
+ EXPECT_CALL (render_context, ClearCurrent).WillOnce (Return (true ));
850
873
874
+ // Mock render surface resize
875
+ EXPECT_CALL (*surface_ptr, Destroy).WillOnce (Return (true ));
851
876
EXPECT_CALL (*egl_manager.get (),
852
877
CreateWindowSurface (_, /* width=*/ 500 , /* height=*/ 500 ))
853
878
.WillOnce (Return (std::move ((resized_surface))));
@@ -862,9 +887,6 @@ TEST(FlutterWindowsViewTest, WindowResizeTests) {
862
887
std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
863
888
std::make_unique<NiceMock<MockWindowBindingHandler>>());
864
889
865
- ViewModifier view_modifier{view.get ()};
866
- view_modifier.SetSurface (std::move (surface));
867
-
868
890
fml::AutoResetWaitableEvent metrics_sent_latch;
869
891
engine_modifier.embedder_api ().SendWindowMetricsEvent = MOCK_ENGINE_PROC (
870
892
SendWindowMetricsEvent,
@@ -1441,8 +1463,6 @@ TEST(FlutterWindowsViewTest, DisablesVSyncAtStartup) {
1441
1463
1442
1464
std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
1443
1465
std::make_unique<NiceMock<MockWindowBindingHandler>>());
1444
-
1445
- view->CreateRenderSurface ();
1446
1466
}
1447
1467
1448
1468
// Blocks until the v-blank if it is enabled by the window.
@@ -1478,8 +1498,6 @@ TEST(FlutterWindowsViewTest, EnablesVSyncAtStartup) {
1478
1498
1479
1499
std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
1480
1500
std::make_unique<NiceMock<MockWindowBindingHandler>>());
1481
-
1482
- view->CreateRenderSurface ();
1483
1501
}
1484
1502
1485
1503
// Don't block until the v-blank if it is disabled by the window.
@@ -1523,8 +1541,6 @@ TEST(FlutterWindowsViewTest, DisablesVSyncAfterStartup) {
1523
1541
1524
1542
std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
1525
1543
std::make_unique<NiceMock<MockWindowBindingHandler>>());
1526
-
1527
- view->CreateRenderSurface ();
1528
1544
}
1529
1545
1530
1546
// Blocks until the v-blank if it is enabled by the window.
@@ -1571,8 +1587,6 @@ TEST(FlutterWindowsViewTest, EnablesVSyncAfterStartup) {
1571
1587
1572
1588
std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
1573
1589
std::make_unique<NiceMock<MockWindowBindingHandler>>());
1574
-
1575
- view->CreateRenderSurface ();
1576
1590
}
1577
1591
1578
1592
// Desktop Window Manager composition can be disabled on Windows 7.
@@ -1594,36 +1608,49 @@ TEST(FlutterWindowsViewTest, UpdatesVSyncOnDwmUpdates) {
1594
1608
return true ;
1595
1609
});
1596
1610
1597
- EXPECT_CALL (*windows_proc_table.get (), DwmIsCompositionEnabled)
1598
- .WillOnce (Return (false ))
1599
- .WillOnce (Return (true ));
1600
-
1601
1611
EXPECT_CALL (*egl_manager.get (), render_context)
1602
1612
.WillRepeatedly (Return (&render_context));
1603
1613
1604
1614
EXPECT_CALL (*surface_ptr, IsValid).WillRepeatedly (Return (true ));
1615
+ EXPECT_CALL (*surface_ptr, MakeCurrent).WillRepeatedly (Return (true ));
1616
+ EXPECT_CALL (*surface_ptr, Destroy).Times (1 );
1617
+ EXPECT_CALL (render_context, ClearCurrent).WillRepeatedly (Return (true ));
1605
1618
1606
1619
InSequence s;
1607
- EXPECT_CALL (*surface_ptr, MakeCurrent).WillOnce (Return (true ));
1608
- EXPECT_CALL (*surface_ptr, SetVSyncEnabled (true )).WillOnce (Return (true ));
1609
- EXPECT_CALL (render_context, ClearCurrent).WillOnce (Return (true ));
1610
1620
1611
- EXPECT_CALL (*surface_ptr, MakeCurrent).WillOnce (Return (true ));
1612
- EXPECT_CALL (*surface_ptr, SetVSyncEnabled (false )).WillOnce (Return (true ));
1613
- EXPECT_CALL (render_context, ClearCurrent).WillOnce (Return (true ));
1621
+ // Mock render surface initialization.
1622
+ std::unique_ptr<FlutterWindowsView> view;
1623
+ {
1624
+ EXPECT_CALL (*egl_manager, CreateWindowSurface)
1625
+ .WillOnce (Return (std::move (surface)));
1626
+ EXPECT_CALL (*windows_proc_table.get (), DwmIsCompositionEnabled)
1627
+ .WillOnce (Return (true ));
1628
+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled).WillOnce (Return (true ));
1614
1629
1615
- EXPECT_CALL (*surface_ptr, Destroy).Times (1 );
1630
+ EngineModifier engine_modifier{engine.get ()};
1631
+ engine_modifier.SetEGLManager (std::move (egl_manager));
1616
1632
1617
- EngineModifier engine_modifier{engine.get ()};
1618
- engine_modifier.SetEGLManager (std::move (egl_manager));
1633
+ view = engine->CreateView (
1634
+ std::make_unique<NiceMock<MockWindowBindingHandler>>());
1635
+ }
1619
1636
1620
- std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
1621
- std::make_unique<NiceMock<MockWindowBindingHandler>>());
1622
- ViewModifier view_modifier{view.get ()};
1623
- view_modifier.SetSurface (std::move (surface));
1637
+ // Disabling DWM composition should enable vsync blocking on the surface.
1638
+ {
1639
+ EXPECT_CALL (*windows_proc_table.get (), DwmIsCompositionEnabled)
1640
+ .WillOnce (Return (false ));
1641
+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled (true )).WillOnce (Return (true ));
1624
1642
1625
- engine->OnDwmCompositionChanged ();
1626
- engine->OnDwmCompositionChanged ();
1643
+ engine->OnDwmCompositionChanged ();
1644
+ }
1645
+
1646
+ // Enabling DWM composition should disable vsync blocking on the surface.
1647
+ {
1648
+ EXPECT_CALL (*windows_proc_table.get (), DwmIsCompositionEnabled)
1649
+ .WillOnce (Return (true ));
1650
+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled (false )).WillOnce (Return (true ));
1651
+
1652
+ engine->OnDwmCompositionChanged ();
1653
+ }
1627
1654
}
1628
1655
1629
1656
} // namespace testing
0 commit comments