Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions shell/platform/linux/fl_engine.cc
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,8 @@ static bool compositor_collect_backing_store_callback(
static bool compositor_present_view_callback(
const FlutterPresentViewInfo* info) {
g_return_val_if_fail(FL_IS_RENDERER(info->user_data), false);
return fl_renderer_present_layers(FL_RENDERER(info->user_data), info->layers,
info->layers_count);
return fl_renderer_present_layers(FL_RENDERER(info->user_data), info->view_id,
info->layers, info->layers_count);
}

// Flutter engine rendering callbacks.
Expand Down Expand Up @@ -469,6 +469,9 @@ FlEngine* fl_engine_new(FlDartProject* project, FlRenderer* renderer) {
self->project = FL_DART_PROJECT(g_object_ref(project));
self->renderer = FL_RENDERER(g_object_ref(renderer));
self->binary_messenger = fl_binary_messenger_new(self);

fl_renderer_set_engine(self->renderer, self);

return self;
}

Expand Down
49 changes: 36 additions & 13 deletions shell/platform/linux/fl_renderer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,11 @@ static const char* fragment_shader_src =
G_DEFINE_QUARK(fl_renderer_error_quark, fl_renderer_error)

typedef struct {
FlView* view;
// Engine we are rendering.
GWeakRef engine;

// Views being rendered.
GHashTable* views;

// target dimension for resizing
int target_width;
Expand Down Expand Up @@ -103,9 +107,10 @@ static void fl_renderer_unblock_main_thread(FlRenderer* self) {
if (priv->blocking_main_thread) {
priv->blocking_main_thread = false;

FlTaskRunner* runner =
fl_engine_get_task_runner(fl_view_get_engine(priv->view));
fl_task_runner_release_main_thread(runner);
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&priv->engine));
if (engine != nullptr) {
fl_task_runner_release_main_thread(fl_engine_get_task_runner(engine));
}
}
}

Expand Down Expand Up @@ -239,6 +244,8 @@ static void fl_renderer_dispose(GObject* object) {

fl_renderer_unblock_main_thread(self);

g_weak_ref_clear(&priv->engine);
g_clear_pointer(&priv->views, g_hash_table_unref);
g_clear_pointer(&priv->framebuffers, g_ptr_array_unref);

G_OBJECT_CLASS(fl_renderer_parent_class)->dispose(object);
Expand All @@ -251,17 +258,29 @@ static void fl_renderer_class_init(FlRendererClass* klass) {
static void fl_renderer_init(FlRenderer* self) {
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
fl_renderer_get_instance_private(self));
priv->views =
g_hash_table_new_full(g_direct_hash, g_direct_equal, nullptr, nullptr);
priv->framebuffers = g_ptr_array_new_with_free_func(g_object_unref);
}

gboolean fl_renderer_start(FlRenderer* self, FlView* view) {
void fl_renderer_set_engine(FlRenderer* self, FlEngine* engine) {
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
fl_renderer_get_instance_private(self));

g_return_val_if_fail(FL_IS_RENDERER(self), FALSE);
g_return_if_fail(FL_IS_RENDERER(self));

priv->view = view;
return TRUE;
g_weak_ref_init(&priv->engine, engine);
}

void fl_renderer_add_view(FlRenderer* self,
FlutterViewId view_id,
FlView* view) {
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
fl_renderer_get_instance_private(self));

g_return_if_fail(FL_IS_RENDERER(self));

g_hash_table_insert(priv->views, GINT_TO_POINTER(view_id), view);
}

void* fl_renderer_get_proc_address(FlRenderer* self, const char* name) {
Expand Down Expand Up @@ -348,13 +367,15 @@ void fl_renderer_wait_for_frame(FlRenderer* self,

if (priv->had_first_frame && !priv->blocking_main_thread) {
priv->blocking_main_thread = true;
FlTaskRunner* runner =
fl_engine_get_task_runner(fl_view_get_engine(priv->view));
fl_task_runner_block_main_thread(runner);
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&priv->engine));
if (engine != nullptr) {
fl_task_runner_block_main_thread(fl_engine_get_task_runner(engine));
}
}
}

gboolean fl_renderer_present_layers(FlRenderer* self,
FlutterViewId view_id,
const FlutterLayer** layers,
size_t layers_count) {
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
Expand Down Expand Up @@ -392,8 +413,10 @@ gboolean fl_renderer_present_layers(FlRenderer* self,
}
}

