6 #include "gtest/gtest.h"
8 #include "flutter/common/constants.h"
9 #include "flutter/fml/logging.h"
10 #include "flutter/fml/synchronization/waitable_event.h"
15 #include "flutter/shell/platform/linux/testing/mock_epoxy.h"
16 #include "flutter/shell/platform/linux/testing/mock_renderable.h"
18 #include <epoxy/egl.h>
20 TEST(FlCompositorOpenGLTest, RestoresGLState) {
21 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
25 constexpr
int kWidth = 100;
26 constexpr
int kHeight = 100;
29 ON_CALL(epoxy, glGetString(GL_VENDOR))
31 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
32 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
33 ON_CALL(epoxy, epoxy_gl_version).WillByDefault(::testing::Return(30));
35 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
36 g_autoptr(FlCompositorOpenGL) compositor =
41 fml::AutoResetWaitableEvent latch;
43 g_autoptr(FlFramebuffer) framebuffer =
45 FlutterBackingStore backing_store = {
46 .type = kFlutterBackingStoreTypeOpenGL,
47 .open_gl = {.framebuffer = {.user_data = framebuffer}}};
48 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
49 .backing_store = &backing_store,
51 .size = {kWidth, kHeight}};
52 const FlutterLayer* layers[1] = {&layer};
54 constexpr GLuint kFakeTextureName = 123;
55 glBindTexture(GL_TEXTURE_2D, kFakeTextureName);
58 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
61 g_main_loop_quit(loop);
65 g_main_loop_run(loop);
69 GLuint texture_2d_binding;
70 glGetIntegerv(GL_TEXTURE_BINDING_2D,
71 reinterpret_cast<GLint*
>(&texture_2d_binding));
72 EXPECT_EQ(texture_2d_binding, kFakeTextureName);
79 TEST(FlCompositorOpenGLTest, BlitFramebuffer) {
80 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
84 constexpr
int kWidth = 100;
85 constexpr
int kHeight = 100;
88 ON_CALL(epoxy, glGetString(GL_VENDOR))
90 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
91 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
92 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30));
94 EXPECT_CALL(epoxy, glBlitFramebuffer);
96 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
97 g_autoptr(FlCompositorOpenGL) compositor =
102 fml::AutoResetWaitableEvent latch;
104 g_autoptr(FlFramebuffer) framebuffer =
106 FlutterBackingStore backing_store = {
107 .type = kFlutterBackingStoreTypeOpenGL,
108 .open_gl = {.framebuffer = {.user_data = framebuffer}}};
109 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
110 .backing_store = &backing_store,
112 .size = {kWidth, kHeight}};
113 const FlutterLayer* layers[1] = {&layer};
116 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
119 g_main_loop_quit(loop);
123 g_main_loop_run(loop);
130 TEST(FlCompositorOpenGLTest, BlitFramebufferExtension) {
131 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
135 constexpr
int kWidth = 100;
136 constexpr
int kHeight = 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 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(20));
144 EXPECT_CALL(epoxy, epoxy_has_gl_extension(::testing::_))
145 .WillRepeatedly(::testing::Return(
false));
146 EXPECT_CALL(epoxy, epoxy_has_gl_extension(
147 ::testing::StrEq(
"GL_EXT_framebuffer_blit")))
148 .WillRepeatedly(::testing::Return(
true));
150 EXPECT_CALL(epoxy, glBlitFramebuffer);
152 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
153 g_autoptr(FlCompositorOpenGL) compositor =
158 fml::AutoResetWaitableEvent latch;
160 g_autoptr(FlFramebuffer) framebuffer =
162 FlutterBackingStore backing_store = {
163 .type = kFlutterBackingStoreTypeOpenGL,
164 .open_gl = {.framebuffer = {.user_data = framebuffer}}};
165 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
166 .backing_store = &backing_store,
168 .size = {kWidth, kHeight}};
169 const FlutterLayer* layers[1] = {&layer};
172 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
175 g_main_loop_quit(loop);
179 g_main_loop_run(loop);
187 TEST(FlCompositorOpenGLTest, NoBlitFramebuffer) {
188 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
192 constexpr
int kWidth = 100;
193 constexpr
int kHeight = 100;
196 ON_CALL(epoxy, glGetString(GL_VENDOR))
198 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
199 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
200 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(20));
202 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
203 g_autoptr(FlCompositorOpenGL) compositor =
208 fml::AutoResetWaitableEvent latch;
210 g_autoptr(FlFramebuffer) framebuffer =
212 FlutterBackingStore backing_store = {
213 .type = kFlutterBackingStoreTypeOpenGL,
214 .open_gl = {.framebuffer = {.user_data = framebuffer}}};
215 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
216 .backing_store = &backing_store,
218 .size = {kWidth, kHeight}};
219 const FlutterLayer* layers[1] = {&layer};
222 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
225 g_main_loop_quit(loop);
229 g_main_loop_run(loop);
238 TEST(FlCompositorOpenGLTest, BlitFramebufferNvidia) {
239 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
243 constexpr
int kWidth = 100;
244 constexpr
int kHeight = 100;
248 ON_CALL(epoxy, glGetString(GL_VENDOR))
250 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"NVIDIA")));
251 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
252 EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30));
254 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
255 g_autoptr(FlCompositorOpenGL) compositor =
260 fml::AutoResetWaitableEvent latch;
262 g_autoptr(FlFramebuffer) framebuffer =
264 FlutterBackingStore backing_store = {
265 .type = kFlutterBackingStoreTypeOpenGL,
266 .open_gl = {.framebuffer = {.user_data = framebuffer}}};
267 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
268 .backing_store = &backing_store,
270 .size = {kWidth, kHeight}};
271 const FlutterLayer* layers[1] = {&layer};
274 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
277 g_main_loop_quit(loop);
281 g_main_loop_run(loop);
290 TEST(FlCompositorOpenGLTest, MultiView) {
291 ::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
295 constexpr
int kWidth = 100;
296 constexpr
int kHeight = 100;
299 ON_CALL(epoxy, glGetString(GL_VENDOR))
301 ::testing::Return(
reinterpret_cast<const GLubyte*
>(
"Intel")));
302 ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(
true));
303 ON_CALL(epoxy, epoxy_gl_version).WillByDefault(::testing::Return(30));
305 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
306 g_autoptr(FlMockRenderable) secondary_renderable = fl_mock_renderable_new();
308 g_autoptr(FlCompositorOpenGL) compositor =
312 1.0,
nullptr,
nullptr,
nullptr);
315 fml::AutoResetWaitableEvent latch;
317 g_autoptr(FlFramebuffer) framebuffer =
319 FlutterBackingStore backing_store = {
320 .type = kFlutterBackingStoreTypeOpenGL,
321 .open_gl = {.framebuffer = {.user_data = framebuffer}}};
322 FlutterLayer layer = {.type = kFlutterLayerContentTypeBackingStore,
323 .backing_store = &backing_store,
325 .size = {kWidth, kHeight}};
326 const FlutterLayer* layers[1] = {&layer};
329 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
332 g_main_loop_quit(loop);
336 g_main_loop_run(loop);
void fl_compositor_wait_for_frame(FlCompositor *self, int target_width, int target_height)
gboolean fl_compositor_present_layers(FlCompositor *self, const FlutterLayer **layers, size_t layers_count)
FlCompositorOpenGL * fl_compositor_opengl_new(FlEngine *engine, GdkGLContext *context)
void fl_compositor_opengl_render(FlCompositorOpenGL *self, int width, int height)
TEST(FlCompositorOpenGLTest, RestoresGLState)
G_MODULE_EXPORT FlDartProject * fl_dart_project_new()
void fl_engine_set_implicit_view(FlEngine *self, FlRenderable *renderable)
FlutterViewId fl_engine_add_view(FlEngine *self, FlRenderable *renderable, size_t width, size_t height, double pixel_ratio, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
G_MODULE_EXPORT FlEngine * fl_engine_new(FlDartProject *project)
FlFramebuffer * fl_framebuffer_new(GLint format, size_t width, size_t height)