diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index b83364b8b099c..e4754f1d554c3 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -242,7 +242,7 @@ test_fixtures("fixtures") { "fixtures/dpr_noxform.png", "fixtures/dpr_xform.png", "fixtures/gradient.png", - "fixtures/impeller_gl_gradient.png", + "fixtures/impeller_gl_test.png", "fixtures/vk_dpr_noxform.png", "fixtures/vk_gradient.png", "fixtures/gradient_metal.png", diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.cc b/shell/platform/embedder/embedder_surface_gl_impeller.cc index cae8037083cb7..c7efa86de8168 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.cc +++ b/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -178,6 +178,11 @@ EmbedderSurfaceGLImpeller::GLContextFramebufferInfo() const { // |EmbedderSurface| std::unique_ptr EmbedderSurfaceGLImpeller::CreateGPUSurface() { + // Ensure that the GL context is current before creating the GPU surface. + // GPUSurfaceGLImpeller initialization will set up shader pipelines, and the + // current thread needs to be able to execute reactor operations. + GLContextMakeCurrent(); + return std::make_unique( this, // GPU surface GL delegate impeller_context_, // Impeller context diff --git a/shell/platform/embedder/fixtures/impeller_gl_gradient.png b/shell/platform/embedder/fixtures/impeller_gl_gradient.png deleted file mode 100644 index 76fd5b12f1f12..0000000000000 Binary files a/shell/platform/embedder/fixtures/impeller_gl_gradient.png and /dev/null differ diff --git a/shell/platform/embedder/fixtures/impeller_gl_test.png b/shell/platform/embedder/fixtures/impeller_gl_test.png new file mode 100644 index 0000000000000..ed1fdb37ef151 Binary files /dev/null and b/shell/platform/embedder/fixtures/impeller_gl_test.png differ diff --git a/shell/platform/embedder/fixtures/main.dart b/shell/platform/embedder/fixtures/main.dart index 35194f5fdcbb5..dffa430fbb520 100644 --- a/shell/platform/embedder/fixtures/main.dart +++ b/shell/platform/embedder/fixtures/main.dart @@ -1364,3 +1364,21 @@ void render_gradient_retained() { }; PlatformDispatcher.instance.scheduleFrame(); } + +@pragma('vm:entry-point') +void render_impeller_gl_test() { + PlatformDispatcher.instance.onBeginFrame = (Duration duration) { + final SceneBuilder builder = SceneBuilder(); + builder.pushOffset(0.0, 0.0); + final Paint paint = Paint(); + paint.color = Color.fromARGB(255, 0, 0, 255); + final PictureRecorder baseRecorder = PictureRecorder(); + final Canvas canvas = Canvas(baseRecorder); + canvas.drawPaint(Paint()..color = Color.fromARGB(255, 255, 0, 0)); + canvas.drawRect(Rect.fromLTRB(20.0, 20.0, 200.0, 150.0), paint); + builder.addPicture(Offset.zero, baseRecorder.endRecording()); + builder.pop(); + PlatformDispatcher.instance.views.first.render(builder.build()); + }; + PlatformDispatcher.instance.scheduleFrame(); +} diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index a050e70f8f2f0..f62985df3592d 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -4711,7 +4711,7 @@ TEST_F(EmbedderTest, CanRenderWithImpellerOpenGL) { }); builder.AddCommandLineArgument("--enable-impeller"); - builder.SetDartEntrypoint("render_gradient"); + builder.SetDartEntrypoint("render_impeller_gl_test"); builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType( @@ -4733,7 +4733,7 @@ TEST_F(EmbedderTest, CanRenderWithImpellerOpenGL) { ASSERT_TRUE(ImageMatchesFixture( FixtureNameForBackend(EmbedderTestContextType::kOpenGLContext, - "impeller_gl_gradient.png"), + "impeller_gl_test.png"), rendered_scene)); // The scene will be rendered by the compositor, and the surface present