| Flutter Linux Embedder |

Functions
fl_texture_registrar.cc File Reference
`#include "flutter/shell/platform/linux/public/flutter_linux/fl_texture_registrar.h"`
`#include <gmodule.h>`
`#include "flutter/shell/platform/embedder/embedder.h"`
`#include "flutter/shell/platform/linux/fl_engine_private.h"`
`#include "flutter/shell/platform/linux/fl_pixel_buffer_texture_private.h"`
`#include "flutter/shell/platform/linux/fl_texture_gl_private.h"`
`#include "flutter/shell/platform/linux/fl_texture_private.h"`
`#include "flutter/shell/platform/linux/fl_texture_registrar_private.h"`

Go to the source code of this file.

## Functions
| G_DECLARE_FINAL_TYPE (FlTextureRegistrarImpl, fl_texture_registrar_impl, FL, TEXTURE_REGISTRAR_IMPL, GObject) struct _FlTextureRegistrarImpl
static void | fl_texture_registrar_impl_iface_init (FlTextureRegistrarInterface *iface)
| G_DEFINE_TYPE_WITH_CODE (FlTextureRegistrarImpl, fl_texture_registrar_impl, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(fl_texture_registrar_get_type(), fl_texture_registrar_impl_iface_init)) static void fl_texture_registrar_default_init(FlTextureRegistrarInterface *iface)
static void | fl_texture_registrar_impl_dispose (GObject *object)
static void | fl_texture_registrar_impl_class_init (FlTextureRegistrarImplClass *klass)
static gboolean | register_texture (FlTextureRegistrar *registrar, FlTexture *texture)
static FlTexture * | lookup_texture (FlTextureRegistrar *registrar, int64_t texture_id)
static gboolean | mark_texture_frame_available (FlTextureRegistrar *registrar, FlTexture *texture)
static gboolean | unregister_texture (FlTextureRegistrar *registrar, FlTexture *texture)
static void | shutdown (FlTextureRegistrar *registrar)
static void | fl_texture_registrar_impl_init (FlTextureRegistrarImpl *self)
G_MODULE_EXPORT gboolean | fl_texture_registrar_register_texture (FlTextureRegistrar *self, FlTexture *texture)
FlTexture * | fl_texture_registrar_lookup_texture (FlTextureRegistrar *self, int64_t texture_id)
G_MODULE_EXPORT gboolean | fl_texture_registrar_mark_texture_frame_available (FlTextureRegistrar *self, FlTexture *texture)
G_MODULE_EXPORT gboolean | fl_texture_registrar_unregister_texture (FlTextureRegistrar *self, FlTexture *texture)
void | fl_texture_registrar_shutdown (FlTextureRegistrar *self)
FlTextureRegistrar * | fl_texture_registrar_new (FlEngine *engine)

## Function Documentation

## ◆ fl_texture_registrar_impl_class_init()

static void fl_texture_registrar_impl_class_init | ( | FlTextureRegistrarImplClass * | klass | ) |
| static

Definition at line 70 of file fl_texture_registrar.cc.

71 {
72 G_OBJECT_CLASS(klass)->dispose = fl_texture_registrar_impl_dispose;
73 }
fl_texture_registrar_impl_dispose
static void fl_texture_registrar_impl_dispose(GObject *object)
Definition: fl_texture_registrar.cc:57

References fl_texture_registrar_impl_dispose().

## ◆ fl_texture_registrar_impl_dispose()

static void fl_texture_registrar_impl_dispose | ( | GObject * | object | ) |
| static

Definition at line 57 of file fl_texture_registrar.cc.

57 {
58 FlTextureRegistrarImpl* self = FL_TEXTURE_REGISTRAR_IMPL(object);
59
60 g_mutex_lock(&self->textures_mutex);
61 g_clear_pointer(&self->textures, g_hash_table_unref);
62 g_mutex_unlock(&self->textures_mutex);
63
64 g_weak_ref_clear(&self->engine);
65 g_mutex_clear(&self->textures_mutex);
66
67 G_OBJECT_CLASS(fl_texture_registrar_impl_parent_class)->dispose(object);
68 }

Referenced by fl_texture_registrar_impl_class_init().

## ◆ fl_texture_registrar_impl_iface_init()

static void fl_texture_registrar_impl_iface_init | ( | FlTextureRegistrarInterface * | iface | ) |
| static

Definition at line 164 of file fl_texture_registrar.cc.

