| Flutter Linux Embedder |

Classes | Functions
fl_renderer.cc File Reference
`#include "fl_renderer.h"`
`#include <epoxy/egl.h>`
`#include <epoxy/gl.h>`
`#include "flutter/shell/platform/embedder/embedder.h"`
`#include "flutter/shell/platform/linux/fl_backing_store_provider.h"`
`#include "flutter/shell/platform/linux/fl_engine_private.h"`

Go to the source code of this file.

## Classes
struct | FlRendererPrivate

## Functions
static void | fl_renderer_unblock_main_thread (FlRenderer *self)
static void | fl_renderer_dispose (GObject *self)
static void | fl_renderer_class_init (FlRendererClass *klass)
static void | fl_renderer_init (FlRenderer *self)
gboolean | fl_renderer_start (FlRenderer *self, FlView *view, GError **error)
FlView * | fl_renderer_get_view (FlRenderer *self)
GdkGLContext * | fl_renderer_get_context (FlRenderer *self)
void * | fl_renderer_get_proc_address (FlRenderer *self, const char *name)
gboolean | fl_renderer_make_current (FlRenderer *self, GError **error)
gboolean | fl_renderer_make_resource_current (FlRenderer *self, GError **error)
gboolean | fl_renderer_clear_current (FlRenderer *self, GError **error)
guint32 | fl_renderer_get_fbo (FlRenderer *self)
gboolean | fl_renderer_create_backing_store (FlRenderer *self, const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out)
gboolean | fl_renderer_collect_backing_store (FlRenderer *self, const FlutterBackingStore *backing_store)
void | fl_renderer_wait_for_frame (FlRenderer *self, int target_width, int target_height)
gboolean | fl_renderer_present_layers (FlRenderer *self, const FlutterLayer **layers, size_t layers_count)

## Function Documentation

## ◆ fl_renderer_class_init()

static void fl_renderer_class_init | ( | FlRendererClass * | klass | ) |
| static

Definition at line 53 of file fl_renderer.cc.

53 {
54 G_OBJECT_CLASS(klass)->dispose = fl_renderer_dispose;
55 }

References fl_renderer_dispose().

## ◆ fl_renderer_clear_current()

gboolean fl_renderer_clear_current | ( | FlRenderer * | renderer,
|  | GError ** | error
| ) |  |

fl_renderer_clear_current: @renderer: an #FlRenderer. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore.

Clears the current rendering context.

Returns TRUE if successful.

Definition at line 115 of file fl_renderer.cc.

115 {
116 gdk_gl_context_clear_current();
117 return TRUE;
118 }

References TRUE.

Referenced by fl_engine_gl_clear_current().

## ◆ fl_renderer_collect_backing_store()

gboolean fl_renderer_collect_backing_store | ( | FlRenderer * | renderer,
|  | const FlutterBackingStore * | backing_store
| ) |  |

fl_renderer_collect_backing_store: @renderer: an #FlRenderer. @backing_store: backing store to be released.

A callback invoked by the engine to release the backing store. The embedder may collect any resources associated with the backing store.

Returns TRUE if successful.

Definition at line 133 of file fl_renderer.cc.

135 {
136 return FL_RENDERER_GET_CLASS(self)->collect_backing_store(self,
137 backing_store);
138 }

Referenced by compositor_collect_backing_store_callback().

## ◆ fl_renderer_create_backing_store()

gboolean fl_renderer_create_backing_store | ( | FlRenderer * | renderer,
|  | const FlutterBackingStoreConfig * | config,
|  | FlutterBackingStore * | backing_store_out
| ) |  |

fl_renderer_create_backing_store: @renderer: an #FlRenderer. @config: backing store config. @backing_store_out: saves created backing store.

Obtain a backing store for a specific #FlutterLayer.

Returns TRUE if successful.

Definition at line 125 of file fl_renderer.cc.

128 {
129 return FL_RENDERER_GET_CLASS(self)->create_backing_store(self, config,
130 backing_store_out);
131 }

Referenced by compositor_create_backing_store_callback().

## ◆ fl_renderer_dispose()

static void fl_renderer_dispose | ( | GObject * | self | ) |
| static

Definition at line 48 of file fl_renderer.cc.

48 {
49 fl_renderer_unblock_main_thread(FL_RENDERER(self));
50 G_OBJECT_CLASS(fl_renderer_parent_class)->dispose(self);
51 }

References fl_renderer_unblock_main_thread().

Referenced by fl_renderer_class_init().

