From ee005b30dc130721d479f8ffc26626a4ee8df80c Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Thu, 14 Nov 2024 12:04:13 -0800 Subject: [PATCH] Migrate Metal translation units to Obj-C++ Since Metal code frequently uses Objective-C types like id etc. this migrates Metal translation units to Obj-C++. In particular, this allows transitively including headers that include such types. Reformats the source, since Objective-C files are linted to 100 columns rather than the 80 column limit we impose on C++ files. --- display_list/testing/BUILD.gn | 2 +- ...face_metal.cc => dl_test_surface_metal.mm} | 49 +++++++------------ shell/platform/embedder/BUILD.gn | 4 +- ...l.cc => embedder_test_compositor_metal.mm} | 43 +++++++--------- ...etal.cc => embedder_test_context_metal.mm} | 25 ++++------ testing/BUILD.gn | 4 +- ...metal_surface.cc => test_metal_surface.mm} | 6 +-- ...sts.cc => test_metal_surface_unittests.mm} | 3 +- 8 files changed, 53 insertions(+), 83 deletions(-) rename display_list/testing/{dl_test_surface_metal.cc => dl_test_surface_metal.mm} (65%) rename shell/platform/embedder/tests/{embedder_test_compositor_metal.cc => embedder_test_compositor_metal.mm} (68%) rename shell/platform/embedder/tests/{embedder_test_context_metal.cc => embedder_test_context_metal.mm} (78%) rename testing/{test_metal_surface.cc => test_metal_surface.mm} (91%) rename testing/{test_metal_surface_unittests.cc => test_metal_surface_unittests.mm} (92%) diff --git a/display_list/testing/BUILD.gn b/display_list/testing/BUILD.gn index f94799b9729af..915daeab95594 100644 --- a/display_list/testing/BUILD.gn +++ b/display_list/testing/BUILD.gn @@ -101,8 +101,8 @@ source_set("display_list_surface_provider") { if (surface_provider_include_metal) { sources += [ - "dl_test_surface_metal.cc", "dl_test_surface_metal.h", + "dl_test_surface_metal.mm", ] deps += [ "//flutter/impeller/display_list", diff --git a/display_list/testing/dl_test_surface_metal.cc b/display_list/testing/dl_test_surface_metal.mm similarity index 65% rename from display_list/testing/dl_test_surface_metal.cc rename to display_list/testing/dl_test_surface_metal.mm index 90ac9b7eb5637..d90e5e9f0ae67 100644 --- a/display_list/testing/dl_test_surface_metal.cc +++ b/display_list/testing/dl_test_surface_metal.mm @@ -15,22 +15,17 @@ namespace testing { class DlMetalSurfaceInstance : public DlSurfaceInstance { public: - explicit DlMetalSurfaceInstance( - std::unique_ptr metal_surface) + explicit DlMetalSurfaceInstance(std::unique_ptr metal_surface) : metal_surface_(std::move(metal_surface)) {} ~DlMetalSurfaceInstance() = default; - sk_sp sk_surface() const override { - return metal_surface_->GetSurface(); - } + sk_sp sk_surface() const override { return metal_surface_->GetSurface(); } private: std::unique_ptr metal_surface_; }; -bool DlMetalSurfaceProvider::InitializeSurface(size_t width, - size_t height, - PixelFormat format) { +bool DlMetalSurfaceProvider::InitializeSurface(size_t width, size_t height, PixelFormat format) { if (format != kN32PremulPixelFormat) { return false; } @@ -39,8 +34,7 @@ bool DlMetalSurfaceProvider::InitializeSurface(size_t width, return true; } -std::shared_ptr DlMetalSurfaceProvider::GetPrimarySurface() - const { +std::shared_ptr DlMetalSurfaceProvider::GetPrimarySurface() const { if (!metal_surface_) { return nullptr; } @@ -51,16 +45,14 @@ std::shared_ptr DlMetalSurfaceProvider::MakeOffscreenSurface( size_t width, size_t height, PixelFormat format) const { - auto surface = - TestMetalSurface::Create(*metal_context_, SkISize::Make(width, height)); + auto surface = TestMetalSurface::Create(*metal_context_, SkISize::Make(width, height)); surface->GetSurface()->getCanvas()->clear(SK_ColorTRANSPARENT); return std::make_shared(std::move(surface)); } class DlMetalPixelData : public DlPixelData { public: - explicit DlMetalPixelData( - std::unique_ptr screenshot) + explicit DlMetalPixelData(std::unique_ptr screenshot) : screenshot_(std::move(screenshot)), addr_(reinterpret_cast(screenshot_->GetBytes())), ints_per_row_(screenshot_->GetBytesPerRow() / 4) { @@ -68,14 +60,10 @@ class DlMetalPixelData : public DlPixelData { } ~DlMetalPixelData() override = default; - const uint32_t* addr32(int x, int y) const override { - return addr_ + (y * ints_per_row_) + x; - } + const uint32_t* addr32(int x, int y) const override { return addr_ + (y * ints_per_row_) + x; } size_t width() const override { return screenshot_->GetWidth(); } size_t height() const override { return screenshot_->GetHeight(); } - void write(const std::string& path) const override { - screenshot_->WriteToPNG(path); - } + void write(const std::string& path) const override { screenshot_->WriteToPNG(path); } private: std::unique_ptr screenshot_; @@ -83,19 +71,16 @@ class DlMetalPixelData : public DlPixelData { const uint32_t ints_per_row_; }; -sk_sp DlMetalSurfaceProvider::ImpellerSnapshot( - const sk_sp& list, - int width, - int height) const { +sk_sp DlMetalSurfaceProvider::ImpellerSnapshot(const sk_sp& list, + int width, + int height) const { auto texture = DisplayListToTexture(list, {width, height}, *aiks_context_); - return sk_make_sp( - snapshotter_->MakeScreenshot(*aiks_context_, texture)); + return sk_make_sp(snapshotter_->MakeScreenshot(*aiks_context_, texture)); } -sk_sp DlMetalSurfaceProvider::MakeImpellerImage( - const sk_sp& list, - int width, - int height) const { +sk_sp DlMetalSurfaceProvider::MakeImpellerImage(const sk_sp& list, + int width, + int height) const { InitScreenShotter(); return impeller::DlImageImpeller::Make( DisplayListToTexture(list, {width, height}, *aiks_context_)); @@ -105,8 +90,8 @@ void DlMetalSurfaceProvider::InitScreenShotter() const { if (!snapshotter_) { snapshotter_.reset(new MetalScreenshotter(/*enable_wide_gamut=*/false)); auto typographer = impeller::TypographerContextSkia::Make(); - aiks_context_.reset(new impeller::AiksContext( - snapshotter_->GetPlayground().GetContext(), typographer)); + aiks_context_.reset( + new impeller::AiksContext(snapshotter_->GetPlayground().GetContext(), typographer)); } } diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index 849bc8fcee454..31e0f191a4069 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -328,10 +328,10 @@ if (enable_unittests) { if (test_enable_metal) { sources += [ - "tests/embedder_test_compositor_metal.cc", "tests/embedder_test_compositor_metal.h", - "tests/embedder_test_context_metal.cc", + "tests/embedder_test_compositor_metal.mm", "tests/embedder_test_context_metal.h", + "tests/embedder_test_context_metal.mm", "tests/embedder_test_metal.mm", ] diff --git a/shell/platform/embedder/tests/embedder_test_compositor_metal.cc b/shell/platform/embedder/tests/embedder_test_compositor_metal.mm similarity index 68% rename from shell/platform/embedder/tests/embedder_test_compositor_metal.cc rename to shell/platform/embedder/tests/embedder_test_compositor_metal.mm index 594be6ab94ce7..45eb8575678ea 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_metal.cc +++ b/shell/platform/embedder/tests/embedder_test_compositor_metal.mm @@ -14,29 +14,26 @@ namespace flutter { namespace testing { -EmbedderTestCompositorMetal::EmbedderTestCompositorMetal( - SkISize surface_size, - sk_sp context) +EmbedderTestCompositorMetal::EmbedderTestCompositorMetal(SkISize surface_size, + sk_sp context) : EmbedderTestCompositor(surface_size, std::move(context)) {} EmbedderTestCompositorMetal::~EmbedderTestCompositorMetal() = default; -bool EmbedderTestCompositorMetal::UpdateOffscrenComposition( - const FlutterLayer** layers, - size_t layers_count) { +bool EmbedderTestCompositorMetal::UpdateOffscrenComposition(const FlutterLayer** layers, + size_t layers_count) { last_composition_ = nullptr; const auto image_info = SkImageInfo::MakeN32Premul(surface_size_); - auto surface = - SkSurfaces::RenderTarget(context_.get(), // context - skgpu::Budgeted::kNo, // budgeted - image_info, // image info - 1, // sample count - kTopLeft_GrSurfaceOrigin, // surface origin - nullptr, // surface properties - false // create mipmaps - ); + auto surface = SkSurfaces::RenderTarget(context_.get(), // context + skgpu::Budgeted::kNo, // budgeted + image_info, // image info + 1, // sample count + kTopLeft_GrSurfaceOrigin, // surface origin + nullptr, // surface properties + false // create mipmaps + ); if (!surface) { FML_LOG(ERROR) << "Could not update the off-screen composition."; @@ -60,14 +57,12 @@ bool EmbedderTestCompositorMetal::UpdateOffscrenComposition( switch (layer->type) { case kFlutterLayerContentTypeBackingStore: layer_image = - reinterpret_cast(layer->backing_store->user_data) - ->makeImageSnapshot(); + reinterpret_cast(layer->backing_store->user_data)->makeImageSnapshot(); break; case kFlutterLayerContentTypePlatformView: - layer_image = - platform_view_renderer_callback_ - ? platform_view_renderer_callback_(*layer, context_.get()) - : nullptr; + layer_image = platform_view_renderer_callback_ + ? platform_view_renderer_callback_(*layer, context_.get()) + : nullptr; canvas_offset = SkIPoint::Make(layer->offset.x, layer->offset.y); break; }; @@ -75,8 +70,7 @@ bool EmbedderTestCompositorMetal::UpdateOffscrenComposition( // If the layer is not a platform view but the engine did not specify an // image for the backing store, it is an error. if (!layer_image && layer->type != kFlutterLayerContentTypePlatformView) { - FML_LOG(ERROR) << "Could not snapshot layer in test compositor: " - << *layer; + FML_LOG(ERROR) << "Could not snapshot layer in test compositor: " << *layer; return false; } @@ -85,8 +79,7 @@ bool EmbedderTestCompositorMetal::UpdateOffscrenComposition( if (layer_image) { // The image rendered by Flutter already has the correct offset and // transformation applied. The layers offset is meant for the platform. - canvas->drawImage(layer_image.get(), canvas_offset.x(), - canvas_offset.y()); + canvas->drawImage(layer_image.get(), canvas_offset.x(), canvas_offset.y()); } } diff --git a/shell/platform/embedder/tests/embedder_test_context_metal.cc b/shell/platform/embedder/tests/embedder_test_context_metal.mm similarity index 78% rename from shell/platform/embedder/tests/embedder_test_context_metal.cc rename to shell/platform/embedder/tests/embedder_test_context_metal.mm index ec16446e07100..1ffaad31b54e6 100644 --- a/shell/platform/embedder/tests/embedder_test_context_metal.cc +++ b/shell/platform/embedder/tests/embedder_test_context_metal.mm @@ -37,10 +37,9 @@ EmbedderTestContextType EmbedderTestContextMetal::GetContextType() const { void EmbedderTestContextMetal::SetupCompositor() { FML_CHECK(!compositor_) << "Already set up a compositor in this context."; - FML_CHECK(metal_surface_) - << "Set up the Metal surface before setting up a compositor."; - compositor_ = std::make_unique( - surface_size_, metal_surface_->GetGrContext()); + FML_CHECK(metal_surface_) << "Set up the Metal surface before setting up a compositor."; + compositor_ = + std::make_unique(surface_size_, metal_surface_->GetGrContext()); } TestMetalContext* EmbedderTestContextMetal::GetTestMetalContext() { @@ -51,8 +50,7 @@ TestMetalSurface* EmbedderTestContextMetal::GetTestMetalSurface() { return metal_surface_.get(); } -void EmbedderTestContextMetal::SetPresentCallback( - PresentCallback present_callback) { +void EmbedderTestContextMetal::SetPresentCallback(PresentCallback present_callback) { present_callback_ = std::move(present_callback); } @@ -71,11 +69,10 @@ void EmbedderTestContextMetal::SetExternalTextureCallback( external_texture_frame_callback_ = std::move(external_texture_frame_callback); } -bool EmbedderTestContextMetal::PopulateExternalTexture( - int64_t texture_id, - size_t w, - size_t h, - FlutterMetalExternalTexture* output) { +bool EmbedderTestContextMetal::PopulateExternalTexture(int64_t texture_id, + size_t w, + size_t h, + FlutterMetalExternalTexture* output) { if (external_texture_frame_callback_ != nullptr) { return external_texture_frame_callback_(texture_id, w, h, output); } else { @@ -88,8 +85,7 @@ void EmbedderTestContextMetal::SetNextDrawableCallback( next_drawable_callback_ = std::move(next_drawable_callback); } -FlutterMetalTexture EmbedderTestContextMetal::GetNextDrawable( - const FlutterFrameInfo* frame_info) { +FlutterMetalTexture EmbedderTestContextMetal::GetNextDrawable(const FlutterFrameInfo* frame_info) { if (next_drawable_callback_ != nullptr) { return next_drawable_callback_(frame_info); } @@ -98,8 +94,7 @@ FlutterMetalTexture EmbedderTestContextMetal::GetNextDrawable( FlutterMetalTexture texture = {}; texture.struct_size = sizeof(FlutterMetalTexture); texture.texture_id = texture_info.texture_id; - texture.texture = - reinterpret_cast(texture_info.texture); + texture.texture = reinterpret_cast(texture_info.texture); return texture; } diff --git a/testing/BUILD.gn b/testing/BUILD.gn index 4aa0ff9c524a8..8bf238a242970 100644 --- a/testing/BUILD.gn +++ b/testing/BUILD.gn @@ -199,8 +199,8 @@ if (is_mac || is_ios) { sources = [ "test_metal_context.h", "test_metal_context.mm", - "test_metal_surface.cc", "test_metal_surface.h", + "test_metal_surface.mm", "test_metal_surface_impl.h", "test_metal_surface_impl.mm", ] @@ -260,7 +260,7 @@ if (enable_unittests) { cflags_objc = flutter_cflags_objc_arc cflags_objcc = flutter_cflags_objcc_arc - sources += [ "test_metal_surface_unittests.cc" ] + sources += [ "test_metal_surface_unittests.mm" ] deps += [ ":metal" ] } } diff --git a/testing/test_metal_surface.cc b/testing/test_metal_surface.mm similarity index 91% rename from testing/test_metal_surface.cc rename to testing/test_metal_surface.mm index 15578b819133f..8aa4b0d673fed 100644 --- a/testing/test_metal_surface.cc +++ b/testing/test_metal_surface.mm @@ -18,16 +18,14 @@ bool TestMetalSurface::PlatformSupportsMetal() { std::unique_ptr TestMetalSurface::Create( const TestMetalContext& test_metal_context, SkISize surface_size) { - return std::make_unique(test_metal_context, - surface_size); + return std::make_unique(test_metal_context, surface_size); } std::unique_ptr TestMetalSurface::Create( const TestMetalContext& test_metal_context, int64_t texture_id, SkISize surface_size) { - return std::make_unique(test_metal_context, texture_id, - surface_size); + return std::make_unique(test_metal_context, texture_id, surface_size); } TestMetalSurface::TestMetalSurface() = default; diff --git a/testing/test_metal_surface_unittests.cc b/testing/test_metal_surface_unittests.mm similarity index 92% rename from testing/test_metal_surface_unittests.cc rename to testing/test_metal_surface_unittests.mm index daf53170dc9fd..69bb436164089 100644 --- a/testing/test_metal_surface_unittests.cc +++ b/testing/test_metal_surface_unittests.mm @@ -28,8 +28,7 @@ TEST(TestMetalSurface, CanCreateValidTestMetalSurface) { } TestMetalContext metal_context = TestMetalContext(); - auto surface = - TestMetalSurface::Create(metal_context, SkISize::Make(100, 100)); + auto surface = TestMetalSurface::Create(metal_context, SkISize::Make(100, 100)); ASSERT_NE(surface, nullptr); ASSERT_TRUE(surface->IsValid()); ASSERT_NE(surface->GetSurface(), nullptr);