165 {
166 iface->register_texture = register_texture;
167 iface->lookup_texture = lookup_texture;
168 iface->mark_texture_frame_available = mark_texture_frame_available;
169 iface->unregister_texture = unregister_texture;
170 iface->shutdown = shutdown;
171 }
register_texture
static gboolean register_texture(FlTextureRegistrar *registrar, FlTexture *texture)
Definition: fl_texture_registrar.cc:75
mark_texture_frame_available
static gboolean mark_texture_frame_available(FlTextureRegistrar *registrar, FlTexture *texture)
Definition: fl_texture_registrar.cc:117
lookup_texture
static FlTexture * lookup_texture(FlTextureRegistrar *registrar, int64_t texture_id)
Definition: fl_texture_registrar.cc:107
shutdown
static void shutdown(FlTextureRegistrar *registrar)
Definition: fl_texture_registrar.cc:152
unregister_texture
static gboolean unregister_texture(FlTextureRegistrar *registrar, FlTexture *texture)
Definition: fl_texture_registrar.cc:130

References lookup_texture(), mark_texture_frame_available(), register_texture(), shutdown(), and unregister_texture().

## ◆ fl_texture_registrar_impl_init()

static void fl_texture_registrar_impl_init | ( | FlTextureRegistrarImpl * | self | ) |
| static

Definition at line 173 of file fl_texture_registrar.cc.

173 {
174 self->next_id = 1;
175 self->textures = g_hash_table_new_full(g_direct_hash, g_direct_equal, nullptr,
176 g_object_unref);
177 // Initialize the mutex for textures.
178 g_mutex_init(&self->textures_mutex);
179 }

## ◆ fl_texture_registrar_lookup_texture()

FlTexture* fl_texture_registrar_lookup_texture | ( | FlTextureRegistrar * | registrar,
|  | int64_t | texture_id
| ) |  |

fl_texture_registrar_lookup_texture: @registrar: an #FlTextureRegistrar. @texture_id: ID of texture.

Looks for the texture with the given ID.

Returns: an #FlTexture or NULL if no texture with this ID.

Definition at line 190 of file fl_texture_registrar.cc.

191 {
192 g_return_val_if_fail(FL_IS_TEXTURE_REGISTRAR(self), NULL);
193
194 return FL_TEXTURE_REGISTRAR_GET_IFACE(self)->lookup_texture(self, texture_id);
195 }
texture_id
int64_t texture_id
Definition: texture_registrar_unittests.cc:24

References texture_id.

Referenced by fl_engine_gl_external_texture_frame_callback(), and TEST().

## ◆ fl_texture_registrar_mark_texture_frame_available()

G_MODULE_EXPORT gboolean fl_texture_registrar_mark_texture_frame_available | ( | FlTextureRegistrar * | registrar,
|  | FlTexture * | texture
| ) |  |

fl_texture_registrar_mark_texture_frame_available: @registrar: an #FlTextureRegistrar. @texture: the texture that has a frame available.

Notifies the flutter engine that the texture object has updated and needs to be rerendered.

Returns: TRUE on success.

Definition at line 197 of file fl_texture_registrar.cc.

199 {
200 g_return_val_if_fail(FL_IS_TEXTURE_REGISTRAR(self), FALSE);
201
202 return FL_TEXTURE_REGISTRAR_GET_IFACE(self)->mark_texture_frame_available(
203 self, texture);
204 }

Referenced by TEST().

## ◆ fl_texture_registrar_new()

FlTextureRegistrar* fl_texture_registrar_new | ( | FlEngine * | engine | ) |

fl_texture_registrar_new: @engine: an #FlEngine.

Creates a new #FlTextureRegistrar.

Returns: a new #FlTextureRegistrar.

Definition at line 221 of file fl_texture_registrar.cc.

221 {
222 FlTextureRegistrarImpl* self = FL_TEXTURE_REGISTRAR_IMPL(
223 g_object_new(fl_texture_registrar_impl_get_type(), nullptr));
224
225 // Added to stop compiler complaining about an unused function.
226 FL_IS_TEXTURE_REGISTRAR_IMPL(self);
227
228 g_weak_ref_init(&self->engine, G_OBJECT(engine));
229
230 return FL_TEXTURE_REGISTRAR(self);
231 }

Referenced by fl_engine_init(), and TEST().

## ◆ fl_texture_registrar_register_texture()

G_MODULE_EXPORT gboolean fl_texture_registrar_register_texture | ( | FlTextureRegistrar * | registrar,
|  | FlTexture * | texture
| ) |  |

FlTextureRegistrar:

#FlTextureRegistrar is used when registering textures.

Flutter Framework accesses your texture by the related unique texture ID. To draw your texture in Dart, you should add Texture widget in your widget tree with the same texture ID. Use platform channels to send this unique texture ID to the Dart side. fl_texture_registrar_register_texture: @registrar: an #FlTextureRegistrar. @texture: an #FlTexture for registration.

