Skip to content

Commit b39232e

Browse files
Move tracking of renderables from FlRenderer to FlEngine (#165848)
Motivated by work on refactoring FlRenderer to FlCompositor.
1 parent 97167ed commit b39232e

File tree

7 files changed

+91
-98
lines changed

7 files changed

+91
-98
lines changed

engine/src/flutter/shell/platform/linux/fl_engine.cc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <cstring>
1010

11+
#include "flutter/common/constants.h"
1112
#include "flutter/shell/platform/common/engine_switches.h"
1213
#include "flutter/shell/platform/embedder/embedder.h"
1314
#include "flutter/shell/platform/linux/fl_binary_messenger_private.h"
@@ -93,6 +94,9 @@ struct _FlEngine {
9394
// Next ID to use for a view.
9495
FlutterViewId next_view_id;
9596

97+
// Objects rendering the views.
98+
GHashTable* renderables_by_view_id;
99+
96100
// Function to call when a platform message is received.
97101
FlEnginePlatformMessageHandler platform_message_handler;
98102
gpointer platform_message_handler_data;
@@ -489,6 +493,7 @@ static void fl_engine_dispose(GObject* object) {
489493
g_clear_object(&self->keyboard_handler);
490494
g_clear_object(&self->mouse_cursor_handler);
491495
g_clear_object(&self->task_runner);
496+
g_clear_pointer(&self->renderables_by_view_id, g_hash_table_unref);
492497

493498
if (self->platform_message_handler_destroy_notify) {
494499
self->platform_message_handler_destroy_notify(
@@ -534,6 +539,12 @@ static void fl_engine_init(FlEngine* self) {
534539

535540
// Implicit view is 0, so start at 1.
536541
self->next_view_id = 1;
542+
self->renderables_by_view_id = g_hash_table_new_full(
543+
g_direct_hash, g_direct_equal, nullptr, [](gpointer value) {
544+
GWeakRef* ref = static_cast<GWeakRef*>(value);
545+
g_weak_ref_clear(ref);
546+
free(ref);
547+
});
537548

538549
self->texture_registrar = fl_texture_registrar_new(self);
539550
}
@@ -734,7 +745,15 @@ void fl_engine_notify_display_update(FlEngine* self,
734745
}
735746
}
736747

748+
void fl_engine_set_implicit_view(FlEngine* self, FlRenderable* renderable) {
749+
GWeakRef* ref = g_new(GWeakRef, 1);
750+
g_weak_ref_init(ref, G_OBJECT(renderable));
751+
g_hash_table_insert(self->renderables_by_view_id,
752+
GINT_TO_POINTER(flutter::kFlutterImplicitViewId), ref);
753+
}
754+
737755
FlutterViewId fl_engine_add_view(FlEngine* self,
756+
FlRenderable* renderable,
738757
size_t width,
739758
size_t height,
740759
double pixel_ratio,
@@ -748,6 +767,11 @@ FlutterViewId fl_engine_add_view(FlEngine* self,
748767
FlutterViewId view_id = self->next_view_id;
749768
self->next_view_id++;
750769

770+
GWeakRef* ref = g_new(GWeakRef, 1);
771+
g_weak_ref_init(ref, G_OBJECT(renderable));
772+
g_hash_table_insert(self->renderables_by_view_id, GINT_TO_POINTER(view_id),
773+
ref);
774+
751775
// We don't know which display this view will open on, so set to zero and this
752776
// will be updated in a following FlutterWindowMetricsEvent
753777
FlutterEngineDisplayId display_id = 0;
@@ -784,13 +808,23 @@ gboolean fl_engine_add_view_finish(FlEngine* self,
784808
return g_task_propagate_boolean(G_TASK(result), error);
785809
}
786810

811+
FlRenderable* fl_engine_get_renderable(FlEngine* self, FlutterViewId view_id) {
812+
g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
813+
814+
GWeakRef* ref = static_cast<GWeakRef*>(g_hash_table_lookup(
815+
self->renderables_by_view_id, GINT_TO_POINTER(view_id)));
816+
return FL_RENDERABLE(g_weak_ref_get(ref));
817+
}
818+
787819
void fl_engine_remove_view(FlEngine* self,
788820
FlutterViewId view_id,
789821
GCancellable* cancellable,
790822
GAsyncReadyCallback callback,
791823
gpointer user_data) {
792824
g_return_if_fail(FL_IS_ENGINE(self));
793825

826+
g_hash_table_remove(self->renderables_by_view_id, GINT_TO_POINTER(view_id));
827+
794828
g_autoptr(GTask) task = g_task_new(self, cancellable, callback, user_data);
795829

796830
FlutterRemoveViewInfo info;

engine/src/flutter/shell/platform/linux/fl_engine_private.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "flutter/shell/platform/linux/fl_display_monitor.h"
1212
#include "flutter/shell/platform/linux/fl_keyboard_manager.h"
1313
#include "flutter/shell/platform/linux/fl_mouse_cursor_handler.h"
14+
#include "flutter/shell/platform/linux/fl_renderable.h"
1415
#include "flutter/shell/platform/linux/fl_renderer.h"
1516
#include "flutter/shell/platform/linux/fl_task_runner.h"
1617
#include "flutter/shell/platform/linux/fl_text_input_handler.h"
@@ -127,9 +128,19 @@ void fl_engine_notify_display_update(FlEngine* engine,
127128
const FlutterEngineDisplay* displays,
128129
size_t displays_length);
129130

131+
/**
132+
* fl_engine_set_implicit_view:
133+
* @engine: an #FlEngine.
134+
* @renderable: the object that will render the implicit view.
135+
*
136+
* Sets the object to render the implicit view.
137+
*/
138+
void fl_engine_set_implicit_view(FlEngine* engine, FlRenderable* renderable);
139+
130140
/**
131141
* fl_engine_add_view:
132142
* @engine: an #FlEngine.
143+
* @renderable: the object that will render this view.
133144
* @width: width of view in pixels.
134145
* @height: height of view in pixels.
135146
* @pixel_ratio: scale factor for view.
@@ -144,6 +155,7 @@ void fl_engine_notify_display_update(FlEngine* engine,
144155
* Returns: the ID for the view.
145156
*/
146157
FlutterViewId fl_engine_add_view(FlEngine* engine,
158+
FlRenderable* renderable,
147159
size_t width,
148160
size_t height,
149161
double pixel_ratio,
@@ -166,6 +178,18 @@ gboolean fl_engine_add_view_finish(FlEngine* engine,
166178
GAsyncResult* result,
167179
GError** error);
168180

181+
/**
182+
* fl_engine_get_renderable:
183+
* @engine: an #FlEngine.
184+
* @view_id: ID to check.
185+
*
186+
* Gets the renderable associated with the give view ID.
187+
*
188+
* Returns: (transfer full): a reference to an #FlRenderable or %NULL if none
189+
* for this ID.
190+
*/
191+
FlRenderable* fl_engine_get_renderable(FlEngine* engine, FlutterViewId view_id);
192+
169193
/**
170194
* fl_engine_remove_view:
171195
* @engine: an #FlEngine.

engine/src/flutter/shell/platform/linux/fl_engine_test.cc

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
1111
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"
1212
#include "flutter/shell/platform/linux/public/flutter_linux/fl_string_codec.h"
13+
#include "flutter/shell/platform/linux/testing/mock_renderer.h"
1314

1415
// MOCK_ENGINE_PROC is leaky by design
1516
// NOLINTBEGIN(clang-analyzer-core.StackAddressEscape)
@@ -651,8 +652,10 @@ TEST(FlEngineTest, AddView) {
651652
return kSuccess;
652653
}));
653654

655+
g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
654656
FlutterViewId view_id =
655-
fl_engine_add_view(engine, 123, 456, 2.0, nullptr, add_view_cb, loop);
657+
fl_engine_add_view(engine, FL_RENDERABLE(renderable), 123, 456, 2.0,
658+
nullptr, add_view_cb, loop);
656659
EXPECT_GT(view_id, 0);
657660
EXPECT_TRUE(called);
658661

@@ -688,8 +691,10 @@ TEST(FlEngineTest, AddViewError) {
688691
return kSuccess;
689692
}));
690693

691-
FlutterViewId view_id = fl_engine_add_view(engine, 123, 456, 2.0, nullptr,
692-
add_view_error_cb, loop);
694+
g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
695+
FlutterViewId view_id =
696+
fl_engine_add_view(engine, FL_RENDERABLE(renderable), 123, 456, 2.0,
697+
nullptr, add_view_error_cb, loop);
693698
EXPECT_GT(view_id, 0);
694699

695700
// Blocks here until add_view_error_cb is called.
@@ -718,8 +723,10 @@ TEST(FlEngineTest, AddViewEngineError) {
718723
return kInvalidArguments;
719724
}));
720725

721-
FlutterViewId view_id = fl_engine_add_view(engine, 123, 456, 2.0, nullptr,
722-
add_view_engine_error_cb, loop);
726+
g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
727+
FlutterViewId view_id =
728+
fl_engine_add_view(engine, FL_RENDERABLE(renderable), 123, 456, 2.0,
729+
nullptr, add_view_engine_error_cb, loop);
723730
EXPECT_GT(view_id, 0);
724731

725732
// Blocks here until remove_view_engine_error_cb is called.

engine/src/flutter/shell/platform/linux/fl_renderer.cc

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,6 @@ typedef struct {
5151
// The format used to create textures.
5252
GLint general_format;
5353

54-
// Views being rendered.
55-
GHashTable* views;
56-
5754
// target dimension for resizing
5855
int target_width;
5956
int target_height;
@@ -85,12 +82,6 @@ typedef struct {
8582

8683
G_DEFINE_TYPE_WITH_PRIVATE(FlRenderer, fl_renderer, G_TYPE_OBJECT)
8784

88-
static void free_weak_ref(gpointer value) {
89-
GWeakRef* ref = static_cast<GWeakRef*>(value);
90-
g_weak_ref_clear(ref);
91-
free(ref);
92-
}
93-
9485
// Check if running on an NVIDIA driver.
9586
static gboolean is_nvidia() {
9687
const gchar* vendor = reinterpret_cast<const gchar*>(glGetString(GL_VENDOR));
@@ -349,10 +340,12 @@ static gboolean present_layers(FlRenderer* self,
349340
}
350341
}
351342

352-
GWeakRef* ref = static_cast<GWeakRef*>(
353-
g_hash_table_lookup(priv->views, GINT_TO_POINTER(view_id)));
343+
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&priv->engine));
344+
if (engine == nullptr) {
345+
return TRUE;
346+
}
354347
g_autoptr(FlRenderable) renderable =
355-
ref != nullptr ? FL_RENDERABLE(g_weak_ref_get(ref)) : nullptr;
348+
fl_engine_get_renderable(engine, view_id);
356349
if (renderable == nullptr) {
357350
return TRUE;
358351
}
@@ -462,7 +455,6 @@ static void fl_renderer_dispose(GObject* object) {
462455
fl_renderer_unblock_main_thread(self);
463456

464457
g_weak_ref_clear(&priv->engine);
465-
g_clear_pointer(&priv->views, g_hash_table_unref);
466458
g_clear_pointer(&priv->framebuffers_by_view_id, g_hash_table_unref);
467459
g_mutex_clear(&priv->present_mutex);
468460
g_cond_clear(&priv->present_condition);
@@ -477,8 +469,6 @@ static void fl_renderer_class_init(FlRendererClass* klass) {
477469
static void fl_renderer_init(FlRenderer* self) {
478470
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
479471
fl_renderer_get_instance_private(self));
480-
priv->views = g_hash_table_new_full(g_direct_hash, g_direct_equal, nullptr,
481-
free_weak_ref);
482472
priv->framebuffers_by_view_id = g_hash_table_new_full(
483473
g_direct_hash, g_direct_equal, nullptr,
484474
reinterpret_cast<GDestroyNotify>(g_ptr_array_unref));
@@ -495,28 +485,6 @@ void fl_renderer_set_engine(FlRenderer* self, FlEngine* engine) {
495485
g_weak_ref_init(&priv->engine, engine);
496486
}
497487

498-
void fl_renderer_add_renderable(FlRenderer* self,
499-
FlutterViewId view_id,
500-
FlRenderable* renderable) {
501-
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
502-
fl_renderer_get_instance_private(self));
503-
504-
g_return_if_fail(FL_IS_RENDERER(self));
505-
506-
GWeakRef* ref = g_new(GWeakRef, 1);
507-
g_weak_ref_init(ref, G_OBJECT(renderable));
508-
g_hash_table_insert(priv->views, GINT_TO_POINTER(view_id), ref);
509-
}
510-
511-
void fl_renderer_remove_view(FlRenderer* self, FlutterViewId view_id) {
512-
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
513-
fl_renderer_get_instance_private(self));
514-
515-
g_return_if_fail(FL_IS_RENDERER(self));
516-
517-
g_hash_table_remove(priv->views, GINT_TO_POINTER(view_id));
518-
}
519-
520488
void* fl_renderer_get_proc_address(FlRenderer* self, const char* name) {
521489
g_return_val_if_fail(FL_IS_RENDERER(self), NULL);
522490

engine/src/flutter/shell/platform/linux/fl_renderer.h

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,27 +66,6 @@ struct _FlRendererClass {
6666
*/
6767
void fl_renderer_set_engine(FlRenderer* renderer, FlEngine* engine);
6868

69-
/**
70-
* fl_renderer_add_renderable:
71-
* @renderer: an #FlRenderer.
72-
* @view_id: the ID of the view.
73-
* @renderable: object that is to be rendered on.
74-
*
75-
* Add a view to render on.
76-
*/
77-
void fl_renderer_add_renderable(FlRenderer* renderer,
78-
FlutterViewId view_id,
79-
FlRenderable* renderable);
80-
81-
/**
82-
* fl_renderer_remove_view:
83-
* @renderer: an #FlRenderer.
84-
* @view_id: the ID of the view.
85-
*
86-
* Remove a view from the renderer.
87-
*/
88-
void fl_renderer_remove_view(FlRenderer* renderer, FlutterViewId view_id);
89-
9069
/**
9170
* fl_renderer_get_proc_address:
9271
* @renderer: an #FlRenderer.

0 commit comments

Comments
 (0)