20#include "gmock/gmock.h"
21#include "gtest/gtest.h"
27using ::testing::AnyNumber;
28using ::testing::Return;
30void MockGetIntegerv(GLenum
name,
int* value) {
31 if (
name == GL_NUM_EXTENSIONS) {
38const unsigned char* MockGetString(GLenum
name) {
41 case GL_SHADING_LANGUAGE_VERSION:
42 return reinterpret_cast<const unsigned char*
>(
"3.0");
44 return reinterpret_cast<const unsigned char*
>(
"");
48const unsigned char* MockGetStringi(GLenum
name,
int index) {
49 if (
name == GL_EXTENSIONS) {
50 return reinterpret_cast<const unsigned char*
>(
"GL_ANGLE_framebuffer_blit");
52 return reinterpret_cast<const unsigned char*
>(
"");
56GLenum MockGetError() {
63 std::string function_name{
name};
65 if (function_name ==
"glGetString") {
66 return reinterpret_cast<void*
>(&MockGetString);
67 }
else if (function_name ==
"glGetStringi") {
68 return reinterpret_cast<void*
>(&MockGetStringi);
69 }
else if (function_name ==
"glGetIntegerv") {
70 return reinterpret_cast<void*
>(&MockGetIntegerv);
71 }
else if (function_name ==
"glGetError") {
72 return reinterpret_cast<void*
>(&MockGetError);
74 return reinterpret_cast<void*
>(&DoNothing);
78class CompositorOpenGLTest :
public WindowsTest {
80 CompositorOpenGLTest() =
default;
81 virtual ~CompositorOpenGLTest() =
default;
84 FlutterWindowsEngine*
engine() {
return engine_.get(); }
85 FlutterWindowsView*
view() {
return view_.get(); }
86 egl::MockManager* egl_manager() {
return egl_manager_; }
87 egl::MockContext* render_context() {
return render_context_.get(); }
90 void UseHeadlessEngine() {
91 auto egl_manager = std::make_unique<egl::MockManager>();
92 render_context_ = std::make_unique<egl::MockContext>();
93 egl_manager_ = egl_manager.get();
95 EXPECT_CALL(*egl_manager_, render_context)
97 .WillRepeatedly(Return(render_context_.get()));
99 FlutterWindowsEngineBuilder builder{GetContext()};
101 engine_ = builder.Build();
102 EngineModifier modifier{engine_.get()};
103 modifier.SetEGLManager(std::move(egl_manager));
106 void UseEngineWithView(
bool add_surface =
true) {
109 auto window = std::make_unique<MockWindowBindingHandler>();
110 EXPECT_CALL(*
window.get(), SetView).Times(1);
111 EXPECT_CALL(*
window.get(), GetWindowHandle).WillRepeatedly(Return(
nullptr));
113 view_ = std::make_unique<FlutterWindowsView>(
kImplicitViewId, engine_.get(),
118 auto surface = std::make_unique<egl::MockWindowSurface>();
121 EXPECT_CALL(*surface_, Destroy).Times(AnyNumber());
123 ViewModifier modifier{view_.get()};
124 modifier.SetSurface(std::move(surface));
129 std::unique_ptr<FlutterWindowsEngine> engine_;
130 std::unique_ptr<FlutterWindowsView> view_;
131 std::unique_ptr<egl::MockContext> render_context_;
133 egl::MockManager* egl_manager_;
140TEST_F(CompositorOpenGLTest, CreateBackingStore) {
149 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
150 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
151 ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
154TEST_F(CompositorOpenGLTest, CreateBackingStoreImpeller) {
163 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
164 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
165 ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
168TEST_F(CompositorOpenGLTest, InitializationFailure) {
177 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
false));
178 EXPECT_FALSE(compositor.CreateBackingStore(config, &backing_store));
181TEST_F(CompositorOpenGLTest, InitializationRequiresBlit) {
185 std::string function_name{
name};
187 if (function_name ==
"glBlitFramebuffer" ||
188 function_name ==
"glBlitFramebufferANGLE") {
189 return (
void*)
nullptr;
192 return kMockResolver(
name);
201 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
202 ASSERT_FALSE(compositor.CreateBackingStore(config, &backing_store));
214 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
215 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
222 EXPECT_CALL(*
surface(), IsValid).WillRepeatedly(Return(
true));
223 EXPECT_CALL(*
surface(), MakeCurrent).WillOnce(Return(
true));
224 EXPECT_CALL(*
surface(), SwapBuffers).WillOnce(Return(
true));
225 EXPECT_TRUE(compositor.Present(
view(), &layer_ptr, 1));
227 ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
230TEST_F(CompositorOpenGLTest, PresentEmpty) {
238 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
239 EXPECT_CALL(*
surface(), IsValid).WillRepeatedly(Return(
true));
240 EXPECT_CALL(*
surface(), MakeCurrent).WillOnce(Return(
true));
241 EXPECT_CALL(*
surface(), SwapBuffers).WillOnce(Return(
true));
242 EXPECT_TRUE(compositor.Present(
view(),
nullptr, 0));
245TEST_F(CompositorOpenGLTest, NoSurfaceIgnored) {
246 UseEngineWithView(
false);
254 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
255 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
262 EXPECT_FALSE(compositor.Present(
view(), &layer_ptr, 1));
264 ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
267TEST_F(CompositorOpenGLTest, PresentUsingANGLEBlitExtension) {
270 bool resolved_ANGLE_blit =
false;
272 [&resolved_ANGLE_blit](
const char*
name) {
273 std::string function_name{
name};
275 if (function_name ==
"glBlitFramebuffer") {
276 return (
void*)
nullptr;
277 }
else if (function_name ==
"glBlitFramebufferANGLE") {
278 resolved_ANGLE_blit =
true;
279 return reinterpret_cast<void*
>(&DoNothing);
282 return kMockResolver(
name);
291 EXPECT_CALL(*render_context(), MakeCurrent).WillOnce(Return(
true));
292 ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
299 EXPECT_CALL(*
surface(), IsValid).WillRepeatedly(Return(
true));
300 EXPECT_CALL(*
surface(), MakeCurrent).WillOnce(Return(
true));
301 EXPECT_CALL(*
surface(), SwapBuffers).WillOnce(Return(
true));
302 EXPECT_TRUE(compositor.Present(
view(), &layer_ptr, 1));
303 EXPECT_TRUE(resolved_ANGLE_blit);
305 ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
std::function< void *(const char *function_name)> Resolver
@ kFlutterLayerContentTypeBackingStore
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
TEST_F(DisplayListTest, Defaults)
constexpr int64_t kImplicitViewId
DEF_SWITCHES_START aot vmservice shared library name
FlutterLayerContentType type
const FlutterBackingStore * backing_store