Registers a texture.

Returns: TRUE on success.

Definition at line 181 of file fl_texture_registrar.cc.

183 {
184 g_return_val_if_fail(FL_IS_TEXTURE_REGISTRAR(self), FALSE);
185 g_return_val_if_fail(FL_IS_TEXTURE(texture), FALSE);
186
187 return FL_TEXTURE_REGISTRAR_GET_IFACE(self)->register_texture(self, texture);
188 }

Referenced by add_mock_texture_to_registrar(), and TEST().

## ◆ fl_texture_registrar_shutdown()

void fl_texture_registrar_shutdown | ( | FlTextureRegistrar * | registrar | ) |

fl_texture_registrar_shutdown: @registrar: an #FlTextureRegistrar.

Shutdown the registrary and unregister any textures.

Definition at line 215 of file fl_texture_registrar.cc.

215 {
216 g_return_if_fail(FL_IS_TEXTURE_REGISTRAR(self));
217
218 return FL_TEXTURE_REGISTRAR_GET_IFACE(self)->shutdown(self);
219 }

Referenced by fl_engine_dispose().

## ◆ fl_texture_registrar_unregister_texture()

G_MODULE_EXPORT gboolean fl_texture_registrar_unregister_texture | ( | FlTextureRegistrar * | registrar,
|  | FlTexture * | texture
| ) |  |

fl_texture_registrar_unregister_texture: @registrar: an #FlTextureRegistrar. @texture: the texture being unregistered.

Unregisters an existing texture object.

Returns: TRUE on success.

Definition at line 206 of file fl_texture_registrar.cc.

208 {
209 g_return_val_if_fail(FL_IS_TEXTURE_REGISTRAR(self), FALSE);
210
211 return FL_TEXTURE_REGISTRAR_GET_IFACE(self)->unregister_texture(self,
212 texture);
213 }

Referenced by TEST().

## ◆ G_DECLARE_FINAL_TYPE()

G_DECLARE_FINAL_TYPE | ( | FlTextureRegistrarImpl | ,
|  | fl_texture_registrar_impl | ,
|  | FL | ,
|  | TEXTURE_REGISTRAR_IMPL | ,
|  | GObject |
| ) |  |

Definition at line 16 of file fl_texture_registrar.cc.

22 {
23 GObject parent_instance;
24
25 // Weak reference to the engine this texture registrar is created for.
26 GWeakRef engine;
27
28 // ID to assign to the next new texture.
29 int64_t next_id;
30
31 // Internal record for registered textures.
32 //
33 // It is a map from Flutter texture ID to #FlTexture instance created by
34 // plugins. The keys are directly stored int64s. The values are stored
35 // pointer to #FlTexture. This table is freed by the responder.
36 GHashTable* textures;
37
38 // The mutex guard to make `textures` thread-safe.
39 GMutex textures_mutex;
40 };

## ◆ G_DEFINE_TYPE_WITH_CODE()

G_DEFINE_TYPE_WITH_CODE | ( | FlTextureRegistrarImpl | ,
|  | fl_texture_registrar_impl | ,
|  | G_TYPE_OBJECT | ,
|  | G_IMPLEMENT_INTERFACE(fl_texture_registrar_get_type(), fl_texture_registrar_impl_iface_init) |
| ) |  |

Definition at line 47 of file fl_texture_registrar.cc.

55 {}

## ◆ lookup_texture()

static FlTexture* lookup_texture | ( | FlTextureRegistrar * | registrar,
|  | int64_t | texture_id
| ) |  |
| static

Definition at line 107 of file fl_texture_registrar.cc.

108 {
109 FlTextureRegistrarImpl* self = FL_TEXTURE_REGISTRAR_IMPL(registrar);
110 g_mutex_lock(&self->textures_mutex);
111 FlTexture* texture = reinterpret_cast<FlTexture*>(
112 g_hash_table_lookup(self->textures, GINT_TO_POINTER(texture_id)));
113 g_mutex_unlock(&self->textures_mutex);
114 return texture;
115 }

References texture_id.

Referenced by fl_texture_registrar_impl_iface_init().

## ◆ mark_texture_frame_available()

static gboolean mark_texture_frame_available | ( | FlTextureRegistrar * | registrar,
|  | FlTexture * | texture
| ) |  |
| static

Definition at line 117 of file fl_texture_registrar.cc.

