Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion shell/platform/windows/compositor.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ class Compositor {
virtual bool CollectBackingStore(const FlutterBackingStore* store) = 0;

// Present Flutter content and platform views onto the view.
virtual bool Present(const FlutterLayer** layers, size_t layers_count) = 0;
virtual bool Present(FlutterViewId view_id,
const FlutterLayer** layers,
size_t layers_count) = 0;
};

} // namespace flutter
Expand Down
7 changes: 3 additions & 4 deletions shell/platform/windows/compositor_opengl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,10 @@ bool CompositorOpenGL::CollectBackingStore(const FlutterBackingStore* store) {
return true;
}

bool CompositorOpenGL::Present(const FlutterLayer** layers,
bool CompositorOpenGL::Present(FlutterViewId view_id,
const FlutterLayer** layers,
size_t layers_count) {
// TODO(loicsharma): Remove implicit view assumption.
// https://github.com/flutter/flutter/issues/142845
FlutterWindowsView* view = engine_->view(kImplicitViewId);
FlutterWindowsView* view = engine_->view(view_id);
if (!view) {
return false;
}
Expand Down
4 changes: 3 additions & 1 deletion shell/platform/windows/compositor_opengl.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ class CompositorOpenGL : public Compositor {
bool CollectBackingStore(const FlutterBackingStore* store) override;

/// |Compositor|
bool Present(const FlutterLayer** layers, size_t layers_count) override;
bool Present(FlutterViewId view_id,
const FlutterLayer** layers,
size_t layers_count) override;

private:
// The Flutter engine that manages the views to render.
Expand Down
36 changes: 32 additions & 4 deletions shell/platform/windows/compositor_opengl_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class CompositorOpenGLTest : public WindowsTest {

protected:
FlutterWindowsEngine* engine() { return engine_.get(); }
FlutterWindowsView* view() { return view_.get(); }
egl::MockManager* egl_manager() { return egl_manager_; }
egl::MockContext* render_context() { return render_context_.get(); }
egl::MockWindowSurface* surface() { return surface_; }
Expand Down Expand Up @@ -168,7 +169,7 @@ TEST_F(CompositorOpenGLTest, Present) {
EXPECT_CALL(*surface(), IsValid).WillRepeatedly(Return(true));
EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(true));
EXPECT_CALL(*surface(), SwapBuffers).WillOnce(Return(true));
EXPECT_TRUE(compositor.Present(&layer_ptr, 1));
EXPECT_TRUE(compositor.Present(view()->view_id(), &layer_ptr, 1));

ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
}
Expand All @@ -184,7 +185,7 @@ TEST_F(CompositorOpenGLTest, PresentEmpty) {
EXPECT_CALL(*surface(), IsValid).WillRepeatedly(Return(true));
EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(true));
EXPECT_CALL(*surface(), SwapBuffers).WillOnce(Return(true));
EXPECT_TRUE(compositor.Present(nullptr, 0));
EXPECT_TRUE(compositor.Present(view()->view_id(), nullptr, 0));
}

TEST_F(CompositorOpenGLTest, HeadlessPresentIgnored) {
Expand All @@ -203,7 +204,32 @@ TEST_F(CompositorOpenGLTest, HeadlessPresentIgnored) {
layer.backing_store = &backing_store;
const FlutterLayer* layer_ptr = &layer;

EXPECT_FALSE(compositor.Present(&layer_ptr, 1));
EXPECT_FALSE(compositor.Present(kImplicitViewId, &layer_ptr, 1));

ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
}

TEST_F(CompositorOpenGLTest, UnknownViewIgnored) {
UseEngineWithView();

auto compositor = CompositorOpenGL{engine(), kMockResolver};

FlutterBackingStoreConfig config = {};
FlutterBackingStore backing_store = {};

EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(true));
ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));

FlutterLayer layer = {};
layer.type = kFlutterLayerContentTypeBackingStore;
layer.backing_store = &backing_store;
const FlutterLayer* layer_ptr = &layer;

FlutterViewId unknown_view_id = 123;
ASSERT_NE(view()->view_id(), unknown_view_id);
ASSERT_EQ(engine()->view(unknown_view_id), nullptr);

EXPECT_FALSE(compositor.Present(unknown_view_id, &layer_ptr, 1));

ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
}
Expand All @@ -224,7 +250,9 @@ TEST_F(CompositorOpenGLTest, NoSurfaceIgnored) {
layer.backing_store = &backing_store;
const FlutterLayer* layer_ptr = &layer;

EXPECT_FALSE(compositor.Present(&layer_ptr, 1));
EXPECT_FALSE(compositor.Present(view()->view_id(), &layer_ptr, 1));

ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
}

} // namespace testing
Expand Down
7 changes: 3 additions & 4 deletions shell/platform/windows/compositor_software.cc
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,10 @@ bool CompositorSoftware::CollectBackingStore(const FlutterBackingStore* store) {
return true;
}