## ◆ fl_renderer_get_context()

GdkGLContext* fl_renderer_get_context | ( | FlRenderer * | renderer | ) |

fl_renderer_get_context: @renderer: an #FlRenderer.

Returns: GL context for GLAreas or NULL if headless.

Definition at line 85 of file fl_renderer.cc.

85 {
86 FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
87 fl_renderer_get_instance_private(self));
88 return priv->main_context;
89 }

References priv.

Referenced by fl_renderer_gl_present_layers().

## ◆ fl_renderer_get_fbo()

guint32 fl_renderer_get_fbo | ( | FlRenderer * | renderer | ) |

fl_renderer_get_fbo: @renderer: an #FlRenderer.

Gets the frame buffer object to render to.

Returns: a frame buffer object index.

Definition at line 120 of file fl_renderer.cc.

120 {
121 // There is only one frame buffer object - always return that.
122 return 0;
123 }

Referenced by fl_engine_gl_get_fbo().

## ◆ fl_renderer_get_proc_address()

void* fl_renderer_get_proc_address | ( | FlRenderer * | self,
|  | const char * | name
| ) |  |

Definition at line 91 of file fl_renderer.cc.

91 {
92 return reinterpret_cast<void*>(eglGetProcAddress(name));
93 }

Referenced by fl_engine_gl_proc_resolver().

## ◆ fl_renderer_get_view()

FlView* fl_renderer_get_view | ( | FlRenderer * | renderer | ) |

fl_renderer_get_view: @renderer: an #FlRenderer.

Returns: targeted #FlView or NULL if headless.

Definition at line 79 of file fl_renderer.cc.

79 {
80 FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
81 fl_renderer_get_instance_private(self));
82 return priv->view;
83 }

References priv.

Referenced by fl_renderer_gl_present_layers().

## ◆ fl_renderer_init()

static void fl_renderer_init | ( | FlRenderer * | self | ) |
| static

Definition at line 57 of file fl_renderer.cc.

57 {}

## ◆ fl_renderer_make_current()

gboolean fl_renderer_make_current | ( | FlRenderer * | renderer,
|  | GError ** | error
| ) |  |

fl_renderer_make_current: @renderer: an #FlRenderer. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore.

Makes the rendering context current.

Returns TRUE if successful.

Definition at line 95 of file fl_renderer.cc.

95 {
96 FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
97 fl_renderer_get_instance_private(self));
98 if (priv->main_context) {
99 gdk_gl_context_make_current(priv->main_context);
100 }
101
102 return TRUE;
103 }

References priv, and TRUE.

Referenced by fl_engine_gl_make_current(), fl_renderer_gl_collect_backing_store(), and fl_renderer_gl_create_backing_store().

## ◆ fl_renderer_make_resource_current()

gboolean fl_renderer_make_resource_current | ( | FlRenderer * | renderer,
|  | GError ** | error
| ) |  |

fl_renderer_make_resource_current: @renderer: an #FlRenderer. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore.

Makes the resource rendering context current.

Returns TRUE if successful.

Definition at line 105 of file fl_renderer.cc.

105 {
106 FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
107 fl_renderer_get_instance_private(self));
108 if (priv->resource_context) {
109 gdk_gl_context_make_current(priv->resource_context);
110 }
111
112 return TRUE;
113 }

References priv, and TRUE.

Referenced by fl_engine_gl_make_resource_current().

## ◆ fl_renderer_present_layers()

gboolean fl_renderer_present_layers | ( | FlRenderer * | renderer,
|  | const FlutterLayer ** | layers,
|  | size_t | layers_count
| ) |  |

fl_renderer_present_layers: @renderer: an #FlRenderer. @layers: layers to be composited. @layers_count: number of layers.

Callback invoked by the engine to composite the contents of each layer onto the screen.

Returns TRUE if successful.

Definition at line 157 of file fl_renderer.cc.

159 {
160 FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
161 fl_renderer_get_instance_private(self));
162
163 // ignore incoming frame with wrong dimensions in trivial case with just one
164 // layer
165 if (priv->blocking_main_thread && layers_count == 1 &&
166 layers[0]->offset.x == 0 && layers[0]->offset.y == 0 &&
167 (layers[0]->size.width != priv->target_width ||
168 layers[0]->size.height != priv->target_height)) {
169 return true;
170 }
171
172 priv->had_first_frame = true;
173
174 fl_renderer_unblock_main_thread(self);
175
176 return FL_RENDERER_GET_CLASS(self)->present_layers(self, layers,
177 layers_count);
178 }

