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 all 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
4 changes: 2 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
22 changes: 15 additions & 7 deletions shell/platform/linux/fl_renderer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ typedef struct {
// Engine we are rendering.
GWeakRef engine;

FlView* view;
// Views being rendered.
GHashTable* views;

// target dimension for resizing
int target_width;
Expand Down Expand Up @@ -244,6 +245,7 @@ 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 @@ -256,6 +258,8 @@ 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);
}

Expand All @@ -268,14 +272,15 @@ void fl_renderer_set_engine(FlRenderer* self, FlEngine* engine) {
g_weak_ref_init(&priv->engine, engine);
}

gboolean fl_renderer_start(FlRenderer* self, FlView* view) {
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_val_if_fail(FL_IS_RENDERER(self), FALSE);
g_return_if_fail(FL_IS_RENDERER(self));

priv->view = view;
return TRUE;
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 @@ -370,6 +375,7 @@ void fl_renderer_wait_for_frame(FlRenderer* self,
}

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 @@ -407,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
13 changes: 8 additions & 5 deletions shell/platform/linux/fl_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,16 @@ struct _FlRendererClass {
void fl_renderer_set_engine(FlRenderer* renderer, FlEngine* engine);

/**
* fl_renderer_start:
* fl_renderer_add_view:
* @renderer: an #FlRenderer.
* @view_id: the ID of the view.
* @view: the view Flutter is renderering to.
*
* Start the renderer.
*
* 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 @@ -189,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 @@ -198,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