5 #include "gtest/gtest.h"
7 #include "flutter/common/constants.h"
8 #include "flutter/fml/logging.h"
10 #include "flutter/shell/platform/linux/testing/mock_epoxy.h"
11 #include "flutter/shell/platform/linux/testing/mock_renderer.h"
13 #include <epoxy/egl.h>
15 TEST(FlRendererTest, BackgroundColor) {
16 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
18 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
19 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30));
20 ON_CALL(epoxy, glGetString(GL_VENDOR))
22 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
23 EXPECT_CALL(epoxy, glClearColor(0.2, 0.3, 0.4, 0.5));
25 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
26 g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new();
29 flutter::kFlutterImplicitViewId,
30 FL_RENDERABLE(renderable));
32 FlutterBackingStoreConfig config = {
33 .struct_size =
sizeof(FlutterBackingStoreConfig),
34 .size = {.width = 1024, .height = 1024}};
35 FlutterBackingStore backing_store;
38 const FlutterLayer layer0 = {.struct_size =
sizeof(FlutterLayer),
39 .
type = kFlutterLayerContentTypeBackingStore,
40 .backing_store = &backing_store,
41 .size = {.width = 1024, .height = 1024}};
42 const FlutterLayer* layers[] = {&layer0};
44 flutter::kFlutterImplicitViewId, layers, 1);
45 GdkRGBA background_color = {
46 .red = 0.2, .green = 0.3, .blue = 0.4, .alpha = 0.5};
48 1024, 1024, &background_color);
51 TEST(FlRendererTest, RestoresGLState) {
52 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
54 constexpr
int kWidth = 100;
55 constexpr
int kHeight = 100;
57 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
58 g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new();
59 g_autoptr(FlFramebuffer) framebuffer =
63 flutter::kFlutterImplicitViewId,
64 FL_RENDERABLE(renderable));
67 FlutterBackingStore backing_store;
68 backing_store.type = kFlutterBackingStoreTypeOpenGL;
69 backing_store.open_gl.framebuffer.user_data = framebuffer;
72 layer.type = kFlutterLayerContentTypeBackingStore;
73 layer.backing_store = &backing_store;
74 layer.offset = {0, 0};
75 layer.size = {kWidth, kHeight};
77 std::array<const FlutterLayer*, 1> layers = {&layer};
79 constexpr GLuint kFakeTextureName = 123;
80 glBindTexture(GL_TEXTURE_2D, kFakeTextureName);
83 flutter::kFlutterImplicitViewId, layers.data(),
85 GdkRGBA background_color = {
86 .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0};
88 kWidth, kHeight, &background_color);
90 GLuint texture_2d_binding;
91 glGetIntegerv(GL_TEXTURE_BINDING_2D,
92 reinterpret_cast<GLint*
>(&texture_2d_binding));
93 EXPECT_EQ(texture_2d_binding, kFakeTextureName);
96 TEST(FlRendererTest, BlitFramebuffer) {
97 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
100 ON_CALL(epoxy, glGetString(GL_VENDOR))
102 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
103 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
104 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30));
106 EXPECT_CALL(epoxy, glBlitFramebuffer);
108 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
109 g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new();
112 flutter::kFlutterImplicitViewId,
113 FL_RENDERABLE(renderable));
115 FlutterBackingStoreConfig config = {
116 .struct_size =
sizeof(FlutterBackingStoreConfig),
117 .size = {.width = 1024, .height = 1024}};
118 FlutterBackingStore backing_store;
121 const FlutterLayer layer0 = {.struct_size =
sizeof(FlutterLayer),
122 .
type = kFlutterLayerContentTypeBackingStore,
123 .backing_store = &backing_store,
124 .size = {.width = 1024, .height = 1024}};
125 const FlutterLayer* layers[] = {&layer0};
127 flutter::kFlutterImplicitViewId, layers, 1);
128 GdkRGBA background_color = {
129 .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0};
131 1024, 1024, &background_color);
134 TEST(FlRendererTest, BlitFramebufferExtension) {
135 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
138 ON_CALL(epoxy, glGetString(GL_VENDOR))
140 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
141 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
142 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(20));
143 EXPECT_CALL(epoxy, epoxy_has_gl_extension(::testing::_))
144 .WillRepeatedly(::testing::Return(
false));
145 EXPECT_CALL(epoxy, epoxy_has_gl_extension(
146 ::testing::StrEq(
"GL_EXT_framebuffer_blit")))
147 .WillRepeatedly(::testing::Return(
true));
149 EXPECT_CALL(epoxy, glBlitFramebuffer);
151 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
152 g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new();
155 flutter::kFlutterImplicitViewId,
156 FL_RENDERABLE(renderable));
158 FlutterBackingStoreConfig config = {
159 .struct_size =
sizeof(FlutterBackingStoreConfig),
160 .size = {.width = 1024, .height = 1024}};
161 FlutterBackingStore backing_store;
164 const FlutterLayer layer0 = {.struct_size =
sizeof(FlutterLayer),
165 .
type = kFlutterLayerContentTypeBackingStore,
166 .backing_store = &backing_store,
167 .size = {.width = 1024, .height = 1024}};
168 const FlutterLayer* layers[] = {&layer0};
170 flutter::kFlutterImplicitViewId, layers, 1);
171 GdkRGBA background_color = {
172 .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0};
174 1024, 1024, &background_color);
177 TEST(FlRendererTest, NoBlitFramebuffer) {
178 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
181 ON_CALL(epoxy, glGetString(GL_VENDOR))
183 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
184 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
185 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(20));
187 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
188 g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new();
191 flutter::kFlutterImplicitViewId,
192 FL_RENDERABLE(renderable));
194 FlutterBackingStoreConfig config = {
195 .struct_size =
sizeof(FlutterBackingStoreConfig),
196 .size = {.width = 1024, .height = 1024}};
197 FlutterBackingStore backing_store;
200 const FlutterLayer layer0 = {.struct_size =
sizeof(FlutterLayer),
201 .
type = kFlutterLayerContentTypeBackingStore,
202 .backing_store = &backing_store,
203 .size = {.width = 1024, .height = 1024}};
204 const FlutterLayer* layers[] = {&layer0};
206 flutter::kFlutterImplicitViewId, layers, 1);
207 GdkRGBA background_color = {
208 .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0};
210 1024, 1024, &background_color);
213 TEST(FlRendererTest, BlitFramebufferNvidia) {
214 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
218 ON_CALL(epoxy, glGetString(GL_VENDOR))
220 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"NVIDIA")));
221 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
222 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30));
224 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
225 g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new();
228 flutter::kFlutterImplicitViewId,
229 FL_RENDERABLE(renderable));
231 FlutterBackingStoreConfig config = {
232 .struct_size =
sizeof(FlutterBackingStoreConfig),
233 .size = {.width = 1024, .height = 1024}};
234 FlutterBackingStore backing_store;
237 const FlutterLayer layer0 = {.struct_size =
sizeof(FlutterLayer),
238 .
type = kFlutterLayerContentTypeBackingStore,
239 .backing_store = &backing_store,
240 .size = {.width = 1024, .height = 1024}};
241 const FlutterLayer* layers[] = {&layer0};
243 flutter::kFlutterImplicitViewId, layers, 1);
244 GdkRGBA background_color = {
245 .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0};
247 1024, 1024, &background_color);
250 TEST(FlRendererTest, MultiView) {
251 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
254 ON_CALL(epoxy, glGetString(GL_VENDOR))
256 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
257 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
258 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30));
260 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
261 g_autoptr(FlMockRenderable) secondary_renderable = fl_mock_renderable_new();
263 g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new();
266 flutter::kFlutterImplicitViewId,
267 FL_RENDERABLE(renderable));
269 FL_RENDERABLE(secondary_renderable));
272 EXPECT_EQ(fl_mock_renderable_get_redraw_count(renderable),
273 static_cast<size_t>(0));
274 EXPECT_EQ(fl_mock_renderable_get_redraw_count(secondary_renderable),
275 static_cast<size_t>(0));
277 FlutterBackingStoreConfig config = {
278 .struct_size =
sizeof(FlutterBackingStoreConfig),
279 .size = {.width = 1024, .height = 1024}};
280 FlutterBackingStore backing_store;
283 const FlutterLayer layer0 = {.struct_size =
sizeof(FlutterLayer),
284 .
type = kFlutterLayerContentTypeBackingStore,
285 .backing_store = &backing_store,
286 .size = {.width = 1024, .height = 1024}};
287 const FlutterLayer* layers[] = {&layer0};
290 EXPECT_EQ(fl_mock_renderable_get_redraw_count(renderable),
291 static_cast<size_t>(0));
292 EXPECT_EQ(fl_mock_renderable_get_redraw_count(secondary_renderable),
293 static_cast<size_t>(1));