8 #include "flutter/impeller/renderer/backend/gles/gles.h"
12 #include "flutter/shell/platform/windows/testing/egl/mock_context.h"
13 #include "flutter/shell/platform/windows/testing/egl/mock_manager.h"
14 #include "flutter/shell/platform/windows/testing/egl/mock_window_surface.h"
15 #include "flutter/shell/platform/windows/testing/engine_modifier.h"
16 #include "flutter/shell/platform/windows/testing/flutter_windows_engine_builder.h"
17 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
18 #include "flutter/shell/platform/windows/testing/view_modifier.h"
19 #include "flutter/shell/platform/windows/testing/windows_test.h"
20 #include "gmock/gmock.h"
21 #include "gtest/gtest.h"
27 using ::testing::AnyNumber;
28 using ::testing::Return;
30 const unsigned char* MockGetString(GLenum name) {
33 case GL_SHADING_LANGUAGE_VERSION:
34 return reinterpret_cast<const unsigned char*
>(
"3.0");
36 return reinterpret_cast<const unsigned char*
>(
"");
40 void MockGetIntegerv(GLenum name,
int* value) {
44 GLenum MockGetError() {
50 const impeller::ProcTableGLES::Resolver kMockResolver = [](
const char* name) {
51 std::string function_name{name};
53 if (function_name ==
"glGetString") {
54 return reinterpret_cast<void*
>(&MockGetString);
55 }
else if (function_name ==
"glGetIntegerv") {
56 return reinterpret_cast<void*
>(&MockGetIntegerv);
57 }
else if (function_name ==
"glGetError") {
58 return reinterpret_cast<void*
>(&MockGetError);
60 return reinterpret_cast<void*
>(&DoNothing);
64 class CompositorOpenGLTest :
public WindowsTest {
66 CompositorOpenGLTest() =
default;
67 virtual ~CompositorOpenGLTest() =
default;
70 FlutterWindowsEngine* engine() {
return engine_.get(); }
71 egl::MockManager* egl_manager() {
return egl_manager_; }
72 egl::MockContext* render_context() {
return render_context_.get(); }
73 egl::MockWindowSurface* surface() {
return surface_; }
75 void UseHeadlessEngine() {
76 auto egl_manager = std::make_unique<egl::MockManager>();
77 render_context_ = std::make_unique<egl::MockContext>();
78 egl_manager_ = egl_manager.get();
80 EXPECT_CALL(*egl_manager_, render_context)
82 .WillRepeatedly(Return(render_context_.get()));
84 FlutterWindowsEngineBuilder builder{GetContext()};
86 engine_ = builder.Build();
87 EngineModifier modifier{engine_.get()};
88 modifier.SetEGLManager(std::move(egl_manager));
91 void UseEngineWithView(
bool add_surface =
true) {
94 auto window = std::make_unique<MockWindowBindingHandler>();
95 EXPECT_CALL(*window.get(), SetView).Times(1);
96 EXPECT_CALL(*window.get(), GetWindowHandle).WillRepeatedly(Return(
nullptr));
98 view_ = std::make_unique<FlutterWindowsView>(
kImplicitViewId, engine_.get(),
102 auto surface = std::make_unique<egl::MockWindowSurface>();
103 surface_ = surface.get();
105 EXPECT_CALL(*surface_, Destroy).Times(AnyNumber());
107 ViewModifier modifier{view_.get()};
108 modifier.SetSurface(std::move(surface));
111 EngineModifier modifier{engine_.get()};
112 modifier.SetImplicitView(view_.get());
116 std::unique_ptr<FlutterWindowsEngine> engine_;
117 std::unique_ptr<FlutterWindowsView> view_;
118 std::unique_ptr<egl::MockContext> render_context_;
119 egl::MockWindowSurface* surface_;
120 egl::MockManager* egl_manager_;
122 FML_DISALLOW_COPY_AND_ASSIGN(CompositorOpenGLTest);
127 TEST_F(CompositorOpenGLTest, CreateBackingStore) {
132 FlutterBackingStoreConfig config = {};
133 FlutterBackingStore backing_store = {};
135 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
136 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
137 ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
140 TEST_F(CompositorOpenGLTest, InitializationFailure) {
145 FlutterBackingStoreConfig config = {};
146 FlutterBackingStore backing_store = {};
148 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
false));
149 EXPECT_FALSE(compositor.CreateBackingStore(config, &backing_store));
157 FlutterBackingStoreConfig config = {};
158 FlutterBackingStore backing_store = {};
160 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
161 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
163 FlutterLayer layer = {};
164 layer.type = kFlutterLayerContentTypeBackingStore;
165 layer.backing_store = &backing_store;
166 const FlutterLayer* layer_ptr = &layer;
168 EXPECT_CALL(*surface(), IsValid).WillRepeatedly(Return(
true));
169 EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(
true));
170 EXPECT_CALL(*surface(), SwapBuffers).WillOnce(Return(
true));
171 EXPECT_TRUE(compositor.Present(&layer_ptr, 1));
173 ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
176 TEST_F(CompositorOpenGLTest, PresentEmpty) {
183 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
184 EXPECT_CALL(*surface(), IsValid).WillRepeatedly(Return(
true));
185 EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(
true));
186 EXPECT_CALL(*surface(), SwapBuffers).WillOnce(Return(
true));
187 EXPECT_TRUE(compositor.Present(
nullptr, 0));
190 TEST_F(CompositorOpenGLTest, HeadlessPresentIgnored) {
195 FlutterBackingStoreConfig config = {};
196 FlutterBackingStore backing_store = {};
198 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
199 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
201 FlutterLayer layer = {};
202 layer.type = kFlutterLayerContentTypeBackingStore;
203 layer.backing_store = &backing_store;
204 const FlutterLayer* layer_ptr = &layer;
206 EXPECT_FALSE(compositor.Present(&layer_ptr, 1));
208 ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
211 TEST_F(CompositorOpenGLTest, NoSurfaceIgnored) {
212 UseEngineWithView(
false);
216 FlutterBackingStoreConfig config = {};
217 FlutterBackingStore backing_store = {};
219 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
220 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
222 FlutterLayer layer = {};
223 layer.type = kFlutterLayerContentTypeBackingStore;
224 layer.backing_store = &backing_store;
225 const FlutterLayer* layer_ptr = &layer;
227 EXPECT_FALSE(compositor.Present(&layer_ptr, 1));