Flutter Engine
 
Loading...
Searching...
No Matches
embedder_metal_unittests.mm
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#define FML_USED_ON_EMBEDDER
6
7#include <string>
8#include <vector>
9
10#import <Metal/Metal.h>
11
12#include "embedder.h"
22
23#include "third_party/skia/include/core/SkSurface.h"
24#include "third_party/skia/include/gpu/GpuTypes.h"
25#include "third_party/skia/include/gpu/ganesh/GrBackendSurface.h"
26#include "third_party/skia/include/gpu/ganesh/SkSurfaceGanesh.h"
27#include "third_party/skia/include/gpu/ganesh/mtl/GrMtlBackendSurface.h"
28#include "third_party/skia/include/gpu/ganesh/mtl/GrMtlTypes.h"
29
30// CREATE_NATIVE_ENTRY is leaky by design
31// NOLINTBEGIN(clang-analyzer-core.StackAddressEscape)
32
33namespace flutter {
34namespace testing {
35
36using EmbedderTest = testing::EmbedderTest;
37
38TEST_F(EmbedderTest, CanRenderGradientWithMetal) {
39 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
40
41 EmbedderConfigBuilder builder(context);
42 builder.SetDartEntrypoint("render_gradient");
43 builder.SetSurface(DlISize(800, 600));
44
45 auto rendered_scene = context.GetNextSceneImage();
46
47 auto engine = builder.LaunchEngine();
48 ASSERT_TRUE(engine.is_valid());
49
50 // Send a window metrics events so frames may be scheduled.
52 event.struct_size = sizeof(event);
53 event.width = 800;
54 event.height = 600;
55 event.pixel_ratio = 1.0;
56 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
57
58 // TODO (https://github.com/flutter/flutter/issues/73590): re-enable once
59 // we are able to figure out why this fails on the bots.
60 // ASSERT_TRUE(ImageMatchesFixture("gradient_metal.png", rendered_scene));
61}
62
63static sk_sp<SkSurface> GetSurfaceFromTexture(const sk_sp<GrDirectContext>& skia_context,
64 DlISize texture_size,
65 void* texture) {
66 GrMtlTextureInfo info;
67 info.fTexture.retain(texture);
68 GrBackendTexture backend_texture = GrBackendTextures::MakeMtl(
69 texture_size.width, texture_size.height, skgpu::Mipmapped::kNo, info);
70
71 return SkSurfaces::WrapBackendTexture(skia_context.get(), backend_texture,
72 kTopLeft_GrSurfaceOrigin, 1, kBGRA_8888_SkColorType,
73 nullptr, nullptr);
74}
75
76TEST_F(EmbedderTest, ExternalTextureMetal) {
77 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
78
79 const auto texture_size = DlISize(800, 600);
80 const int64_t texture_id = 1;
81
82 TestMetalContext* metal_context = context.GetTestMetalContext();
83 TestMetalContext::TextureInfo texture_info = metal_context->CreateMetalTexture(texture_size);
84
85 sk_sp<SkSurface> surface =
86 GetSurfaceFromTexture(metal_context->GetSkiaContext(), texture_size, texture_info.texture);
87 auto canvas = surface->getCanvas();
88 canvas->clear(SK_ColorRED);
89 metal_context->GetSkiaContext()->flushAndSubmit();
90
91 std::vector<FlutterMetalTextureHandle> textures{texture_info.texture};
92
93 context.SetExternalTextureCallback(
94 [&](int64_t id, size_t w, size_t h, FlutterMetalExternalTexture* output) {
95 EXPECT_TRUE(w == texture_size.width);
96 EXPECT_TRUE(h == texture_size.height);
97 EXPECT_TRUE(texture_id == id);
98 output->num_textures = 1;
99 output->height = h;
100 output->width = w;
102 output->textures = textures.data();
103 return true;
104 });
105
106 EmbedderConfigBuilder builder(context);
107
108 builder.SetDartEntrypoint("render_texture");
109 builder.SetSurface(texture_size);
110
111 auto engine = builder.LaunchEngine();
112 ASSERT_TRUE(engine.is_valid());
113
115
116 auto rendered_scene = context.GetNextSceneImage();
117
118 // Send a window metrics events so frames may be scheduled.
119 FlutterWindowMetricsEvent event = {};
120 event.struct_size = sizeof(event);
121 event.width = texture_size.width;
122 event.height = texture_size.height;
123 event.pixel_ratio = 1.0;
124 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
125
126 ASSERT_TRUE(ImageMatchesFixture("external_texture_metal.png", rendered_scene));
127}
128
129TEST_F(EmbedderTest, MetalCompositorMustBeAbleToRenderPlatformViews) {
130 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
131
132 EmbedderConfigBuilder builder(context);
133 builder.SetSurface(DlISize(800, 600));
134 builder.SetCompositor();
135 builder.SetDartEntrypoint("can_composite_platform_views");
136
138
139 fml::CountDownLatch latch(3);
140 context.GetCompositor().SetNextPresentCallback(
142 ASSERT_EQ(layers_count, 3u);
143
144 {
145 FlutterBackingStore backing_store = *layers[0]->backing_store;
146 backing_store.struct_size = sizeof(backing_store);
147 backing_store.type = kFlutterBackingStoreTypeMetal;
148 backing_store.did_update = true;
149
150 FlutterRect paint_region_rects[] = {
151 FlutterRectMakeLTRB(0, 0, 800, 600),
152 };
153 FlutterRegion paint_region = {
154 .struct_size = sizeof(FlutterRegion),
155 .rects_count = 1,
156 .rects = paint_region_rects,
157 };
158 FlutterBackingStorePresentInfo present_info = {
160 .paint_region = &paint_region,
161 };
162
163 FlutterLayer layer = {};
164 layer.struct_size = sizeof(layer);
166 layer.backing_store = &backing_store;
167 layer.size = FlutterSizeMake(800.0, 600.0);
168 layer.offset = FlutterPointMake(0, 0);
169 layer.backing_store_present_info = &present_info;
170
171 ASSERT_EQ(*layers[0], layer);
172 }
173
174 {
177 platform_view.identifier = 42;
178
179 FlutterLayer layer = {};
180 layer.struct_size = sizeof(layer);
183 layer.size = FlutterSizeMake(123.0, 456.0);
184 layer.offset = FlutterPointMake(1.0, 2.0);
185
186 ASSERT_EQ(*layers[1], layer);
187 }
188
189 {
190 FlutterBackingStore backing_store = *layers[2]->backing_store;
191 backing_store.struct_size = sizeof(backing_store);
192 backing_store.type = kFlutterBackingStoreTypeMetal;
193 backing_store.did_update = true;
194
195 FlutterRect paint_region_rects[] = {
196 FlutterRectMakeLTRB(2, 3, 800, 600),
197 };
198 FlutterRegion paint_region = {
199 .struct_size = sizeof(FlutterRegion),
200 .rects_count = 1,
201 .rects = paint_region_rects,
202 };
203 FlutterBackingStorePresentInfo present_info = {
205 .paint_region = &paint_region,
206 };
207
208 FlutterLayer layer = {};
209 layer.struct_size = sizeof(layer);
211 layer.backing_store = &backing_store;
212 layer.size = FlutterSizeMake(800.0, 600.0);
213 layer.offset = FlutterPointMake(0.0, 0.0);
214 layer.backing_store_present_info = &present_info;
215
216 ASSERT_EQ(*layers[2], layer);
217 }
218
219 latch.CountDown();
220 });
221
222 context.AddNativeCallback(
223 "SignalNativeTest",
224 CREATE_NATIVE_ENTRY([&latch](Dart_NativeArguments args) { latch.CountDown(); }));
225
226 auto engine = builder.LaunchEngine();
227
228 // Send a window metrics events so frames may be scheduled.
229 FlutterWindowMetricsEvent event = {};
230 event.struct_size = sizeof(event);
231 event.width = 800;
232 event.height = 600;
233 event.pixel_ratio = 1.0;
234 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
235 ASSERT_TRUE(engine.is_valid());
236
237 latch.Wait();
238}
239
240TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositorMetal) {
241 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
242
243 EmbedderConfigBuilder builder(context);
244
245 builder.SetDartEntrypoint("can_render_scene_without_custom_compositor");
246 builder.SetSurface(DlISize(800, 600));
247
248 auto rendered_scene = context.GetNextSceneImage();
249
250 auto engine = builder.LaunchEngine();
251 ASSERT_TRUE(engine.is_valid());
252
253 // Send a window metrics events so frames may be scheduled.
254 FlutterWindowMetricsEvent event = {};
255 event.struct_size = sizeof(event);
256 event.width = 800;
257 event.height = 600;
258 event.pixel_ratio = 1.0;
259 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
260
261 ASSERT_TRUE(ImageMatchesFixture("scene_without_custom_compositor.png", rendered_scene));
262}
263
264TEST_F(EmbedderTest, TextureDestructionCallbackCalledWithoutCustomCompositorMetal) {
265 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
266
267 EmbedderConfigBuilder builder(context);
268 builder.SetSurface(DlISize(800, 600));
269 builder.SetDartEntrypoint("texture_destruction_callback_called_without_custom_compositor");
270
271 struct CollectContext {
272 int present_count = 0;
273 int collect_count = 0;
275 };
276
277 auto collect_context = std::make_unique<CollectContext>();
278 context.SetNextDrawableCallback([&context, &collect_context](const FlutterFrameInfo* frame_info) {
279 auto texture_info = context.GetTestMetalSurface()->GetTextureInfo();
280
283 texture.texture_id = texture_info.texture_id;
284 texture.texture = reinterpret_cast<FlutterMetalTextureHandle>(texture_info.texture);
285 texture.user_data = collect_context.get();
286 texture.destruction_callback = [](void* user_data) {
287 CollectContext* callback_collect_context = reinterpret_cast<CollectContext*>(user_data);
288 ASSERT_TRUE(callback_collect_context->present_count > 0);
289 callback_collect_context->collect_count++;
290 callback_collect_context->latch.Signal();
291 };
292 return texture;
293 });
294 context.SetPresentCallback([&context, &collect_context](int64_t texture_id) {
295 collect_context->present_count++;
296 return context.GetTestMetalContext()->Present(texture_id);
297 });
298
299 auto engine = builder.LaunchEngine();
300
301 // Send a window metrics events so frames may be scheduled.
302 FlutterWindowMetricsEvent event = {};
303 event.struct_size = sizeof(event);
304 event.width = 800;
305 event.height = 600;
306 event.pixel_ratio = 1.0;
307 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
308 ASSERT_TRUE(engine.is_valid());
309
310 collect_context->latch.Wait();
311 EXPECT_EQ(collect_context->collect_count, 1);
312}
313
314TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownSceneMetal) {
315 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
316
317 EmbedderConfigBuilder builder(context);
318 builder.SetSurface(DlISize(800, 600));
319 builder.SetCompositor();
320 builder.SetDartEntrypoint("can_composite_platform_views_with_known_scene");
321
323
324 fml::CountDownLatch latch(5);
325
326 auto scene_image = context.GetNextSceneImage();
327
328 context.GetCompositor().SetNextPresentCallback(
330 ASSERT_EQ(layers_count, 5u);
331
332 // Layer Root
333 {
334 FlutterBackingStore backing_store = *layers[0]->backing_store;
335 backing_store.type = kFlutterBackingStoreTypeMetal;
336 backing_store.did_update = true;
337
338 FlutterRect paint_region_rects[] = {
339 FlutterRectMakeLTRB(0, 0, 800, 600),
340 };
341 FlutterRegion paint_region = {
342 .struct_size = sizeof(FlutterRegion),
343 .rects_count = 1,
344 .rects = paint_region_rects,
345 };
346 FlutterBackingStorePresentInfo present_info = {
348 .paint_region = &paint_region,
349 };
350
351 FlutterLayer layer = {};
352 layer.struct_size = sizeof(layer);
354 layer.backing_store = &backing_store;
355 layer.size = FlutterSizeMake(800.0, 600.0);
356 layer.offset = FlutterPointMake(0.0, 0.0);
357 layer.backing_store_present_info = &present_info;
358
359 ASSERT_EQ(*layers[0], layer);
360 }
361
362 // Layer 1
363 {
366 platform_view.identifier = 1;
367
368 FlutterLayer layer = {};
369 layer.struct_size = sizeof(layer);
372 layer.size = FlutterSizeMake(50.0, 150.0);
373 layer.offset = FlutterPointMake(20.0, 20.0);
374
375 ASSERT_EQ(*layers[1], layer);
376 }
377
378 // Layer 2
379 {
380 FlutterBackingStore backing_store = *layers[2]->backing_store;
381 backing_store.type = kFlutterBackingStoreTypeMetal;
382 backing_store.did_update = true;
383
384 FlutterRect paint_region_rects[] = {
385 FlutterRectMakeLTRB(30, 30, 80, 180),
386 };
387 FlutterRegion paint_region = {
388 .struct_size = sizeof(FlutterRegion),
389 .rects_count = 1,
390 .rects = paint_region_rects,
391 };
392 FlutterBackingStorePresentInfo present_info = {
394 .paint_region = &paint_region,
395 };
396
397 FlutterLayer layer = {};
398 layer.struct_size = sizeof(layer);
400 layer.backing_store = &backing_store;
401 layer.size = FlutterSizeMake(800.0, 600.0);
402 layer.offset = FlutterPointMake(0.0, 0.0);
403 layer.backing_store_present_info = &present_info;
404
405 ASSERT_EQ(*layers[2], layer);
406 }
407
408 // Layer 3
409 {
412 platform_view.identifier = 2;
413
414 FlutterLayer layer = {};
415 layer.struct_size = sizeof(layer);
418 layer.size = FlutterSizeMake(50.0, 150.0);
419 layer.offset = FlutterPointMake(40.0, 40.0);
420
421 ASSERT_EQ(*layers[3], layer);
422 }
423
424 // Layer 4
425 {
426 FlutterBackingStore backing_store = *layers[4]->backing_store;
427 backing_store.type = kFlutterBackingStoreTypeMetal;
428 backing_store.did_update = true;
429
430 FlutterRect paint_region_rects[] = {
431 FlutterRectMakeLTRB(50, 50, 100, 200),
432 };
433 FlutterRegion paint_region = {
434 .struct_size = sizeof(FlutterRegion),
435 .rects_count = 1,
436 .rects = paint_region_rects,
437 };
438 FlutterBackingStorePresentInfo present_info = {
440 .paint_region = &paint_region,
441 };
442
443 FlutterLayer layer = {};
444 layer.struct_size = sizeof(layer);
446 layer.backing_store = &backing_store;
447 layer.size = FlutterSizeMake(800.0, 600.0);
448 layer.offset = FlutterPointMake(0.0, 0.0);
449 layer.backing_store_present_info = &present_info;
450
451 ASSERT_EQ(*layers[4], layer);
452 }
453
454 latch.CountDown();
455 });
456
457 context.GetCompositor().SetPlatformViewRendererCallback(
458 [&](const FlutterLayer& layer, GrDirectContext* context) -> sk_sp<SkImage> {
459 auto surface = CreateRenderSurface(layer, context);
460 auto canvas = surface->getCanvas();
461 FML_CHECK(canvas != nullptr);
462
463 switch (layer.platform_view->identifier) {
464 case 1: {
465 SkPaint paint;
466 // See dart test for total order.
467 paint.setColor(SK_ColorGREEN);
468 paint.setAlpha(127);
469 const auto& rect = SkRect::MakeWH(layer.size.width, layer.size.height);
470 canvas->drawRect(rect, paint);
471 latch.CountDown();
472 } break;
473 case 2: {
474 SkPaint paint;
475 // See dart test for total order.
476 paint.setColor(SK_ColorMAGENTA);
477 paint.setAlpha(127);
478 const auto& rect = SkRect::MakeWH(layer.size.width, layer.size.height);
479 canvas->drawRect(rect, paint);
480 latch.CountDown();
481 } break;
482 default:
483 // Asked to render an unknown platform view.
484 FML_CHECK(false) << "Test was asked to composite an unknown platform view.";
485 }
486
487 return surface->makeImageSnapshot();
488 });
489
490 context.AddNativeCallback(
491 "SignalNativeTest",
492 CREATE_NATIVE_ENTRY([&latch](Dart_NativeArguments args) { latch.CountDown(); }));
493
494 auto engine = builder.LaunchEngine();
495
496 // Send a window metrics events so frames may be scheduled.
497 FlutterWindowMetricsEvent event = {};
498 event.struct_size = sizeof(event);
499 // Flutter still thinks it is 800 x 600. Only the root surface is rotated.
500 event.width = 800;
501 event.height = 600;
502 event.pixel_ratio = 1.0;
503 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
504 ASSERT_TRUE(engine.is_valid());
505
506 latch.Wait();
507
508 ASSERT_TRUE(ImageMatchesFixture("compositor.png", scene_image));
509}
510
511TEST_F(EmbedderTest, CreateInvalidBackingstoreMetalTexture) {
512 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
513 EmbedderConfigBuilder builder(context);
514 builder.SetSurface(DlISize(800, 600));
515 builder.SetCompositor();
517 builder.SetDartEntrypoint("invalid_backingstore");
518
519 class TestCollectOnce {
520 public:
521 // Collect() should only be called once
522 void Collect() {
523 ASSERT_FALSE(collected_);
524 collected_ = true;
525 }
526
527 private:
528 bool collected_ = false;
529 };
531
532 builder.GetCompositor().create_backing_store_callback =
533 [](const FlutterBackingStoreConfig* config, //
534 FlutterBackingStore* backing_store_out, //
535 void* user_data //
536 ) {
537 backing_store_out->type = kFlutterBackingStoreTypeMetal;
538 // Deliberately set this to be invalid
539 backing_store_out->user_data = nullptr;
540 backing_store_out->metal.texture.texture = 0;
541 backing_store_out->metal.struct_size = sizeof(FlutterMetalBackingStore);
542 backing_store_out->metal.texture.user_data = new TestCollectOnce();
543 backing_store_out->metal.texture.destruction_callback = [](void* user_data) {
544 reinterpret_cast<TestCollectOnce*>(user_data)->Collect();
545 };
546 return true;
547 };
548
549 context.AddNativeCallback(
550 "SignalNativeTest",
551 CREATE_NATIVE_ENTRY([&latch](Dart_NativeArguments args) { latch.Signal(); }));
552
553 auto engine = builder.LaunchEngine();
554
555 // Send a window metrics events so frames may be scheduled.
556 FlutterWindowMetricsEvent event = {};
557 event.struct_size = sizeof(event);
558 event.width = 800;
559 event.height = 600;
560 event.pixel_ratio = 1.0;
561 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
562 ASSERT_TRUE(engine.is_valid());
563 latch.Wait();
564}
565
566TEST_F(EmbedderTest, ExternalTextureMetalRefreshedTooOften) {
567 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
568
569 TestMetalContext* metal_context = context.GetTestMetalContext();
570 auto metal_texture = metal_context->CreateMetalTexture(DlISize(100, 100));
571
572 std::vector<FlutterMetalTextureHandle> textures{metal_texture.texture};
573
574 bool resolve_called = false;
575
577 resolve_called = true;
578 auto res = std::make_unique<FlutterMetalExternalTexture>();
579 res->struct_size = sizeof(FlutterMetalExternalTexture);
580 res->width = res->height = 100;
582 res->textures = textures.data();
583 res->num_textures = 1;
584 return res;
585 });
587
588 auto surface = TestMetalSurface::Create(*metal_context, DlISize(100, 100));
589 auto skia_surface = surface->GetSurface();
590 DlSkCanvasAdapter canvas(skia_surface->getCanvas());
591
592 Texture* texture_ = &texture;
595 .canvas = &canvas,
596 .gr_context = surface->GetGrContext().get(),
597 };
598 texture_->Paint(ctx, DlRect::MakeXYWH(0, 0, 100, 100), false, sampling);
599
600 EXPECT_TRUE(resolve_called);
601 resolve_called = false;
602
603 texture_->Paint(ctx, DlRect::MakeXYWH(0, 0, 100, 100), false, sampling);
604
605 EXPECT_FALSE(resolve_called);
606
607 texture_->MarkNewFrameAvailable();
608
609 texture_->Paint(ctx, DlRect::MakeXYWH(0, 0, 100, 100), false, sampling);
610
611 EXPECT_TRUE(resolve_called);
612}
613
614TEST_F(EmbedderTest, CanRenderWithImpellerMetal) {
615 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
616
617 EmbedderConfigBuilder builder(context);
618
619 builder.AddCommandLineArgument("--enable-impeller");
620 builder.SetDartEntrypoint("render_impeller_test");
621 builder.SetSurface(DlISize(800, 600));
622
623 auto rendered_scene = context.GetNextSceneImage();
624
625 auto engine = builder.LaunchEngine();
626 ASSERT_TRUE(engine.is_valid());
627
628 // Send a window metrics events so frames may be scheduled.
629 FlutterWindowMetricsEvent event = {};
630 event.struct_size = sizeof(event);
631 event.width = 800;
632 event.height = 600;
633 event.pixel_ratio = 1.0;
634 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
635
636 ASSERT_TRUE(ImageMatchesFixture("impeller_test.png", rendered_scene));
637}
638
639TEST_F(EmbedderTest, CanRenderTextWithImpellerMetal) {
640 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
641
642 EmbedderConfigBuilder builder(context);
643
644 builder.AddCommandLineArgument("--enable-impeller");
645 builder.SetDartEntrypoint("render_impeller_text_test");
646 builder.SetSurface(DlISize(800, 600));
647
648 auto rendered_scene = context.GetNextSceneImage();
649
650 auto engine = builder.LaunchEngine();
651 ASSERT_TRUE(engine.is_valid());
652
653 // Send a window metrics events so frames may be scheduled.
654 FlutterWindowMetricsEvent event = {};
655 event.struct_size = sizeof(event);
656 event.width = 800;
657 event.height = 600;
658 event.pixel_ratio = 1.0;
659 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
660
661 ASSERT_TRUE(ImageMatchesFixture("impeller_text_test.png", rendered_scene));
662}
663
664TEST_F(EmbedderTest, CanRenderTextWithImpellerAndCompositorMetal) {
665 auto& context = GetEmbedderContext<EmbedderTestContextMetal>();
666
667 EmbedderConfigBuilder builder(context);
668
669 builder.AddCommandLineArgument("--enable-impeller");
670 builder.SetDartEntrypoint("render_impeller_text_test");
671 builder.SetSurface(DlISize(800, 600));
672 builder.SetCompositor();
673
675
676 auto rendered_scene = context.GetNextSceneImage();
677
678 auto engine = builder.LaunchEngine();
679 ASSERT_TRUE(engine.is_valid());
680
681 // Send a window metrics events so frames may be scheduled.
682 FlutterWindowMetricsEvent event = {};
683 event.struct_size = sizeof(event);
684 event.width = 800;
685 event.height = 600;
686 event.pixel_ratio = 1.0;
687 ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess);
688
689 ASSERT_TRUE(ImageMatchesFixture("impeller_text_test.png", rendered_scene));
690}
691
692} // namespace testing
693} // namespace flutter
694
695// NOLINTEND(clang-analyzer-core.StackAddressEscape)
std::unique_ptr< flutter::PlatformViewIOS > platform_view
Backend implementation of |DlCanvas| for |SkCanvas|.
std::function< std::unique_ptr< FlutterMetalExternalTexture >(int64_t, size_t, size_t)> ExternalTextureCallback
virtual void MarkNewFrameAvailable()=0
virtual void Paint(PaintContext &context, const DlRect &bounds, bool freeze, const DlImageSampling sampling)=0
void SetRenderTargetType(EmbedderTestBackingStoreProducer::RenderTargetType type, FlutterSoftwarePixelFormat software_pixfmt=kFlutterSoftwarePixelFormatNative32)
void SetCompositor(bool avoid_backing_store_cache=false, bool use_present_layers_callback=false)
TextureInfo CreateMetalTexture(const DlISize &size)
Returns texture_id = -1 when texture creation fails.
sk_sp< GrDirectContext > GetSkiaContext() const
static std::unique_ptr< TestMetalSurface > Create(const TestMetalContext &test_metal_context, DlISize surface_size=DlISize())
FlutterEngineResult FlutterEngineRegisterExternalTexture(FLUTTER_API_SYMBOL(FlutterEngine) engine, int64_t texture_identifier)
Register an external texture with a unique (per engine) identifier. Only rendering backends that supp...
Definition embedder.cc:3110
FlutterEngineResult FlutterEngineSendWindowMetricsEvent(FLUTTER_API_SYMBOL(FlutterEngine) engine, const FlutterWindowMetricsEvent *flutter_metrics)
Definition embedder.cc:2660
@ kFlutterLayerContentTypePlatformView
Indicates that the contents of this layer are determined by the embedder.
Definition embedder.h:2104
@ kFlutterLayerContentTypeBackingStore
Definition embedder.h:2102
@ kRGBA
Definition embedder.h:811
@ kFlutterBackingStoreTypeMetal
Specifies a Metal backing store. This is backed by a Metal texture.
Definition embedder.h:2055
const void * FlutterMetalTextureHandle
Alias for id<MTLTexture>.
Definition embedder.h:806
FlutterSize FlutterSizeMake(double width, double height)
FlutterRect FlutterRectMakeLTRB(double l, double t, double r, double b)
FlutterPoint FlutterPointMake(double x, double y)
FlutterEngine engine
Definition main.cc:84
VkSurfaceKHR surface
Definition main.cc:65
const FlutterLayer size_t layers_count
const FlutterLayer ** layers
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS FlutterViewId view_id
FlutterDesktopBinaryReply callback
#define FML_CHECK(condition)
Definition logging.h:104
FlTexture * texture
TEST_F(DisplayListTest, Defaults)
sk_sp< SkSurface > CreateRenderSurface(const FlutterLayer &layer, GrDirectContext *context)
bool ImageMatchesFixture(const std::string &fixture_file_name, const sk_sp< SkImage > &scene_image)
static sk_sp< SkSurface > GetSurfaceFromTexture(const sk_sp< GrDirectContext > &skia_context, DlISize texture_size, void *texture)
impeller::ISize32 DlISize
int64_t FlutterViewId
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder h
Definition switch_defs.h:54
FlutterBackingStoreType type
Specifies the type of backing store.
Definition embedder.h:2071
size_t struct_size
The size of this struct. Must be sizeof(FlutterBackingStore).
Definition embedder.h:2065
size_t struct_size
The size of this struct. Must be sizeof(FlutterBackingStorePresentInfo).
Definition embedder.h:2121
FlutterPoint offset
Definition embedder.h:2145
FlutterLayerContentType type
Definition embedder.h:2134
const FlutterBackingStore * backing_store
Definition embedder.h:2138
FlutterBackingStorePresentInfo * backing_store_present_info
Definition embedder.h:2151
const FlutterPlatformView * platform_view
Definition embedder.h:2141
size_t struct_size
This size of this struct. Must be sizeof(FlutterLayer).
Definition embedder.h:2131
FlutterSize size
The size of the layer (in physical pixels).
Definition embedder.h:2147
FlutterMetalTextureHandle * textures
Definition embedder.h:839
size_t num_textures
Represents the size of the textures array.
Definition embedder.h:830
FlutterMetalExternalTexturePixelFormat pixel_format
The pixel format type of the external.
Definition embedder.h:828
size_t height
Height of the texture.
Definition embedder.h:826
size_t width
Height of the texture.
Definition embedder.h:824
size_t struct_size
The size of this struct. Must be sizeof(FlutterMetalTexture).
Definition embedder.h:855
size_t struct_size
The size of this struct. Must be sizeof(FlutterPlatformView).
Definition embedder.h:2025
FlutterPlatformViewIdentifier identifier
Definition embedder.h:2029
A structure to represent a rectangle.
Definition embedder.h:641
A region represented by a collection of non-overlapping rectangles.
Definition embedder.h:2108
size_t struct_size
The size of this struct. Must be sizeof(FlutterRegion).
Definition embedder.h:2110
double height
Definition embedder.h:629
double width
Definition embedder.h:628
size_t struct_size
The size of this struct. Must be sizeof(FlutterWindowMetricsEvent).
Definition embedder.h:1047
static constexpr TRect MakeXYWH(Type x, Type y, Type width, Type height)
Definition rect.h:136
Type height
Definition size.h:29
Type width
Definition size.h:28
#define CREATE_NATIVE_ENTRY(native_entry)
int64_t texture_id