118 {
119 FlTextureRegistrarImpl* self = FL_TEXTURE_REGISTRAR_IMPL(registrar);
120
121 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
122 if (engine == nullptr) {
123 return FALSE;
124 }
125
126 return fl_engine_mark_texture_frame_available(engine,
127 fl_texture_get_id(texture));
128 }
fl_engine_mark_texture_frame_available
gboolean fl_engine_mark_texture_frame_available(FlEngine *self, int64_t texture_id)
Definition: fl_engine.cc:1182
fl_texture_get_id
G_MODULE_EXPORT int64_t fl_texture_get_id(FlTexture *self)
Definition: fl_texture.cc:20

References fl_engine_mark_texture_frame_available(), and fl_texture_get_id().

Referenced by fl_texture_registrar_impl_iface_init(), and G_DECLARE_INTERFACE().

## ◆ register_texture()

static gboolean register_texture | ( | FlTextureRegistrar * | registrar,
|  | FlTexture * | texture
| ) |  |
| static

Definition at line 75 of file fl_texture_registrar.cc.

76 {
77 FlTextureRegistrarImpl* self = FL_TEXTURE_REGISTRAR_IMPL(registrar);
78
79 if (FL_IS_TEXTURE_GL(texture) || FL_IS_PIXEL_BUFFER_TEXTURE(texture)) {
80 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
81 if (engine == nullptr) {
82 return FALSE;
83 }
84
85 // We ideally would use numeric IDs, but for backwards compatibility with
86 // existing code use the address of the texture. Once all code uses
87 // fl_texture_get_id we can re-enable this method. See
88 // https://github.com/flutter/flutter/issues/124009 int64_t id =
89 // self->next_id++;
90 int64_t id = reinterpret_cast<int64_t>(texture);
91 if (fl_engine_register_external_texture(engine, id)) {
92 fl_texture_set_id(texture, id);
93 g_mutex_lock(&self->textures_mutex);
94 g_hash_table_insert(self->textures, GINT_TO_POINTER(id),
95 g_object_ref(texture));
96 g_mutex_unlock(&self->textures_mutex);
97 return TRUE;
98 } else {
99 return FALSE;
100 }
101 } else {
102 // We currently only support #FlTextureGL and #FlPixelBufferTexture.
103 return FALSE;
104 }
105 }
fl_engine_register_external_texture
gboolean fl_engine_register_external_texture(FlEngine *self, int64_t texture_id)
Definition: fl_engine.cc:1189
TRUE
return TRUE
Definition: fl_pixel_buffer_texture_test.cc:53
fl_texture_set_id
void fl_texture_set_id(FlTexture *self, int64_t id)
Definition: fl_texture.cc:15

References fl_engine_register_external_texture(), fl_texture_set_id(), and TRUE.

Referenced by fl_texture_registrar_impl_iface_init(), and G_DECLARE_INTERFACE().

## ◆ shutdown()

static void shutdown | ( | FlTextureRegistrar * | registrar | ) |
| static

Definition at line 152 of file fl_texture_registrar.cc.

152 {
153 FlTextureRegistrarImpl* self = FL_TEXTURE_REGISTRAR_IMPL(registrar);
154
155 // Unregister any textures.
156 g_mutex_lock(&self->textures_mutex);
157 g_autoptr(GHashTable) textures = self->textures;
158 self->textures = g_hash_table_new_full(g_direct_hash, g_direct_equal, nullptr,
159 g_object_unref);
160 g_hash_table_remove_all(textures);
161 g_mutex_unlock(&self->textures_mutex);
162 }

Referenced by fl_texture_registrar_impl_iface_init().

## ◆ unregister_texture()

static gboolean unregister_texture | ( | FlTextureRegistrar * | registrar,
|  | FlTexture * | texture
| ) |  |
| static

Definition at line 130 of file fl_texture_registrar.cc.

131 {
132 FlTextureRegistrarImpl* self = FL_TEXTURE_REGISTRAR_IMPL(registrar);
133
134 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
135 if (engine == nullptr) {
136 return FALSE;
137 }
138
139 gboolean result =
140 fl_engine_unregister_external_texture(engine, fl_texture_get_id(texture));
141
142 g_mutex_lock(&self->textures_mutex);
143 if (!g_hash_table_remove(self->textures,
144 GINT_TO_POINTER(fl_texture_get_id(texture)))) {
145 g_warning("Unregistering a non-existent texture %p", texture);
146 }
147 g_mutex_unlock(&self->textures_mutex);
148
149 return result;
150 }
fl_engine_unregister_external_texture
gboolean fl_engine_unregister_external_texture(FlEngine *self, int64_t texture_id)
Definition: fl_engine.cc:1196

References fl_engine_unregister_external_texture(), and fl_texture_get_id().

Referenced by fl_texture_registrar_impl_iface_init(), and G_DECLARE_INTERFACE().