[Impeller] desktop: Add missing dispatch for TextFrameDispatcher in embedder view. (flutter/engine#55197)

This commit is contained in:
Brandon DeRosier 2024-09-13 22:34:55 -07:00 committed by GitHub
parent 8706638baf
commit 07fce2f8f4
8 changed files with 112 additions and 6 deletions

View File

@ -242,7 +242,8 @@ test_fixtures("fixtures") {
"fixtures/dpr_noxform.png",
"fixtures/dpr_xform.png",
"fixtures/gradient.png",
"fixtures/impeller_gl_test.png",
"fixtures/impeller_test.png",
"fixtures/impeller_text_test.png",
"fixtures/vk_dpr_noxform.png",
"fixtures/vk_gradient.png",
"fixtures/gradient_metal.png",

View File

@ -137,6 +137,7 @@ bool EmbedderExternalView::Render(const EmbedderRenderTarget& render_target,
impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(),
impeller::Matrix());
display_list->Dispatch(collector, sk_cull_rect);
impeller::ExperimentalDlDispatcher impeller_dispatcher(
aiks_context->GetContentContext(), *impeller_target,

View File

@ -71,9 +71,9 @@ $ $ENGINE/out/$TARGET/embedder_unittests --gtest_filter="EmbedderTest.VerifyB143
# Or, a suite of tests:
$ $ENGINE/out/$TARGET/embedder_unittests --gtest_filter="EmbedderTest.*"
# 3. Now, copy the output to the golden file:
# 3. Now, copy the output to the golden file (notice the "actual_" prefix):
$ cp \
$ENGINE/out/$TARGET/gen/flutter/shell/platform/embedder/assets/expectation_verifyb143464703_soft_noxform.png \
$ENGINE/out/$TARGET/gen/flutter/shell/platform/embedder/assets/actual_verifyb143464703_soft_noxform.png \
$ENGINE/flutter/shell/platform/embedder/fixtures/verifyb143464703_soft_noxform.png
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -1553,7 +1553,7 @@ void render_gradient_retained() {
@pragma('vm:entry-point')
// ignore: non_constant_identifier_names
void render_impeller_gl_test() {
void render_impeller_test() {
PlatformDispatcher.instance.onBeginFrame = (Duration duration) {
final SceneBuilder builder = SceneBuilder();
builder.pushOffset(0.0, 0.0);
@ -1569,3 +1569,29 @@ void render_impeller_gl_test() {
};
PlatformDispatcher.instance.scheduleFrame();
}
@pragma('vm:entry-point')
// ignore: non_constant_identifier_names
void render_impeller_text_test() {
PlatformDispatcher.instance.onBeginFrame = (Duration duration) {
final SceneBuilder builder = SceneBuilder();
builder.pushOffset(0.0, 0.0);
final Paint paint = Paint();
paint.color = const Color.fromARGB(255, 0, 0, 255);
final PictureRecorder baseRecorder = PictureRecorder();
final Canvas canvas = Canvas(baseRecorder);
final ParagraphBuilder paragraphBuilder = ParagraphBuilder(ParagraphStyle(
fontFamily: 'sans-serif'
))
..addText('Flutter is the best!');
final Paragraph paragraph = paragraphBuilder.build()
..layout(const ParagraphConstraints(width: 400));
canvas.drawParagraph(paragraph, const Offset(20, 20));
builder.addPicture(Offset.zero, baseRecorder.endRecording());
builder.pop();
PlatformDispatcher.instance.views.first.render(builder.build());
};
PlatformDispatcher.instance.scheduleFrame();
}

View File

@ -4758,7 +4758,7 @@ TEST_F(EmbedderTest, CanRenderWithImpellerOpenGL) {
});
builder.AddCommandLineArgument("--enable-impeller");
builder.SetDartEntrypoint("render_impeller_gl_test");
builder.SetDartEntrypoint("render_impeller_test");
builder.SetOpenGLRendererConfig(SkISize::Make(800, 600));
builder.SetCompositor();
builder.SetRenderTargetType(
@ -4798,7 +4798,7 @@ TEST_F(EmbedderTest, CanRenderWithImpellerOpenGL) {
ASSERT_TRUE(ImageMatchesFixture(
FixtureNameForBackend(EmbedderTestContextType::kOpenGLContext,
"impeller_gl_test.png"),
"impeller_test.png"),
rendered_scene));
// The scene will be rendered by the compositor, and the surface present

View File

@ -614,6 +614,84 @@ TEST_F(EmbedderTest, ExternalTextureMetalRefreshedTooOften) {
EXPECT_TRUE(resolve_called);
}
TEST_F(EmbedderTest, CanRenderWithImpellerMetal) {
auto& context = GetEmbedderContext(EmbedderTestContextType::kMetalContext);
EmbedderConfigBuilder builder(context);
builder.AddCommandLineArgument("--enable-impeller");
builder.SetDartEntrypoint("render_impeller_test");
builder.SetMetalRendererConfig(SkISize::Make(800, 600));
auto rendered_scene = context.GetNextSceneImage();
auto engine = builder.LaunchEngine();
ASSERT_TRUE(engine.is_valid());
// Send a window metrics events so frames may be scheduled.
FlutterWindowMetricsEvent event = {};
event.struct_size = sizeof(event);
event.width = 800;
event.height = 600;
event.pixel_ratio = 1.0;
ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
ASSERT_TRUE(ImageMatchesFixture("impeller_test.png", rendered_scene));
}
TEST_F(EmbedderTest, CanRenderTextWithImpellerMetal) {
auto& context = GetEmbedderContext(EmbedderTestContextType::kMetalContext);
EmbedderConfigBuilder builder(context);
builder.AddCommandLineArgument("--enable-impeller");
builder.SetDartEntrypoint("render_impeller_text_test");
builder.SetMetalRendererConfig(SkISize::Make(800, 600));
auto rendered_scene = context.GetNextSceneImage();
auto engine = builder.LaunchEngine();
ASSERT_TRUE(engine.is_valid());
// Send a window metrics events so frames may be scheduled.
FlutterWindowMetricsEvent event = {};
event.struct_size = sizeof(event);
event.width = 800;
event.height = 600;
event.pixel_ratio = 1.0;
ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
ASSERT_TRUE(ImageMatchesFixture("impeller_text_test.png", rendered_scene));
}
TEST_F(EmbedderTest, CanRenderTextWithImpellerAndCompositorMetal) {
auto& context = GetEmbedderContext(EmbedderTestContextType::kMetalContext);
EmbedderConfigBuilder builder(context);
builder.AddCommandLineArgument("--enable-impeller");
builder.SetDartEntrypoint("render_impeller_text_test");
builder.SetMetalRendererConfig(SkISize::Make(800, 600));
builder.SetCompositor();
builder.SetRenderTargetType(EmbedderTestBackingStoreProducer::RenderTargetType::kMetalTexture);
auto rendered_scene = context.GetNextSceneImage();
auto engine = builder.LaunchEngine();
ASSERT_TRUE(engine.is_valid());
// Send a window metrics events so frames may be scheduled.
FlutterWindowMetricsEvent event = {};
event.struct_size = sizeof(event);
event.width = 800;
event.height = 600;
event.pixel_ratio = 1.0;
ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
ASSERT_TRUE(ImageMatchesFixture("impeller_text_test.png", rendered_scene));
}
} // namespace testing
} // namespace flutter