if (priv->view != nullptr) {
fl_view_redraw(priv->view);
FlView* view =
FL_VIEW(g_hash_table_lookup(priv->views, GINT_TO_POINTER(view_id)));
if (view != nullptr) {
fl_view_redraw(view);
}

return TRUE;
Expand Down
22 changes: 17 additions & 5 deletions shell/platform/linux/fl_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,15 +93,25 @@ struct _FlRendererClass {
};

/**
* fl_renderer_start:
* fl_renderer_set_engine:
* @renderer: an #FlRenderer.
* @view: the view Flutter is renderering to.
* @engine: an #FlEngine.
*
* Start the renderer.
* Called when the renderer is connected to an engine.
*/
void fl_renderer_set_engine(FlRenderer* renderer, FlEngine* engine);

/**
* fl_renderer_add_view:
* @renderer: an #FlRenderer.
* @view_id: the ID of the view.
* @view: the view Flutter is renderering to.
*
* Returns: %TRUE if successfully started.
* Add a view to render on.
*/
gboolean fl_renderer_start(FlRenderer* renderer, FlView* view);
void fl_renderer_add_view(FlRenderer* renderer,
FlutterViewId view_id,
FlView* view);

/**
* fl_renderer_get_proc_address:
Expand Down Expand Up @@ -180,6 +190,7 @@ gboolean fl_renderer_collect_backing_store(
/**
* fl_renderer_present_layers:
* @renderer: an #FlRenderer.
* @view_id: view to present.
* @layers: layers to be composited.
* @layers_count: number of layers.
*
Expand All @@ -189,6 +200,7 @@ gboolean fl_renderer_collect_backing_store(
* Returns %TRUE if successful.
*/
gboolean fl_renderer_present_layers(FlRenderer* renderer,
FlutterViewId view_id,
const FlutterLayer** layers,
size_t layers_count);

Expand Down
12 changes: 6 additions & 6 deletions shell/platform/linux/fl_renderer_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ TEST(FlRendererTest, RestoresGLState) {
g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new();
g_autoptr(FlFramebuffer) framebuffer = fl_framebuffer_new(kWidth, kHeight);

fl_renderer_start(FL_RENDERER(renderer), view);
fl_renderer_add_view(FL_RENDERER(renderer), 0, view);
fl_renderer_wait_for_frame(FL_RENDERER(renderer), kWidth, kHeight);

FlutterBackingStore backing_store;
Expand All @@ -42,7 +42,7 @@ TEST(FlRendererTest, RestoresGLState) {
constexpr GLuint kFakeTextureName = 123;
glBindTexture(GL_TEXTURE_2D, kFakeTextureName);

fl_renderer_present_layers(FL_RENDERER(renderer), layers.data(),
fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers.data(),
layers.size());
fl_renderer_render(FL_RENDERER(renderer), kWidth, kHeight);

Expand Down Expand Up @@ -97,7 +97,7 @@ TEST(FlRendererTest, BlitFramebuffer) {
.backing_store = &backing_store,
.size = {.width = 1024, .height = 1024}};
const FlutterLayer* layers[] = {&layer0};
fl_renderer_present_layers(FL_RENDERER(renderer), layers, 1);
fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1);
fl_renderer_render(FL_RENDERER(renderer), 1024, 1024);
}

Expand Down Expand Up @@ -131,7 +131,7 @@ TEST(FlRendererTest, BlitFramebufferExtension) {
.backing_store = &backing_store,
.size = {.width = 1024, .height = 1024}};
const FlutterLayer* layers[] = {&layer0};
fl_renderer_present_layers(FL_RENDERER(renderer), layers, 1);
fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1);
fl_renderer_render(FL_RENDERER(renderer), 1024, 1024);
}

Expand Down Expand Up @@ -160,7 +160,7 @@ TEST(FlRendererTest, NoBlitFramebuffer) {
.backing_store = &backing_store,
.size = {.width = 1024, .height = 1024}};
const FlutterLayer* layers[] = {&layer0};
fl_renderer_present_layers(FL_RENDERER(renderer), layers, 1);
fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1);
fl_renderer_render(FL_RENDERER(renderer), 1024, 1024);
}

Expand Down Expand Up @@ -190,6 +190,6 @@ TEST(FlRendererTest, BlitFramebufferNvidia) {
.backing_store = &backing_store,
.size = {.width = 1024, .height = 1024}};
const FlutterLayer* layers[] = {&layer0};
fl_renderer_present_layers(FL_RENDERER(renderer), layers, 1);
fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1);
fl_renderer_render(FL_RENDERER(renderer), 1024, 1024);
}
2 changes: 1 addition & 1 deletion shell/platform/linux/fl_view.cc
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ static void realize_cb(FlView* self) {

init_keyboard(self);

fl_renderer_start(FL_RENDERER(self->renderer), self);
fl_renderer_add_view(FL_RENDERER(self->renderer), self->view_id, self);

if (!fl_engine_start(self->engine, &error)) {
g_warning("Failed to start Flutter engine: %s", error->message);
Expand Down