6 #include "flutter/shell/platform/linux/testing/linux_test.h"
7 #include "gtest/gtest.h"
9 #include "flutter/common/constants.h"
10 #include "flutter/fml/logging.h"
11 #include "flutter/fml/synchronization/waitable_event.h"
17 #include "flutter/shell/platform/linux/testing/mock_epoxy.h"
18 #include "flutter/shell/platform/linux/testing/mock_gtk.h"
19 #include "flutter/shell/platform/linux/testing/mock_renderable.h"
21 #include <epoxy/egl.h>
40 ::testing::NiceMock<flutter::testing::MockEpoxy>
epoxy;
49 constexpr
size_t width = 100;
50 constexpr
size_t height = 100;
53 FlutterBackingStore backing_store = {
54 .type = kFlutterBackingStoreTypeOpenGL,
55 .open_gl = {.framebuffer = {.user_data =
framebuffer}}};
56 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
57 .backing_store = &backing_store,
60 const FlutterLayer*
layers[1] = {&layer};
65 size_t frame_width, frame_height;
68 EXPECT_EQ(frame_width,
width);
69 EXPECT_EQ(frame_height,
height);
72 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32,
width);
73 g_autofree
unsigned char* image_data =
74 static_cast<unsigned char*
>(malloc(
height * stride));
75 cairo_surface_t* surface = cairo_image_surface_create_for_data(
76 image_data, CAIRO_FORMAT_ARGB32,
width,
height, stride);
77 cairo_t* cr = cairo_create(surface);
79 cairo_surface_destroy(surface);
85 constexpr
size_t width1 = 90;
86 constexpr
size_t height1 = 90;
89 FlutterBackingStore backing_store1 = {
90 .type = kFlutterBackingStoreTypeOpenGL,
91 .open_gl = {.framebuffer = {.user_data = framebuffer1}}};
92 FlutterLayer layer1 = {.type = kFlutterLayerContentTypeBackingStore,
93 .backing_store = &backing_store1,
95 .size = {width1, height1}};
96 const FlutterLayer* layers1[1] = {&layer1};
102 constexpr
size_t width2 = 100;
103 constexpr
size_t height2 = 100;
106 FlutterBackingStore backing_store2 = {
107 .type = kFlutterBackingStoreTypeOpenGL,
108 .open_gl = {.framebuffer = {.user_data = framebuffer2}}};
109 FlutterLayer layer2 = {.type = kFlutterLayerContentTypeBackingStore,
110 .backing_store = &backing_store2,
112 .size = {width2, height2}};
113 const FlutterLayer* layers2[1] = {&layer2};
114 fml::AutoResetWaitableEvent latch;
121 int stride2 = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width2);
122 g_autofree
unsigned char* image_data =
123 static_cast<unsigned char*
>(malloc(height2 * stride2));
124 cairo_surface_t* surface = cairo_image_surface_create_for_data(
125 image_data, CAIRO_FORMAT_ARGB32, width2, height2, stride2);
126 cairo_t* cr = cairo_create(surface);
128 cairo_surface_destroy(surface);
135 constexpr
size_t width = 100;
136 constexpr
size_t height = 100;
139 ON_CALL(epoxy, glGetString(GL_VENDOR))
141 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
142 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
143 ON_CALL(epoxy, epoxy_gl_version).WillByDefault(::testing::Return(30));
147 FlutterBackingStore backing_store = {
148 .type = kFlutterBackingStoreTypeOpenGL,
149 .open_gl = {.framebuffer = {.user_data =
framebuffer}}};
150 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
151 .backing_store = &backing_store,
154 const FlutterLayer*
layers[1] = {&layer};
156 constexpr GLuint kFakeTextureName = 123;
159 glEnable(GL_SCISSOR_TEST);
165 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32,
width);
166 g_autofree
unsigned char* image_data =
167 static_cast<unsigned char*
>(malloc(
height * stride));
168 cairo_surface_t* surface = cairo_image_surface_create_for_data(
169 image_data, CAIRO_FORMAT_ARGB32,
width,
height, stride);
170 cairo_t* cr = cairo_create(surface);
172 cairo_surface_destroy(surface);
175 GLuint texture_2d_binding;
176 glGetIntegerv(GL_TEXTURE_BINDING_2D,
177 reinterpret_cast<GLint*
>(&texture_2d_binding));
178 EXPECT_EQ(texture_2d_binding, kFakeTextureName);
179 EXPECT_EQ(glIsEnabled(GL_BLEND), GL_FALSE);
180 EXPECT_EQ(glIsEnabled(GL_SCISSOR_TEST), GL_TRUE);
184 constexpr
size_t width = 100;
185 constexpr
size_t height = 100;
188 ON_CALL(epoxy, glGetString(GL_VENDOR))
190 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
191 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
192 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30));
194 EXPECT_CALL(epoxy, glBlitFramebuffer);
198 FlutterBackingStore backing_store = {
199 .type = kFlutterBackingStoreTypeOpenGL,
200 .open_gl = {.framebuffer = {.user_data =
framebuffer}}};
201 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
202 .backing_store = &backing_store,
205 const FlutterLayer*
layers[1] = {&layer};
211 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32,
width);
212 g_autofree
unsigned char* image_data =
213 static_cast<unsigned char*
>(malloc(
height * stride));
214 cairo_surface_t* surface = cairo_image_surface_create_for_data(
215 image_data, CAIRO_FORMAT_ARGB32,
width,
height, stride);
216 cairo_t* cr = cairo_create(surface);
218 cairo_surface_destroy(surface);
223 constexpr
size_t width = 100;
224 constexpr
size_t height = 100;
227 ON_CALL(epoxy, glGetString(GL_VENDOR))
229 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
230 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
231 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(20));
232 EXPECT_CALL(epoxy, epoxy_has_gl_extension(::testing::_))
233 .WillRepeatedly(::testing::Return(
false));
234 EXPECT_CALL(epoxy, epoxy_has_gl_extension(
235 ::testing::StrEq(
"GL_EXT_framebuffer_blit")))
236 .WillRepeatedly(::testing::Return(
true));
238 EXPECT_CALL(epoxy, glBlitFramebuffer);
242 FlutterBackingStore backing_store = {
243 .type = kFlutterBackingStoreTypeOpenGL,
244 .open_gl = {.framebuffer = {.user_data =
framebuffer}}};
245 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
246 .backing_store = &backing_store,
249 const FlutterLayer*
layers[1] = {&layer};
255 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32,
width);
256 g_autofree
unsigned char* image_data =
257 static_cast<unsigned char*
>(malloc(
height * stride));
258 cairo_surface_t* surface = cairo_image_surface_create_for_data(
259 image_data, CAIRO_FORMAT_ARGB32,
width,
height, stride);
260 cairo_t* cr = cairo_create(surface);
262 cairo_surface_destroy(surface);
267 constexpr
size_t width = 100;
268 constexpr
size_t height = 100;
271 ON_CALL(epoxy, glGetString(GL_VENDOR))
273 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
274 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
275 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(20));
279 FlutterBackingStore backing_store = {
280 .type = kFlutterBackingStoreTypeOpenGL,
281 .open_gl = {.framebuffer = {.user_data =
framebuffer}}};
282 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
283 .backing_store = &backing_store,
286 const FlutterLayer*
layers[1] = {&layer};
292 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32,
width);
293 g_autofree
unsigned char* image_data =
294 static_cast<unsigned char*
>(malloc(
height * stride));
295 cairo_surface_t* surface = cairo_image_surface_create_for_data(
296 image_data, CAIRO_FORMAT_ARGB32,
width,
height, stride);
297 cairo_t* cr = cairo_create(surface);
299 cairo_surface_destroy(surface);
304 constexpr
size_t width = 100;
305 constexpr
size_t height = 100;
309 ON_CALL(epoxy, glGetString(GL_VENDOR))
311 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"NVIDIA")));
312 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
313 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30));
317 FlutterBackingStore backing_store = {
318 .type = kFlutterBackingStoreTypeOpenGL,
319 .open_gl = {.framebuffer = {.user_data =
framebuffer}}};
320 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
321 .backing_store = &backing_store,
324 const FlutterLayer*
layers[1] = {&layer};
330 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32,
width);
331 g_autofree
unsigned char* image_data =
332 static_cast<unsigned char*
>(malloc(
height * stride));
333 cairo_surface_t* surface = cairo_image_surface_create_for_data(
334 image_data, CAIRO_FORMAT_ARGB32,
width,
height, stride);
335 cairo_t* cr = cairo_create(surface);
337 cairo_surface_destroy(surface);
343 constexpr
size_t width = 100;
344 constexpr
size_t height = 100;
347 FlutterBackingStore backing_store = {
348 .type = kFlutterBackingStoreTypeOpenGL,
349 .open_gl = {.framebuffer = {.user_data =
framebuffer}}};
350 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
351 .backing_store = &backing_store,
354 const FlutterLayer*
layers[1] = {&layer};
360 flutter::testing::MockGtk mock_gtk;
361 EXPECT_CALL(mock_gtk, gdk_window_get_width(::testing::_))
362 .WillRepeatedly(::testing::Return(200));
363 EXPECT_CALL(mock_gtk, gdk_window_get_height(::testing::_))
364 .WillRepeatedly(::testing::Return(200));
370 int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, 200);
371 g_autofree
unsigned char* image_data =
372 static_cast<unsigned char*
>(g_malloc(200 * stride));
373 cairo_surface_t* surface = cairo_image_surface_create_for_data(
374 image_data, CAIRO_FORMAT_ARGB32, 200, 200, stride);
375 cairo_t* cr = cairo_create(surface);
380 cairo_surface_destroy(surface);
FlOpenGLManager * opengl_manager
FlCompositorOpenGL * compositor
~FlCompositorOpenGLTest()
FlMockRenderable * renderable
FlTaskRunner * task_runner
::testing::NiceMock< flutter::testing::MockEpoxy > epoxy
g_autoptr(FlEngine) engine
gboolean fl_compositor_render(FlCompositor *self, cairo_t *cr, GdkWindow *window, gboolean wait_for_frame)
void fl_compositor_get_frame_size(FlCompositor *self, size_t *width, size_t *height)
gboolean fl_compositor_present_layers(FlCompositor *self, const FlutterLayer **layers, size_t layers_count)
FlCompositorOpenGL * fl_compositor_opengl_new(FlTaskRunner *task_runner, FlOpenGLManager *opengl_manager, gboolean shareable)
FlFramebuffer * framebuffer
FlFramebuffer double double int int height
FlFramebuffer double double int width
glBindTexture(GL_TEXTURE_2D, texture_id)
TEST_F(FlCompositorOpenGLTest, Render)
const FlutterLayer ** layers
void fl_engine_set_implicit_view(FlEngine *self, FlRenderable *renderable)
FlFramebuffer * fl_framebuffer_new(GLint format, size_t width, size_t height, gboolean shareable)
FlOpenGLManager * fl_opengl_manager_new()
FlTaskRunner * fl_task_runner_new(FlEngine *engine)