References fl_renderer_unblock_main_thread(), and priv.

Referenced by compositor_present_layers_callback().

## ◆ fl_renderer_start()

gboolean fl_renderer_start | ( | FlRenderer * | renderer,
|  | FlView * | view,
|  | GError ** | error
| ) |  |

fl_renderer_start: @renderer: an #FlRenderer. @view: the view Flutter is renderering to. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore.

Start the renderer.

Returns: TRUE if successfully started.

Definition at line 59 of file fl_renderer.cc.

59 {
60 g_return_val_if_fail(FL_IS_RENDERER(self), FALSE);
61 FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
62 fl_renderer_get_instance_private(self));
63 priv->view = view;
64 gboolean result = FL_RENDERER_GET_CLASS(self)->create_contexts(
65 self, GTK_WIDGET(view), &priv->main_context, &priv->resource_context,
66 error);
67
68 if (result) {
69 gdk_gl_context_realize(priv->main_context, error);
70 gdk_gl_context_realize(priv->resource_context, error);
71 }
72
73 if (*error != nullptr) {
74 return FALSE;
75 }
76 return TRUE;
77 }

References error, priv, result, and TRUE.

Referenced by realize_cb().

## ◆ fl_renderer_unblock_main_thread()

static void fl_renderer_unblock_main_thread | ( | FlRenderer * | self | ) |
| static

Definition at line 36 of file fl_renderer.cc.

36 {
37 FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
38 fl_renderer_get_instance_private(self));
39 if (priv->blocking_main_thread) {
40 priv->blocking_main_thread = false;
41
42 FlTaskRunner* runner =
43 fl_engine_get_task_runner(fl_view_get_engine(priv->view));
44 fl_task_runner_release_main_thread(runner);
45 }
46 }

References fl_engine_get_task_runner(), fl_task_runner_release_main_thread(), fl_view_get_engine(), and priv.

Referenced by fl_renderer_dispose(), and fl_renderer_present_layers().

## ◆ fl_renderer_wait_for_frame()

void fl_renderer_wait_for_frame | ( | FlRenderer * | renderer,
|  | int | target_width,
|  | int | target_height
| ) |  |

fl_renderer_wait_for_frame: @renderer: an #FlRenderer. @target_width: width of frame being waited for @target_height: height of frame being waited for

Holds the thread until frame with requested dimensions is presented. While waiting for frame Flutter platform and raster tasks are being processed.

Definition at line 140 of file fl_renderer.cc.

142 {
143 FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
144 fl_renderer_get_instance_private(self));
145
146 priv->target_width = target_width;
147 priv->target_height = target_height;
148
149 if (priv->had_first_frame && !priv->blocking_main_thread) {
150 priv->blocking_main_thread = true;
151 FlTaskRunner* runner =
152 fl_engine_get_task_runner(fl_view_get_engine(priv->view));
153 fl_task_runner_block_main_thread(runner);
154 }
155 }

References fl_engine_get_task_runner(), fl_task_runner_block_main_thread(), fl_view_get_engine(), and priv.

Referenced by handle_geometry_changed().

priv
FlPixelBufferTexturePrivate * priv
Definition: fl_pixel_buffer_texture.cc:30
fl_renderer_dispose
static void fl_renderer_dispose(GObject *self)
Definition: fl_renderer.cc:48
TRUE
return TRUE
Definition: fl_pixel_buffer_texture_test.cc:53
fl_view_get_engine
G_MODULE_EXPORT FlEngine * fl_view_get_engine(FlView *self)
Definition: fl_view.cc:744
fl_renderer_unblock_main_thread
static void fl_renderer_unblock_main_thread(FlRenderer *self)
Definition: fl_renderer.cc:36
fl_task_runner_release_main_thread
void fl_task_runner_release_main_thread(FlTaskRunner *self)
Definition: fl_task_runner.cc:205
result
GAsyncResult * result
Definition: fl_text_input_plugin.cc:106
error
const uint8_t uint32_t uint32_t GError ** error
Definition: fl_pixel_buffer_texture_test.cc:40
fl_engine_get_task_runner
FlTaskRunner * fl_engine_get_task_runner(FlEngine *self)
Definition: fl_engine.cc:899
FlRendererPrivate
Definition: fl_renderer.cc:16
fl_task_runner_block_main_thread
void fl_task_runner_block_main_thread(FlTaskRunner *self)
Definition: fl_task_runner.cc:184