10 #include "flutter/shell/platform/embedder/embedder.h"
17 "attribute vec2 position;\n"
18 "attribute vec2 in_texcoord;\n"
19 "varying vec2 texcoord;\n"
22 " gl_Position = vec4(position, 0, 1);\n"
23 " texcoord = in_texcoord;\n"
28 "uniform sampler2D texture;\n"
29 "varying vec2 texcoord;\n"
32 " gl_FragColor = texture2D(texture, texcoord);\n"
65 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);
67 log =
static_cast<gchar*
>(g_malloc(log_length + 1));
68 glGetShaderInfoLog(shader, log_length,
nullptr, log);
78 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_length);
80 log =
static_cast<gchar*
>(g_malloc(log_length + 1));
81 glGetProgramInfoLog(program, log_length,
nullptr, log);
88 return (2.0 * position / pixels) - 1.0;
93 fl_renderer_get_instance_private(
self));
94 if (
priv->blocking_main_thread) {
95 priv->blocking_main_thread =
false;
97 FlTaskRunner* runner =
104 FlRenderer*
self = FL_RENDERER(
object);
106 fl_renderer_get_instance_private(
self));
110 g_clear_pointer(&
priv->textures, g_ptr_array_unref);
112 G_OBJECT_CLASS(fl_renderer_parent_class)->dispose(
object);
121 fl_renderer_get_instance_private(
self));
122 priv->textures = g_ptr_array_new_with_free_func(g_object_unref);
127 fl_renderer_get_instance_private(
self));
129 g_return_val_if_fail(FL_IS_RENDERER(
self), FALSE);
136 g_return_val_if_fail(FL_IS_RENDERER(
self), NULL);
138 return reinterpret_cast<void*
>(eglGetProcAddress(name));
142 g_return_if_fail(FL_IS_RENDERER(
self));
143 FL_RENDERER_GET_CLASS(
self)->make_current(
self);
147 g_return_if_fail(FL_IS_RENDERER(
self));
148 FL_RENDERER_GET_CLASS(
self)->make_resource_current(
self);
152 g_return_if_fail(FL_IS_RENDERER(
self));
153 FL_RENDERER_GET_CLASS(
self)->clear_current(
self);
157 g_return_val_if_fail(FL_IS_RENDERER(
self), 0);
164 FlRenderer* renderer,
165 const FlutterBackingStoreConfig* config,
166 FlutterBackingStore* backing_store_out) {
169 FlBackingStoreProvider* provider =
172 g_warning(
"Failed to create backing store");
179 backing_store_out->type = kFlutterBackingStoreTypeOpenGL;
180 backing_store_out->open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
181 backing_store_out->open_gl.framebuffer.user_data = provider;
182 backing_store_out->open_gl.framebuffer.name = name;
183 backing_store_out->open_gl.framebuffer.target =
format;
184 backing_store_out->open_gl.framebuffer.destruction_callback = [](
void* p) {
194 const FlutterBackingStore* backing_store) {
198 g_object_unref(backing_store->open_gl.framebuffer.user_data);
206 fl_renderer_get_instance_private(
self));
208 g_return_if_fail(FL_IS_RENDERER(
self));
210 priv->target_width = target_width;
211 priv->target_height = target_height;
213 if (
priv->had_first_frame && !
priv->blocking_main_thread) {
214 priv->blocking_main_thread =
true;
215 FlTaskRunner* runner =
222 const FlutterLayer** layers,
223 size_t layers_count) {
225 fl_renderer_get_instance_private(
self));
227 g_return_val_if_fail(FL_IS_RENDERER(
self), FALSE);
231 if (
priv->blocking_main_thread && layers_count == 1 &&
232 layers[0]->offset.x == 0 && layers[0]->offset.y == 0 &&
233 (layers[0]->size.width !=
priv->target_width ||
234 layers[0]->size.height !=
priv->target_height)) {
238 priv->had_first_frame =
true;
246 g_ptr_array_set_size(
priv->textures, 0);
247 for (
size_t i = 0; i < layers_count; ++i) {
248 const FlutterLayer* layer = layers[i];
249 switch (layer->type) {
250 case kFlutterLayerContentTypeBackingStore: {
251 const FlutterBackingStore* backing_store = layer->backing_store;
252 auto framebuffer = &backing_store->open_gl.framebuffer;
253 FlBackingStoreProvider* provider =
254 FL_BACKING_STORE_PROVIDER(framebuffer->user_data);
255 g_ptr_array_add(
priv->textures, g_object_ref(provider));
257 case kFlutterLayerContentTypePlatformView: {
271 fl_renderer_get_instance_private(
self));
273 g_return_if_fail(FL_IS_RENDERER(
self));
275 GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
277 glCompileShader(vertex_shader);
278 int vertex_compile_status;
279 glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &vertex_compile_status);
280 if (vertex_compile_status == GL_FALSE) {
282 g_warning(
"Failed to compile vertex shader: %s", shader_log);
285 GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
287 glCompileShader(fragment_shader);
288 int fragment_compile_status;
289 glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &fragment_compile_status);
290 if (fragment_compile_status == GL_FALSE) {
292 g_warning(
"Failed to compile fragment shader: %s", shader_log);
295 priv->program = glCreateProgram();
296 glAttachShader(
priv->program, vertex_shader);
297 glAttachShader(
priv->program, fragment_shader);
298 glLinkProgram(
priv->program);
301 glGetProgramiv(
priv->program, GL_LINK_STATUS, &link_status);
302 if (link_status == GL_FALSE) {
304 g_warning(
"Failed to link program: %s", program_log);
307 glDeleteShader(vertex_shader);
308 glDeleteShader(fragment_shader);
313 fl_renderer_get_instance_private(
self));
315 g_return_if_fail(FL_IS_RENDERER(
self));
317 glClearColor(0.0, 0.0, 0.0, 1.0);
318 glClear(GL_COLOR_BUFFER_BIT);
320 glUseProgram(
priv->program);
322 for (guint i = 0; i <
priv->textures->len; i++) {
323 FlBackingStoreProvider* texture =
324 FL_BACKING_STORE_PROVIDER(g_ptr_array_index(
priv->textures, i));
330 GdkRectangle texture_geometry =
332 GLfloat texture_x = texture_geometry.x;
333 GLfloat texture_y = texture_geometry.y;
334 GLfloat texture_width = texture_geometry.width;
335 GLfloat texture_height = texture_geometry.height;
341 GLfloat vertex_data[] = {x0, y0, 0, 0, x1, y1, 1, 1, x0, y1, 0, 1,
342 x0, y0, 0, 0, x1, y0, 1, 0, x1, y1, 1, 1};
344 GLuint vao, vertex_buffer;
345 glGenVertexArrays(1, &vao);
346 glBindVertexArray(vao);
347 glGenBuffers(1, &vertex_buffer);
348 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
349 glBufferData(GL_ARRAY_BUFFER,
sizeof(vertex_data), vertex_data,
351 GLint position_index = glGetAttribLocation(
priv->program,
"position");
352 glEnableVertexAttribArray(position_index);
353 glVertexAttribPointer(position_index, 2, GL_FLOAT, GL_FALSE,
354 sizeof(GLfloat) * 4, 0);
355 GLint texcoord_index = glGetAttribLocation(
priv->program,
"in_texcoord");
356 glEnableVertexAttribArray(texcoord_index);
357 glVertexAttribPointer(texcoord_index, 2, GL_FLOAT, GL_FALSE,
358 sizeof(GLfloat) * 4, (
void*)(
sizeof(GLfloat) * 2));
360 glDrawArrays(GL_TRIANGLES, 0, 6);
362 glDeleteVertexArrays(1, &vao);
363 glDeleteBuffers(1, &vertex_buffer);
371 fl_renderer_get_instance_private(
self));
373 g_return_if_fail(FL_IS_RENDERER(
self));
375 glDeleteProgram(
priv->program);