From 91edb0523bf4e94ffb7b149640adfb7c2f671825 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 16 Aug 2024 12:49:08 +1200 Subject: [PATCH 1/6] Allow the default background color to be changed Note when using a transparent background from Flutter and using glBlitFramebuffer the background is not shown, and instead the background is always black. This may mean we cannot use glBlitFramebuffer in this case. Setting the background color with an alpha value less than 1.0 doesn't currently show the GTK background. This needs more investigation. The above two issues will tracked as separate issues/fixes. Fixes https://github.com/flutter/flutter/issues/149920 --- shell/platform/linux/fl_renderer.cc | 17 ++++- shell/platform/linux/fl_renderer.h | 6 +- shell/platform/linux/fl_renderer_test.cc | 76 +++++++++++++++---- shell/platform/linux/fl_view.cc | 13 +++- .../linux/public/flutter_linux/fl_view.h | 9 +++ shell/platform/linux/testing/mock_epoxy.cc | 5 ++ shell/platform/linux/testing/mock_epoxy.h | 1 + 7 files changed, 110 insertions(+), 17 deletions(-) diff --git a/shell/platform/linux/fl_renderer.cc b/shell/platform/linux/fl_renderer.cc index 1abdcd0172038..14477f0be07e1 100644 --- a/shell/platform/linux/fl_renderer.cc +++ b/shell/platform/linux/fl_renderer.cc @@ -195,6 +195,9 @@ static void render_with_textures(FlRenderer* self, int width, int height) { GLint saved_array_buffer_binding; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &saved_array_buffer_binding); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glUseProgram(priv->program); for (guint i = 0; i < priv->framebuffers->len; i++) { @@ -236,6 +239,8 @@ static void render_with_textures(FlRenderer* self, int width, int height) { glDeleteBuffers(1, &vertex_buffer); } + glDisable(GL_BLEND); + glBindTexture(GL_TEXTURE_2D, saved_texture_binding); glBindVertexArray(saved_vao_binding); glBindBuffer(GL_ARRAY_BUFFER, saved_array_buffer_binding); @@ -443,13 +448,21 @@ void fl_renderer_setup(FlRenderer* self) { } } -void fl_renderer_render(FlRenderer* self, int width, int height) { +void fl_renderer_render(FlRenderer* self, + int width, + int height, + GdkRGBA* background_color) { FlRendererPrivate* priv = reinterpret_cast( fl_renderer_get_instance_private(self)); g_return_if_fail(FL_IS_RENDERER(self)); - glClearColor(0.0, 0.0, 0.0, 1.0); + if (background_color != nullptr) { + glClearColor(background_color->red, background_color->green, + background_color->blue, background_color->alpha); + } else { + glClearColor(0.0, 0.0, 0.0, 1.0); + } glClear(GL_COLOR_BUFFER_BIT); if (priv->has_gl_framebuffer_blit) { diff --git a/shell/platform/linux/fl_renderer.h b/shell/platform/linux/fl_renderer.h index c8af204906f68..b9986e2e2af27 100644 --- a/shell/platform/linux/fl_renderer.h +++ b/shell/platform/linux/fl_renderer.h @@ -209,10 +209,14 @@ void fl_renderer_setup(FlRenderer* renderer); * @renderer: an #FlRenderer. * @width: width of the window in pixels. * @height: height of the window in pixels. + * @background_color: color to use for background. * * Performs OpenGL commands to render current Flutter view. */ -void fl_renderer_render(FlRenderer* renderer, int width, int height); +void fl_renderer_render(FlRenderer* renderer, + int width, + int height, + GdkRGBA* background_color); /** * fl_renderer_cleanup: diff --git a/shell/platform/linux/fl_renderer_test.cc b/shell/platform/linux/fl_renderer_test.cc index 1426e4ec8b136..0afd07d457fa3 100644 --- a/shell/platform/linux/fl_renderer_test.cc +++ b/shell/platform/linux/fl_renderer_test.cc @@ -12,6 +12,60 @@ #include +TEST(FlRendererTest, DefaultBackgroundColor) { + ::testing::NiceMock epoxy; + + ON_CALL(epoxy, glGetString(GL_VENDOR)) + .WillByDefault( + ::testing::Return(reinterpret_cast("Intel"))); + EXPECT_CALL(epoxy, glClearColor(0.0, 0.0, 0.0, 1.0)); + + g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new(); + fl_renderer_setup(FL_RENDERER(renderer)); + fl_renderer_wait_for_frame(FL_RENDERER(renderer), 1024, 1024); + FlutterBackingStoreConfig config = { + .struct_size = sizeof(FlutterBackingStoreConfig), + .size = {.width = 1024, .height = 1024}}; + FlutterBackingStore backing_store; + fl_renderer_create_backing_store(FL_RENDERER(renderer), &config, + &backing_store); + const FlutterLayer layer0 = {.struct_size = sizeof(FlutterLayer), + .type = kFlutterLayerContentTypeBackingStore, + .backing_store = &backing_store, + .size = {.width = 1024, .height = 1024}}; + const FlutterLayer* layers[] = {&layer0}; + fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); +} + +TEST(FlRendererTest, CustomBackgroundColor) { + ::testing::NiceMock epoxy; + + ON_CALL(epoxy, glGetString(GL_VENDOR)) + .WillByDefault( + ::testing::Return(reinterpret_cast("Intel"))); + EXPECT_CALL(epoxy, glClearColor(0.2, 0.3, 0.4, 0.5)); + + g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new(); + fl_renderer_setup(FL_RENDERER(renderer)); + fl_renderer_wait_for_frame(FL_RENDERER(renderer), 1024, 1024); + FlutterBackingStoreConfig config = { + .struct_size = sizeof(FlutterBackingStoreConfig), + .size = {.width = 1024, .height = 1024}}; + FlutterBackingStore backing_store; + fl_renderer_create_backing_store(FL_RENDERER(renderer), &config, + &backing_store); + const FlutterLayer layer0 = {.struct_size = sizeof(FlutterLayer), + .type = kFlutterLayerContentTypeBackingStore, + .backing_store = &backing_store, + .size = {.width = 1024, .height = 1024}}; + const FlutterLayer* layers[] = {&layer0}; + fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); + GdkRGBA background_color = { + .red = 0.2, .green = 0.3, .blue = 0.4, .alpha = 0.5}; + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, &background_color); +} + TEST(FlRendererTest, RestoresGLState) { ::testing::NiceMock epoxy; @@ -44,7 +98,7 @@ TEST(FlRendererTest, RestoresGLState) { fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers.data(), layers.size()); - fl_renderer_render(FL_RENDERER(renderer), kWidth, kHeight); + fl_renderer_render(FL_RENDERER(renderer), kWidth, kHeight, nullptr); GLuint texture_2d_binding; glGetIntegerv(GL_TEXTURE_BINDING_2D, @@ -82,8 +136,7 @@ TEST(FlRendererTest, BlitFramebuffer) { EXPECT_CALL(epoxy, glBlitFramebuffer); - g_autoptr(FlMockRenderer) renderer = - fl_mock_renderer_new(&renderer_get_refresh_rate); + g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new(); fl_renderer_setup(FL_RENDERER(renderer)); fl_renderer_wait_for_frame(FL_RENDERER(renderer), 1024, 1024); FlutterBackingStoreConfig config = { @@ -98,7 +151,7 @@ TEST(FlRendererTest, BlitFramebuffer) { .size = {.width = 1024, .height = 1024}}; const FlutterLayer* layers[] = {&layer0}; fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024); + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); } TEST(FlRendererTest, BlitFramebufferExtension) { @@ -116,8 +169,7 @@ TEST(FlRendererTest, BlitFramebufferExtension) { EXPECT_CALL(epoxy, glBlitFramebuffer); - g_autoptr(FlMockRenderer) renderer = - fl_mock_renderer_new(&renderer_get_refresh_rate); + g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new(); fl_renderer_setup(FL_RENDERER(renderer)); fl_renderer_wait_for_frame(FL_RENDERER(renderer), 1024, 1024); FlutterBackingStoreConfig config = { @@ -132,7 +184,7 @@ TEST(FlRendererTest, BlitFramebufferExtension) { .size = {.width = 1024, .height = 1024}}; const FlutterLayer* layers[] = {&layer0}; fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024); + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); } TEST(FlRendererTest, NoBlitFramebuffer) { @@ -145,8 +197,7 @@ TEST(FlRendererTest, NoBlitFramebuffer) { ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(true)); EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(20)); - g_autoptr(FlMockRenderer) renderer = - fl_mock_renderer_new(&renderer_get_refresh_rate); + g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new(); fl_renderer_setup(FL_RENDERER(renderer)); fl_renderer_wait_for_frame(FL_RENDERER(renderer), 1024, 1024); FlutterBackingStoreConfig config = { @@ -161,7 +212,7 @@ TEST(FlRendererTest, NoBlitFramebuffer) { .size = {.width = 1024, .height = 1024}}; const FlutterLayer* layers[] = {&layer0}; fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024); + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); } TEST(FlRendererTest, BlitFramebufferNvidia) { @@ -175,8 +226,7 @@ TEST(FlRendererTest, BlitFramebufferNvidia) { ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(true)); EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30)); - g_autoptr(FlMockRenderer) renderer = - fl_mock_renderer_new(&renderer_get_refresh_rate); + g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new(); fl_renderer_setup(FL_RENDERER(renderer)); fl_renderer_wait_for_frame(FL_RENDERER(renderer), 1024, 1024); FlutterBackingStoreConfig config = { @@ -191,5 +241,5 @@ TEST(FlRendererTest, BlitFramebufferNvidia) { .size = {.width = 1024, .height = 1024}}; const FlutterLayer* layers[] = {&layer0}; fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024); + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); } diff --git a/shell/platform/linux/fl_view.cc b/shell/platform/linux/fl_view.cc index 77414b07cba45..90ada4303e007 100644 --- a/shell/platform/linux/fl_view.cc +++ b/shell/platform/linux/fl_view.cc @@ -46,6 +46,9 @@ struct _FlView { // Rendering output. FlRendererGdk* renderer; + // Background color. + GdkRGBA* background_color; + // Pointer button state recorded for sending status updates. int64_t button_state; @@ -607,7 +610,7 @@ static gboolean render_cb(FlView* self, GdkGLContext* context) { int height = gtk_widget_get_allocated_height(GTK_WIDGET(self->gl_area)); gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self->gl_area)); fl_renderer_render(FL_RENDERER(self->renderer), width * scale_factor, - height * scale_factor); + height * scale_factor, self->background_color); return TRUE; } @@ -654,6 +657,7 @@ static void fl_view_dispose(GObject* object) { g_clear_object(&self->engine); g_clear_object(&self->renderer); + g_clear_pointer(&self->background_color, gdk_rgba_free); g_clear_object(&self->window_state_monitor); g_clear_object(&self->scrolling_manager); g_clear_object(&self->keyboard_handler); @@ -785,6 +789,13 @@ G_MODULE_EXPORT FlEngine* fl_view_get_engine(FlView* self) { return self->engine; } +G_MODULE_EXPORT void fl_view_set_background_color(FlView* self, + const GdkRGBA* color) { + g_return_if_fail(FL_IS_VIEW(self)); + gdk_rgba_free(self->background_color); + self->background_color = gdk_rgba_copy(color); +} + void fl_view_redraw(FlView* self) { g_return_if_fail(FL_IS_VIEW(self)); gtk_widget_queue_draw(GTK_WIDGET(self->gl_area)); diff --git a/shell/platform/linux/public/flutter_linux/fl_view.h b/shell/platform/linux/public/flutter_linux/fl_view.h index 663e3d1500891..843e23c9f0a3e 100644 --- a/shell/platform/linux/public/flutter_linux/fl_view.h +++ b/shell/platform/linux/public/flutter_linux/fl_view.h @@ -69,6 +69,15 @@ FlView* fl_view_new_for_engine(FlEngine* engine); */ FlEngine* fl_view_get_engine(FlView* view); +/** + * fl_view_set_background_color: + * @view: an #FlView. + * @color: a background color. + * + * Set the background color for Flutter (defaults to black). + */ +void fl_view_set_background_color(FlView* view, const GdkRGBA* color); + G_END_DECLS #endif // FLUTTER_SHELL_PLATFORM_LINUX_PUBLIC_FLUTTER_LINUX_FL_VIEW_H_ diff --git a/shell/platform/linux/testing/mock_epoxy.cc b/shell/platform/linux/testing/mock_epoxy.cc index 5f68e1d54c90f..b6a2cc38ea76f 100644 --- a/shell/platform/linux/testing/mock_epoxy.cc +++ b/shell/platform/linux/testing/mock_epoxy.cc @@ -382,6 +382,10 @@ GLuint _glCreateProgram() { void _glCompileShader(GLuint shader) {} +void _glClearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { + mock->glClearColor(r, g, b, a); +} + GLuint _glCreateShader(GLenum shaderType) { return 0; } @@ -594,6 +598,7 @@ static void library_init() { epoxy_glBindTexture = _glBindTexture; epoxy_glBlitFramebuffer = _glBlitFramebuffer; epoxy_glCompileShader = _glCompileShader; + epoxy_glClearColor = _glClearColor; epoxy_glCreateProgram = _glCreateProgram; epoxy_glCreateShader = _glCreateShader; epoxy_glDeleteFramebuffers = _glDeleteFramebuffers; diff --git a/shell/platform/linux/testing/mock_epoxy.h b/shell/platform/linux/testing/mock_epoxy.h index 02eef6c239df9..846d43420ba1f 100644 --- a/shell/platform/linux/testing/mock_epoxy.h +++ b/shell/platform/linux/testing/mock_epoxy.h @@ -20,6 +20,7 @@ class MockEpoxy { MOCK_METHOD(bool, epoxy_has_gl_extension, (const char* extension)); MOCK_METHOD(bool, epoxy_is_desktop_gl, ()); MOCK_METHOD(int, epoxy_gl_version, ()); + MOCK_METHOD(void, glClearColor, (GLfloat r, GLfloat g, GLfloat b, GLfloat a)); MOCK_METHOD(void, glBlitFramebuffer, (GLint srcX0, From 755b1144fc9df836ca4ccb563339c0585d037b93 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 19 Aug 2024 11:35:51 +1200 Subject: [PATCH 2/6] Update shell/platform/linux/fl_renderer.cc Co-authored-by: Chris Bracken --- shell/platform/linux/fl_renderer.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/linux/fl_renderer.cc b/shell/platform/linux/fl_renderer.cc index 14477f0be07e1..b7d398406a817 100644 --- a/shell/platform/linux/fl_renderer.cc +++ b/shell/platform/linux/fl_renderer.cc @@ -461,6 +461,7 @@ void fl_renderer_render(FlRenderer* self, glClearColor(background_color->red, background_color->green, background_color->blue, background_color->alpha); } else { + // Set default view background color to black. glClearColor(0.0, 0.0, 0.0, 1.0); } glClear(GL_COLOR_BUFFER_BIT); From 57012ec7223b548aa80919c450c458536fa300bf Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 19 Aug 2024 11:57:58 +1200 Subject: [PATCH 3/6] Move background default to FlView --- shell/platform/linux/fl_renderer.cc | 11 ++---- shell/platform/linux/fl_renderer.h | 2 +- shell/platform/linux/fl_renderer_test.cc | 48 ++++++++---------------- shell/platform/linux/fl_view.cc | 4 ++ 4 files changed, 24 insertions(+), 41 deletions(-) diff --git a/shell/platform/linux/fl_renderer.cc b/shell/platform/linux/fl_renderer.cc index b7d398406a817..3fdaef624cd6b 100644 --- a/shell/platform/linux/fl_renderer.cc +++ b/shell/platform/linux/fl_renderer.cc @@ -451,19 +451,14 @@ void fl_renderer_setup(FlRenderer* self) { void fl_renderer_render(FlRenderer* self, int width, int height, - GdkRGBA* background_color) { + const GdkRGBA* background_color) { FlRendererPrivate* priv = reinterpret_cast( fl_renderer_get_instance_private(self)); g_return_if_fail(FL_IS_RENDERER(self)); - if (background_color != nullptr) { - glClearColor(background_color->red, background_color->green, - background_color->blue, background_color->alpha); - } else { - // Set default view background color to black. - glClearColor(0.0, 0.0, 0.0, 1.0); - } + glClearColor(background_color->red, background_color->green, + background_color->blue, background_color->alpha); glClear(GL_COLOR_BUFFER_BIT); if (priv->has_gl_framebuffer_blit) { diff --git a/shell/platform/linux/fl_renderer.h b/shell/platform/linux/fl_renderer.h index b9986e2e2af27..648c535f0eaa9 100644 --- a/shell/platform/linux/fl_renderer.h +++ b/shell/platform/linux/fl_renderer.h @@ -216,7 +216,7 @@ void fl_renderer_setup(FlRenderer* renderer); void fl_renderer_render(FlRenderer* renderer, int width, int height, - GdkRGBA* background_color); + const GdkRGBA* background_color); /** * fl_renderer_cleanup: diff --git a/shell/platform/linux/fl_renderer_test.cc b/shell/platform/linux/fl_renderer_test.cc index 0afd07d457fa3..737832e3c9d4e 100644 --- a/shell/platform/linux/fl_renderer_test.cc +++ b/shell/platform/linux/fl_renderer_test.cc @@ -12,33 +12,7 @@ #include -TEST(FlRendererTest, DefaultBackgroundColor) { - ::testing::NiceMock epoxy; - - ON_CALL(epoxy, glGetString(GL_VENDOR)) - .WillByDefault( - ::testing::Return(reinterpret_cast("Intel"))); - EXPECT_CALL(epoxy, glClearColor(0.0, 0.0, 0.0, 1.0)); - - g_autoptr(FlMockRenderer) renderer = fl_mock_renderer_new(); - fl_renderer_setup(FL_RENDERER(renderer)); - fl_renderer_wait_for_frame(FL_RENDERER(renderer), 1024, 1024); - FlutterBackingStoreConfig config = { - .struct_size = sizeof(FlutterBackingStoreConfig), - .size = {.width = 1024, .height = 1024}}; - FlutterBackingStore backing_store; - fl_renderer_create_backing_store(FL_RENDERER(renderer), &config, - &backing_store); - const FlutterLayer layer0 = {.struct_size = sizeof(FlutterLayer), - .type = kFlutterLayerContentTypeBackingStore, - .backing_store = &backing_store, - .size = {.width = 1024, .height = 1024}}; - const FlutterLayer* layers[] = {&layer0}; - fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); -} - -TEST(FlRendererTest, CustomBackgroundColor) { +TEST(FlRendererTest, BackgroundColor) { ::testing::NiceMock epoxy; ON_CALL(epoxy, glGetString(GL_VENDOR)) @@ -98,7 +72,9 @@ TEST(FlRendererTest, RestoresGLState) { fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers.data(), layers.size()); - fl_renderer_render(FL_RENDERER(renderer), kWidth, kHeight, nullptr); + GdkRGBA background_color = { + .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0}; + fl_renderer_render(FL_RENDERER(renderer), kWidth, kHeight, &background_color); GLuint texture_2d_binding; glGetIntegerv(GL_TEXTURE_BINDING_2D, @@ -151,7 +127,9 @@ TEST(FlRendererTest, BlitFramebuffer) { .size = {.width = 1024, .height = 1024}}; const FlutterLayer* layers[] = {&layer0}; fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); + GdkRGBA background_color = { + .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0}; + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, &background_color); } TEST(FlRendererTest, BlitFramebufferExtension) { @@ -184,7 +162,9 @@ TEST(FlRendererTest, BlitFramebufferExtension) { .size = {.width = 1024, .height = 1024}}; const FlutterLayer* layers[] = {&layer0}; fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); + GdkRGBA background_color = { + .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0}; + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, &background_color); } TEST(FlRendererTest, NoBlitFramebuffer) { @@ -212,7 +192,9 @@ TEST(FlRendererTest, NoBlitFramebuffer) { .size = {.width = 1024, .height = 1024}}; const FlutterLayer* layers[] = {&layer0}; fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); + GdkRGBA background_color = { + .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0}; + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, &background_color); } TEST(FlRendererTest, BlitFramebufferNvidia) { @@ -241,5 +223,7 @@ TEST(FlRendererTest, BlitFramebufferNvidia) { .size = {.width = 1024, .height = 1024}}; const FlutterLayer* layers[] = {&layer0}; fl_renderer_present_layers(FL_RENDERER(renderer), 0, layers, 1); - fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, nullptr); + GdkRGBA background_color = { + .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0}; + fl_renderer_render(FL_RENDERER(renderer), 1024, 1024, &background_color); } diff --git a/shell/platform/linux/fl_view.cc b/shell/platform/linux/fl_view.cc index 90ada4303e007..cae6199694c12 100644 --- a/shell/platform/linux/fl_view.cc +++ b/shell/platform/linux/fl_view.cc @@ -710,6 +710,10 @@ static void fl_view_init(FlView* self) { // https://github.com/flutter/flutter/issues/138178 self->view_id = flutter::kFlutterImplicitViewId; + GdkRGBA default_background = { + .red = 0.0, .green = 0.0, .blue = 0.0, .alpha = 1.0}; + self->background_color = gdk_rgba_copy(&default_background); + self->event_box = gtk_event_box_new(); gtk_widget_set_hexpand(self->event_box, TRUE); gtk_widget_set_vexpand(self->event_box, TRUE); From 3dd1877355fed33422f1c262376ddea9c5ac50a3 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 19 Aug 2024 14:34:40 +1200 Subject: [PATCH 4/6] Allow the view to be transparent --- shell/platform/linux/fl_view.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/linux/fl_view.cc b/shell/platform/linux/fl_view.cc index cae6199694c12..1874b265b2529 100644 --- a/shell/platform/linux/fl_view.cc +++ b/shell/platform/linux/fl_view.cc @@ -751,6 +751,7 @@ static void fl_view_init(FlView* self) { self); self->gl_area = GTK_GL_AREA(gtk_gl_area_new()); + gtk_gl_area_set_has_alpha(self->gl_area, TRUE); gtk_widget_show(GTK_WIDGET(self->gl_area)); gtk_container_add(GTK_CONTAINER(self->event_box), GTK_WIDGET(self->gl_area)); From e5aeeff5fe0a131f311231748342314a558b4ea4 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 19 Aug 2024 15:31:43 +1200 Subject: [PATCH 5/6] Fix background test causing a g_critical --- shell/platform/linux/fl_renderer_test.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/linux/fl_renderer_test.cc b/shell/platform/linux/fl_renderer_test.cc index 737832e3c9d4e..3d79dffe66c08 100644 --- a/shell/platform/linux/fl_renderer_test.cc +++ b/shell/platform/linux/fl_renderer_test.cc @@ -15,6 +15,7 @@ TEST(FlRendererTest, BackgroundColor) { ::testing::NiceMock epoxy; + ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(true)); ON_CALL(epoxy, glGetString(GL_VENDOR)) .WillByDefault( ::testing::Return(reinterpret_cast("Intel"))); From 80134695b0b9b49f3213ad2e7f120ef2b85bfd99 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 19 Aug 2024 16:46:43 +1200 Subject: [PATCH 6/6] Fix background test causing a g_critical --- shell/platform/linux/fl_renderer_test.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/linux/fl_renderer_test.cc b/shell/platform/linux/fl_renderer_test.cc index 3d79dffe66c08..015c9d2cb9010 100644 --- a/shell/platform/linux/fl_renderer_test.cc +++ b/shell/platform/linux/fl_renderer_test.cc @@ -16,6 +16,7 @@ TEST(FlRendererTest, BackgroundColor) { ::testing::NiceMock epoxy; ON_CALL(epoxy, epoxy_is_desktop_gl).WillByDefault(::testing::Return(true)); + EXPECT_CALL(epoxy, epoxy_gl_version).WillRepeatedly(::testing::Return(30)); ON_CALL(epoxy, glGetString(GL_VENDOR)) .WillByDefault( ::testing::Return(reinterpret_cast("Intel")));