Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 8c93994

Browse files
committed
[Windows] Move EGL surface creation
1 parent d44462a commit 8c93994

File tree

3 files changed

+69
-40
lines changed

3 files changed

+69
-40
lines changed

shell/platform/windows/flutter_windows.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ static FlutterDesktopViewControllerRef CreateViewController(
9696
auto controller = std::make_unique<flutter::FlutterWindowsViewController>(
9797
std::move(engine), std::move(view));
9898

99-
controller->view()->CreateRenderSurface();
99+
// Launch the engine if it is not running already.
100100
if (!controller->engine()->running()) {
101101
if (!controller->engine()->Run()) {
102102
return nullptr;

shell/platform/windows/flutter_windows_engine.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,8 @@ std::unique_ptr<FlutterWindowsView> FlutterWindowsEngine::CreateView(
497497
auto view = std::make_unique<FlutterWindowsView>(
498498
kImplicitViewId, this, std::move(window), windows_proc_table_);
499499

500+
view->CreateRenderSurface();
501+
500502
views_[kImplicitViewId] = view.get();
501503

502504
return std::move(view);

shell/platform/windows/flutter_windows_view_unittests.cc

Lines changed: 66 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ std::unique_ptr<FlutterWindowsEngine> GetTestEngine(
8787
GetTestProject(), std::move(windows_proc_table));
8888

8989
EngineModifier modifier(engine.get());
90+
modifier.SetEGLManager(nullptr);
9091

9192
auto key_response_controller = std::make_shared<MockKeyResponseController>();
9293
key_response_controller->SetChannelResponse(
@@ -243,25 +244,38 @@ TEST(FlutterWindowsViewTest, Shutdown) {
243244
std::make_unique<NiceMock<MockWindowBindingHandler>>();
244245
auto egl_manager = std::make_unique<egl::MockManager>();
245246
auto surface = std::make_unique<egl::MockWindowSurface>();
247+
egl::MockContext render_context;
246248

247249
auto engine_ptr = engine.get();
248250
auto surface_ptr = surface.get();
251+
auto egl_manager_ptr = egl_manager.get();
249252

250253
EngineModifier modifier{engine.get()};
251254
modifier.SetEGLManager(std::move(egl_manager));
252255

256+
InSequence s;
257+
std::unique_ptr<FlutterWindowsView> view;
258+
259+
// Mock render surface initialization.
253260
{
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+
}
256273

274+
// The view must be removed before the surface can be destroyed.
275+
{
257276
auto view_id = view->view_id();
258-
ViewModifier view_modifier{view.get()};
259-
view_modifier.SetSurface(std::move(surface));
260-
261277
FlutterWindowsViewController controller{std::move(engine), std::move(view)};
262278

263-
// The view must be removed before the surface can be destroyed.
264-
InSequence s;
265279
EXPECT_CALL(*engine_ptr, running).WillOnce(Return(true));
266280
EXPECT_CALL(*engine_ptr, RemoveView(view_id)).Times(1);
267281
EXPECT_CALL(*engine_ptr, running).WillOnce(Return(true));
@@ -843,11 +857,22 @@ TEST(FlutterWindowsViewTest, WindowResizeTests) {
843857
auto egl_manager = std::make_unique<egl::MockManager>();
844858
auto surface = std::make_unique<egl::MockWindowSurface>();
845859
auto resized_surface = std::make_unique<egl::MockWindowSurface>();
860+
egl::MockContext render_context;
861+
862+
auto surface_ptr = surface.get();
846863
auto resized_surface_ptr = resized_surface.get();
847864

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));
850873

874+
// Mock render surface resize
875+
EXPECT_CALL(*surface_ptr, Destroy).WillOnce(Return(true));
851876
EXPECT_CALL(*egl_manager.get(),
852877
CreateWindowSurface(_, /*width=*/500, /*height=*/500))
853878
.WillOnce(Return(std::move((resized_surface))));
@@ -862,9 +887,6 @@ TEST(FlutterWindowsViewTest, WindowResizeTests) {
862887
std::unique_ptr<FlutterWindowsView> view = engine->CreateView(
863888
std::make_unique<NiceMock<MockWindowBindingHandler>>());
864889

865-
ViewModifier view_modifier{view.get()};
866-
view_modifier.SetSurface(std::move(surface));
867-
868890
fml::AutoResetWaitableEvent metrics_sent_latch;
869891
engine_modifier.embedder_api().SendWindowMetricsEvent = MOCK_ENGINE_PROC(
870892
SendWindowMetricsEvent,
@@ -1441,8 +1463,6 @@ TEST(FlutterWindowsViewTest, DisablesVSyncAtStartup) {
14411463

14421464
std::unique_ptr<FlutterWindowsView> view = engine->CreateView(
14431465
std::make_unique<NiceMock<MockWindowBindingHandler>>());
1444-
1445-
view->CreateRenderSurface();
14461466
}
14471467

14481468
// Blocks until the v-blank if it is enabled by the window.
@@ -1478,8 +1498,6 @@ TEST(FlutterWindowsViewTest, EnablesVSyncAtStartup) {
14781498

14791499
std::unique_ptr<FlutterWindowsView> view = engine->CreateView(
14801500
std::make_unique<NiceMock<MockWindowBindingHandler>>());
1481-
1482-
view->CreateRenderSurface();
14831501
}
14841502

14851503
// Don't block until the v-blank if it is disabled by the window.
@@ -1523,8 +1541,6 @@ TEST(FlutterWindowsViewTest, DisablesVSyncAfterStartup) {
15231541

15241542
std::unique_ptr<FlutterWindowsView> view = engine->CreateView(
15251543
std::make_unique<NiceMock<MockWindowBindingHandler>>());
1526-
1527-
view->CreateRenderSurface();
15281544
}
15291545

15301546
// Blocks until the v-blank if it is enabled by the window.
@@ -1571,8 +1587,6 @@ TEST(FlutterWindowsViewTest, EnablesVSyncAfterStartup) {
15711587

15721588
std::unique_ptr<FlutterWindowsView> view = engine->CreateView(
15731589
std::make_unique<NiceMock<MockWindowBindingHandler>>());
1574-
1575-
view->CreateRenderSurface();
15761590
}
15771591

15781592
// Desktop Window Manager composition can be disabled on Windows 7.
@@ -1594,36 +1608,49 @@ TEST(FlutterWindowsViewTest, UpdatesVSyncOnDwmUpdates) {
15941608
return true;
15951609
});
15961610

1597-
EXPECT_CALL(*windows_proc_table.get(), DwmIsCompositionEnabled)
1598-
.WillOnce(Return(false))
1599-
.WillOnce(Return(true));
1600-
16011611
EXPECT_CALL(*egl_manager.get(), render_context)
16021612
.WillRepeatedly(Return(&render_context));
16031613

16041614
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));
16051618

16061619
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));
16101620

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));
16141629

1615-
EXPECT_CALL(*surface_ptr, Destroy).Times(1);
1630+
EngineModifier engine_modifier{engine.get()};
1631+
engine_modifier.SetEGLManager(std::move(egl_manager));
16161632

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+
}
16191636

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));
16241642

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+
}
16271654
}
16281655

16291656
} // namespace testing

0 commit comments

Comments
 (0)