bool CompositorSoftware::Present(const FlutterLayer** layers,
bool CompositorSoftware::Present(FlutterViewId view_id,
const FlutterLayer** layers,
size_t layers_count) {
// TODO(loicsharma): Remove implicit view assumption.
// https://github.com/flutter/flutter/issues/142845
FlutterWindowsView* view = engine_->view(kImplicitViewId);
FlutterWindowsView* view = engine_->view(view_id);
if (!view) {
return false;
}
Expand Down
4 changes: 3 additions & 1 deletion shell/platform/windows/compositor_software.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ class CompositorSoftware : public Compositor {
bool CollectBackingStore(const FlutterBackingStore* store) override;

/// |Compositor|
bool Present(const FlutterLayer** layers, size_t layers_count) override;
bool Present(FlutterViewId view_id,
const FlutterLayer** layers,
size_t layers_count) override;

private:
FlutterWindowsEngine* engine_;
Expand Down
30 changes: 27 additions & 3 deletions shell/platform/windows/compositor_software_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ TEST_F(CompositorSoftwareTest, Present) {
const FlutterLayer* layer_ptr = &layer;

EXPECT_CALL(*view(), PresentSoftwareBitmap).WillOnce(Return(true));
EXPECT_TRUE(compositor.Present(&layer_ptr, 1));
EXPECT_TRUE(compositor.Present(view()->view_id(), &layer_ptr, 1));

ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
}
Expand All @@ -115,7 +115,31 @@ TEST_F(CompositorSoftwareTest, PresentEmpty) {
auto compositor = CompositorSoftware{engine()};

EXPECT_CALL(*view(), ClearSoftwareBitmap).WillOnce(Return(true));
EXPECT_TRUE(compositor.Present(nullptr, 0));
EXPECT_TRUE(compositor.Present(view()->view_id(), nullptr, 0));
}

TEST_F(CompositorSoftwareTest, UnknownViewIgnored) {
UseEngineWithView();

auto compositor = CompositorSoftware{engine()};

FlutterBackingStoreConfig config = {};
FlutterBackingStore backing_store = {};

ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));

FlutterLayer layer = {};
layer.type = kFlutterLayerContentTypeBackingStore;
layer.backing_store = &backing_store;
const FlutterLayer* layer_ptr = &layer;

FlutterViewId unknown_view_id = 123;
ASSERT_NE(view()->view_id(), unknown_view_id);
ASSERT_EQ(engine()->view(unknown_view_id), nullptr);

EXPECT_FALSE(compositor.Present(unknown_view_id, &layer_ptr, 1));

ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
}

TEST_F(CompositorSoftwareTest, HeadlessPresentIgnored) {
Expand All @@ -133,7 +157,7 @@ TEST_F(CompositorSoftwareTest, HeadlessPresentIgnored) {
layer.backing_store = &backing_store;
const FlutterLayer* layer_ptr = &layer;

EXPECT_FALSE(compositor.Present(&layer_ptr, 1));
EXPECT_FALSE(compositor.Present(kImplicitViewId, &layer_ptr, 1));

ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
}
Expand Down
10 changes: 5 additions & 5 deletions shell/platform/windows/flutter_windows_engine.cc
Original file line number Diff line number Diff line change
Expand Up @@ -414,12 +414,12 @@ bool FlutterWindowsEngine::Run(std::string_view entrypoint) {
return host->compositor_->CollectBackingStore(backing_store);
};

compositor.present_layers_callback = [](const FlutterLayer** layers,
size_t layers_count,
void* user_data) -> bool {
auto host = static_cast<FlutterWindowsEngine*>(user_data);
compositor.present_view_callback =
[](const FlutterPresentViewInfo* info) -> bool {
auto host = static_cast<FlutterWindowsEngine*>(info->user_data);

return host->compositor_->Present(layers, layers_count);
return host->compositor_->Present(info->view_id, info->layers,
info->layers_count);
};
args.compositor = &compositor;

Expand Down