Skip to content

Commit c74f169

Browse files
authored
Migrate Metal translation units to Obj-C++ (flutter/engine#56592)
Since Metal code frequently uses Objective-C types like id<MTLTexture> etc. this migrates Metal translation units to Obj-C++. In particular, this allows transitively including headers that include such types. This in turn helps with refactoring `EmbedderTest`, `TestMetalContext`, `TestMetalSurface` to avoid specifying `void*` types in headers and manually refcounting via ARC bridge casts. Reformats the source, since Objective-C files are linted to 100 columns rather than the 80 column limit we impose on C++ files. This change introduces no semantic changes. Issue: flutter#137801
1 parent 8446ed0 commit c74f169

File tree

8 files changed

+53
-83
lines changed

8 files changed

+53
-83
lines changed

engine/src/flutter/display_list/testing/BUILD.gn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ source_set("display_list_surface_provider") {
101101

102102
if (surface_provider_include_metal) {
103103
sources += [
104-
"dl_test_surface_metal.cc",
105104
"dl_test_surface_metal.h",
105+
"dl_test_surface_metal.mm",
106106
]
107107
deps += [
108108
"//flutter/impeller/display_list",

engine/src/flutter/display_list/testing/dl_test_surface_metal.cc renamed to engine/src/flutter/display_list/testing/dl_test_surface_metal.mm

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,17 @@ namespace testing {
1515

1616
class DlMetalSurfaceInstance : public DlSurfaceInstance {
1717
public:
18-
explicit DlMetalSurfaceInstance(
19-
std::unique_ptr<TestMetalSurface> metal_surface)
18+
explicit DlMetalSurfaceInstance(std::unique_ptr<TestMetalSurface> metal_surface)
2019
: metal_surface_(std::move(metal_surface)) {}
2120
~DlMetalSurfaceInstance() = default;
2221

23-
sk_sp<SkSurface> sk_surface() const override {
24-
return metal_surface_->GetSurface();
25-
}
22+
sk_sp<SkSurface> sk_surface() const override { return metal_surface_->GetSurface(); }
2623

2724
private:
2825
std::unique_ptr<TestMetalSurface> metal_surface_;
2926
};
3027

31-
bool DlMetalSurfaceProvider::InitializeSurface(size_t width,
32-
size_t height,
33-
PixelFormat format) {
28+
bool DlMetalSurfaceProvider::InitializeSurface(size_t width, size_t height, PixelFormat format) {
3429
if (format != kN32PremulPixelFormat) {
3530
return false;
3631
}
@@ -39,8 +34,7 @@ bool DlMetalSurfaceProvider::InitializeSurface(size_t width,
3934
return true;
4035
}
4136

42-
std::shared_ptr<DlSurfaceInstance> DlMetalSurfaceProvider::GetPrimarySurface()
43-
const {
37+
std::shared_ptr<DlSurfaceInstance> DlMetalSurfaceProvider::GetPrimarySurface() const {
4438
if (!metal_surface_) {
4539
return nullptr;
4640
}
@@ -51,51 +45,42 @@ std::shared_ptr<DlSurfaceInstance> DlMetalSurfaceProvider::MakeOffscreenSurface(
5145
size_t width,
5246
size_t height,
5347
PixelFormat format) const {
54-
auto surface =
55-
TestMetalSurface::Create(*metal_context_, SkISize::Make(width, height));
48+
auto surface = TestMetalSurface::Create(*metal_context_, SkISize::Make(width, height));
5649
surface->GetSurface()->getCanvas()->clear(SK_ColorTRANSPARENT);
5750
return std::make_shared<DlMetalSurfaceInstance>(std::move(surface));
5851
}
5952

6053
class DlMetalPixelData : public DlPixelData {
6154
public:
62-
explicit DlMetalPixelData(
63-
std::unique_ptr<impeller::testing::Screenshot> screenshot)
55+
explicit DlMetalPixelData(std::unique_ptr<impeller::testing::Screenshot> screenshot)
6456
: screenshot_(std::move(screenshot)),
6557
addr_(reinterpret_cast<const uint32_t*>(screenshot_->GetBytes())),
6658
ints_per_row_(screenshot_->GetBytesPerRow() / 4) {
6759
FML_DCHECK(screenshot_->GetBytesPerRow() == ints_per_row_ * 4);
6860
}
6961
~DlMetalPixelData() override = default;
7062

71-
const uint32_t* addr32(int x, int y) const override {
72-
return addr_ + (y * ints_per_row_) + x;
73-
}
63+
const uint32_t* addr32(int x, int y) const override { return addr_ + (y * ints_per_row_) + x; }
7464
size_t width() const override { return screenshot_->GetWidth(); }
7565
size_t height() const override { return screenshot_->GetHeight(); }
76-
void write(const std::string& path) const override {
77-
screenshot_->WriteToPNG(path);
78-
}
66+
void write(const std::string& path) const override { screenshot_->WriteToPNG(path); }
7967

8068
private:
8169
std::unique_ptr<impeller::testing::Screenshot> screenshot_;
8270
const uint32_t* addr_;
8371
const uint32_t ints_per_row_;
8472
};
8573

86-
sk_sp<DlPixelData> DlMetalSurfaceProvider::ImpellerSnapshot(
87-
const sk_sp<DisplayList>& list,
88-
int width,
89-
int height) const {
74+
sk_sp<DlPixelData> DlMetalSurfaceProvider::ImpellerSnapshot(const sk_sp<DisplayList>& list,
75+
int width,
76+
int height) const {
9077
auto texture = DisplayListToTexture(list, {width, height}, *aiks_context_);
91-
return sk_make_sp<DlMetalPixelData>(
92-
snapshotter_->MakeScreenshot(*aiks_context_, texture));
78+
return sk_make_sp<DlMetalPixelData>(snapshotter_->MakeScreenshot(*aiks_context_, texture));
9379
}
9480

95-
sk_sp<DlImage> DlMetalSurfaceProvider::MakeImpellerImage(
96-
const sk_sp<DisplayList>& list,
97-
int width,
98-
int height) const {
81+
sk_sp<DlImage> DlMetalSurfaceProvider::MakeImpellerImage(const sk_sp<DisplayList>& list,
82+
int width,
83+
int height) const {
9984
InitScreenShotter();
10085
return impeller::DlImageImpeller::Make(
10186
DisplayListToTexture(list, {width, height}, *aiks_context_));
@@ -105,8 +90,8 @@ void DlMetalSurfaceProvider::InitScreenShotter() const {
10590
if (!snapshotter_) {
10691
snapshotter_.reset(new MetalScreenshotter(/*enable_wide_gamut=*/false));
10792
auto typographer = impeller::TypographerContextSkia::Make();
108-
aiks_context_.reset(new impeller::AiksContext(
109-
snapshotter_->GetPlayground().GetContext(), typographer));
93+
aiks_context_.reset(
94+
new impeller::AiksContext(snapshotter_->GetPlayground().GetContext(), typographer));
11095
}
11196
}
11297

engine/src/flutter/shell/platform/embedder/BUILD.gn

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,10 @@ if (enable_unittests) {
328328

329329
if (test_enable_metal) {
330330
sources += [
331-
"tests/embedder_test_compositor_metal.cc",
332331
"tests/embedder_test_compositor_metal.h",
333-
"tests/embedder_test_context_metal.cc",
332+
"tests/embedder_test_compositor_metal.mm",
334333
"tests/embedder_test_context_metal.h",
334+
"tests/embedder_test_context_metal.mm",
335335
"tests/embedder_test_metal.mm",
336336
]
337337

engine/src/flutter/shell/platform/embedder/tests/embedder_test_compositor_metal.cc renamed to engine/src/flutter/shell/platform/embedder/tests/embedder_test_compositor_metal.mm

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,26 @@
1414
namespace flutter {
1515
namespace testing {
1616

17-
EmbedderTestCompositorMetal::EmbedderTestCompositorMetal(
18-
SkISize surface_size,
19-
sk_sp<GrDirectContext> context)
17+
EmbedderTestCompositorMetal::EmbedderTestCompositorMetal(SkISize surface_size,
18+
sk_sp<GrDirectContext> context)
2019
: EmbedderTestCompositor(surface_size, std::move(context)) {}
2120

2221
EmbedderTestCompositorMetal::~EmbedderTestCompositorMetal() = default;
2322

24-
bool EmbedderTestCompositorMetal::UpdateOffscrenComposition(
25-
const FlutterLayer** layers,
26-
size_t layers_count) {
23+
bool EmbedderTestCompositorMetal::UpdateOffscrenComposition(const FlutterLayer** layers,
24+
size_t layers_count) {
2725
last_composition_ = nullptr;
2826

2927
const auto image_info = SkImageInfo::MakeN32Premul(surface_size_);
3028

31-
auto surface =
32-
SkSurfaces::RenderTarget(context_.get(), // context
33-
skgpu::Budgeted::kNo, // budgeted
34-
image_info, // image info
35-
1, // sample count
36-
kTopLeft_GrSurfaceOrigin, // surface origin
37-
nullptr, // surface properties
38-
false // create mipmaps
39-
);
29+
auto surface = SkSurfaces::RenderTarget(context_.get(), // context
30+
skgpu::Budgeted::kNo, // budgeted
31+
image_info, // image info
32+
1, // sample count
33+
kTopLeft_GrSurfaceOrigin, // surface origin
34+
nullptr, // surface properties
35+
false // create mipmaps
36+
);
4037

4138
if (!surface) {
4239
FML_LOG(ERROR) << "Could not update the off-screen composition.";
@@ -60,23 +57,20 @@ bool EmbedderTestCompositorMetal::UpdateOffscrenComposition(
6057
switch (layer->type) {
6158
case kFlutterLayerContentTypeBackingStore:
6259
layer_image =
63-
reinterpret_cast<SkSurface*>(layer->backing_store->user_data)
64-
->makeImageSnapshot();
60+
reinterpret_cast<SkSurface*>(layer->backing_store->user_data)->makeImageSnapshot();
6561
break;
6662
case kFlutterLayerContentTypePlatformView:
67-
layer_image =
68-
platform_view_renderer_callback_
69-
? platform_view_renderer_callback_(*layer, context_.get())
70-
: nullptr;
63+
layer_image = platform_view_renderer_callback_
64+
? platform_view_renderer_callback_(*layer, context_.get())
65+
: nullptr;
7166
canvas_offset = SkIPoint::Make(layer->offset.x, layer->offset.y);
7267
break;
7368
};
7469

7570
// If the layer is not a platform view but the engine did not specify an
7671
// image for the backing store, it is an error.
7772
if (!layer_image && layer->type != kFlutterLayerContentTypePlatformView) {
78-
FML_LOG(ERROR) << "Could not snapshot layer in test compositor: "
79-
<< *layer;
73+
FML_LOG(ERROR) << "Could not snapshot layer in test compositor: " << *layer;
8074
return false;
8175
}
8276

@@ -85,8 +79,7 @@ bool EmbedderTestCompositorMetal::UpdateOffscrenComposition(
8579
if (layer_image) {
8680
// The image rendered by Flutter already has the correct offset and
8781
// transformation applied. The layers offset is meant for the platform.
88-
canvas->drawImage(layer_image.get(), canvas_offset.x(),
89-
canvas_offset.y());
82+
canvas->drawImage(layer_image.get(), canvas_offset.x(), canvas_offset.y());
9083
}
9184
}
9285

engine/src/flutter/shell/platform/embedder/tests/embedder_test_context_metal.cc renamed to engine/src/flutter/shell/platform/embedder/tests/embedder_test_context_metal.mm

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,9 @@ EmbedderTestContextType EmbedderTestContextMetal::GetContextType() const {
3737

3838
void EmbedderTestContextMetal::SetupCompositor() {
3939
FML_CHECK(!compositor_) << "Already set up a compositor in this context.";
40-
FML_CHECK(metal_surface_)
41-
<< "Set up the Metal surface before setting up a compositor.";
42-
compositor_ = std::make_unique<EmbedderTestCompositorMetal>(
43-
surface_size_, metal_surface_->GetGrContext());
40+
FML_CHECK(metal_surface_) << "Set up the Metal surface before setting up a compositor.";
41+
compositor_ =
42+
std::make_unique<EmbedderTestCompositorMetal>(surface_size_, metal_surface_->GetGrContext());
4443
}
4544

4645
TestMetalContext* EmbedderTestContextMetal::GetTestMetalContext() {
@@ -51,8 +50,7 @@ TestMetalSurface* EmbedderTestContextMetal::GetTestMetalSurface() {
5150
return metal_surface_.get();
5251
}
5352

54-
void EmbedderTestContextMetal::SetPresentCallback(
55-
PresentCallback present_callback) {
53+
void EmbedderTestContextMetal::SetPresentCallback(PresentCallback present_callback) {
5654
present_callback_ = std::move(present_callback);
5755
}
5856

@@ -71,11 +69,10 @@ void EmbedderTestContextMetal::SetExternalTextureCallback(
7169
external_texture_frame_callback_ = std::move(external_texture_frame_callback);
7270
}
7371

74-
bool EmbedderTestContextMetal::PopulateExternalTexture(
75-
int64_t texture_id,
76-
size_t w,
77-
size_t h,
78-
FlutterMetalExternalTexture* output) {
72+
bool EmbedderTestContextMetal::PopulateExternalTexture(int64_t texture_id,
73+
size_t w,
74+
size_t h,
75+
FlutterMetalExternalTexture* output) {
7976
if (external_texture_frame_callback_ != nullptr) {
8077
return external_texture_frame_callback_(texture_id, w, h, output);
8178
} else {
@@ -88,8 +85,7 @@ void EmbedderTestContextMetal::SetNextDrawableCallback(
8885
next_drawable_callback_ = std::move(next_drawable_callback);
8986
}
9087

91-
FlutterMetalTexture EmbedderTestContextMetal::GetNextDrawable(
92-
const FlutterFrameInfo* frame_info) {
88+
FlutterMetalTexture EmbedderTestContextMetal::GetNextDrawable(const FlutterFrameInfo* frame_info) {
9389
if (next_drawable_callback_ != nullptr) {
9490
return next_drawable_callback_(frame_info);
9591
}
@@ -98,8 +94,7 @@ FlutterMetalTexture EmbedderTestContextMetal::GetNextDrawable(
9894
FlutterMetalTexture texture = {};
9995
texture.struct_size = sizeof(FlutterMetalTexture);
10096
texture.texture_id = texture_info.texture_id;
101-
texture.texture =
102-
reinterpret_cast<FlutterMetalTextureHandle>(texture_info.texture);
97+
texture.texture = reinterpret_cast<FlutterMetalTextureHandle>(texture_info.texture);
10398
return texture;
10499
}
105100

engine/src/flutter/testing/BUILD.gn

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,8 @@ if (is_mac || is_ios) {
199199
sources = [
200200
"test_metal_context.h",
201201
"test_metal_context.mm",
202-
"test_metal_surface.cc",
203202
"test_metal_surface.h",
203+
"test_metal_surface.mm",
204204
"test_metal_surface_impl.h",
205205
"test_metal_surface_impl.mm",
206206
]
@@ -260,7 +260,7 @@ if (enable_unittests) {
260260
cflags_objc = flutter_cflags_objc_arc
261261
cflags_objcc = flutter_cflags_objcc_arc
262262

263-
sources += [ "test_metal_surface_unittests.cc" ]
263+
sources += [ "test_metal_surface_unittests.mm" ]
264264
deps += [ ":metal" ]
265265
}
266266
}

engine/src/flutter/testing/test_metal_surface.cc renamed to engine/src/flutter/testing/test_metal_surface.mm

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,14 @@ bool TestMetalSurface::PlatformSupportsMetal() {
1818
std::unique_ptr<TestMetalSurface> TestMetalSurface::Create(
1919
const TestMetalContext& test_metal_context,
2020
SkISize surface_size) {
21-
return std::make_unique<TestMetalSurfaceImpl>(test_metal_context,
22-
surface_size);
21+
return std::make_unique<TestMetalSurfaceImpl>(test_metal_context, surface_size);
2322
}
2423

2524
std::unique_ptr<TestMetalSurface> TestMetalSurface::Create(
2625
const TestMetalContext& test_metal_context,
2726
int64_t texture_id,
2827
SkISize surface_size) {
29-
return std::make_unique<TestMetalSurfaceImpl>(test_metal_context, texture_id,
30-
surface_size);
28+
return std::make_unique<TestMetalSurfaceImpl>(test_metal_context, texture_id, surface_size);
3129
}
3230

3331
TestMetalSurface::TestMetalSurface() = default;

engine/src/flutter/testing/test_metal_surface_unittests.cc renamed to engine/src/flutter/testing/test_metal_surface_unittests.mm

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ TEST(TestMetalSurface, CanCreateValidTestMetalSurface) {
2828
}
2929

3030
TestMetalContext metal_context = TestMetalContext();
31-
auto surface =
32-
TestMetalSurface::Create(metal_context, SkISize::Make(100, 100));
31+
auto surface = TestMetalSurface::Create(metal_context, SkISize::Make(100, 100));
3332
ASSERT_NE(surface, nullptr);
3433
ASSERT_TRUE(surface->IsValid());
3534
ASSERT_NE(surface->GetSurface(), nullptr);

0 commit comments

Comments
 (0)