From 055f3d8edd28b8b7443f4dd965bd56a2f71aeb2f Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Tue, 19 Nov 2024 12:20:05 -0800 Subject: [PATCH] display_list: Extract backend-specific surface providers (flutter/engine#56711) Extracts backend-specific code in DlSurfaceProvider to separate translation units. In particular, this allows for less conditional header includes, and more specifically, allows code relating to the Metal backend to include headers that include ARC-managed Objective-C types. Today we cast these all to void* (and manage refcounting manually) since these headers are included in dl_surface_provider.cc, which is a pure C++ translation unit. No test changes since this patch includes no semantic changes. Issue: https://github.com/flutter/flutter/issues/137801 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style --- .../src/flutter/display_list/testing/BUILD.gn | 3 + .../testing/dl_test_surface_provider.cc | 58 +++++++++---------- .../testing/dl_test_surface_provider.h | 5 ++ .../testing/dl_test_surface_provider_gl.cc | 15 +++++ .../testing/dl_test_surface_provider_metal.mm | 15 +++++ .../dl_test_surface_provider_software.cc | 15 +++++ 6 files changed, 79 insertions(+), 32 deletions(-) create mode 100644 engine/src/flutter/display_list/testing/dl_test_surface_provider_gl.cc create mode 100644 engine/src/flutter/display_list/testing/dl_test_surface_provider_metal.mm create mode 100644 engine/src/flutter/display_list/testing/dl_test_surface_provider_software.cc diff --git a/engine/src/flutter/display_list/testing/BUILD.gn b/engine/src/flutter/display_list/testing/BUILD.gn index 915daeab955..fc48324c76e 100644 --- a/engine/src/flutter/display_list/testing/BUILD.gn +++ b/engine/src/flutter/display_list/testing/BUILD.gn @@ -86,6 +86,7 @@ source_set("display_list_surface_provider") { if (surface_provider_include_software) { sources += [ + "dl_test_surface_provider_software.cc", "dl_test_surface_software.cc", "dl_test_surface_software.h", ] @@ -95,6 +96,7 @@ source_set("display_list_surface_provider") { sources += [ "dl_test_surface_gl.cc", "dl_test_surface_gl.h", + "dl_test_surface_provider_gl.cc", ] deps += [ "//flutter/testing:opengl" ] } @@ -103,6 +105,7 @@ source_set("display_list_surface_provider") { sources += [ "dl_test_surface_metal.h", "dl_test_surface_metal.mm", + "dl_test_surface_provider_metal.mm", ] deps += [ "//flutter/impeller/display_list", diff --git a/engine/src/flutter/display_list/testing/dl_test_surface_provider.cc b/engine/src/flutter/display_list/testing/dl_test_surface_provider.cc index ab7d75c0901..545b3cfa0de 100644 --- a/engine/src/flutter/display_list/testing/dl_test_surface_provider.cc +++ b/engine/src/flutter/display_list/testing/dl_test_surface_provider.cc @@ -10,50 +10,29 @@ #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/encode/SkPngEncoder.h" -#ifdef ENABLE_SOFTWARE_BENCHMARKS -#include "flutter/display_list/testing/dl_test_surface_software.h" -#endif -#ifdef ENABLE_OPENGL_BENCHMARKS -#include "flutter/display_list/testing/dl_test_surface_gl.h" -#endif -#ifdef ENABLE_METAL_BENCHMARKS -#include "flutter/display_list/testing/dl_test_surface_metal.h" -#endif - -namespace flutter { -namespace testing { +namespace flutter::testing { std::string DlSurfaceProvider::BackendName(BackendType type) { switch (type) { - case kMetalBackend: - return "Metal"; - case kOpenGlBackend: - return "OpenGL"; case kSoftwareBackend: return "Software"; + case kOpenGlBackend: + return "OpenGL"; + case kMetalBackend: + return "Metal"; } } std::unique_ptr DlSurfaceProvider::Create( BackendType backend_type) { switch (backend_type) { -#ifdef ENABLE_SOFTWARE_BENCHMARKS case kSoftwareBackend: - return std::make_unique(); -#endif -#ifdef ENABLE_OPENGL_BENCHMARKS - case kOpenGLBackend: - return std::make_unique(); -#endif -#ifdef ENABLE_METAL_BENCHMARKS + return CreateSoftware(); + case kOpenGlBackend: + return CreateOpenGL(); case kMetalBackend: - return std::make_unique(); -#endif - default: - return nullptr; + return CreateMetal(); } - - return nullptr; } bool DlSurfaceProvider::Snapshot(std::string& filename) const { @@ -78,5 +57,20 @@ bool DlSurfaceProvider::Snapshot(std::string& filename) const { #endif } -} // namespace testing -} // namespace flutter +#ifndef ENABLE_SOFTWARE_BENCHMARKS +std::unique_ptr DlSurfaceProvider::CreateSoftware() { + return nullptr; +} +#endif +#ifndef ENABLE_OPENGL_BENCHMARKS +std::unique_ptr DlSurfaceProvider::CreateOpenGL() { + return nullptr; +} +#endif +#ifndef ENABLE_METAL_BENCHMARKS +std::unique_ptr DlSurfaceProvider::CreateMetal() { + return nullptr; +} +#endif + +} // namespace flutter::testing diff --git a/engine/src/flutter/display_list/testing/dl_test_surface_provider.h b/engine/src/flutter/display_list/testing/dl_test_surface_provider.h index 1ad4af789cb..5bfc7105023 100644 --- a/engine/src/flutter/display_list/testing/dl_test_surface_provider.h +++ b/engine/src/flutter/display_list/testing/dl_test_surface_provider.h @@ -97,6 +97,11 @@ class DlSurfaceProvider { protected: DlSurfaceProvider() = default; + + private: + static std::unique_ptr CreateSoftware(); + static std::unique_ptr CreateMetal(); + static std::unique_ptr CreateOpenGL(); }; } // namespace testing diff --git a/engine/src/flutter/display_list/testing/dl_test_surface_provider_gl.cc b/engine/src/flutter/display_list/testing/dl_test_surface_provider_gl.cc new file mode 100644 index 00000000000..0d258d0c6b2 --- /dev/null +++ b/engine/src/flutter/display_list/testing/dl_test_surface_provider_gl.cc @@ -0,0 +1,15 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/display_list/testing/dl_test_surface_provider.h" + +#include "flutter/display_list/testing/dl_test_surface_gl.h" + +namespace flutter::testing { + +std::unique_ptr DlSurfaceProvider::CreateOpenGL() { + return std::make_unique(); +} + +} // namespace flutter::testing diff --git a/engine/src/flutter/display_list/testing/dl_test_surface_provider_metal.mm b/engine/src/flutter/display_list/testing/dl_test_surface_provider_metal.mm new file mode 100644 index 00000000000..95de93dee08 --- /dev/null +++ b/engine/src/flutter/display_list/testing/dl_test_surface_provider_metal.mm @@ -0,0 +1,15 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/display_list/testing/dl_test_surface_provider.h" + +#include "flutter/display_list/testing/dl_test_surface_metal.h" + +namespace flutter::testing { + +std::unique_ptr DlSurfaceProvider::CreateMetal() { + return std::make_unique(); +} + +} // namespace flutter::testing diff --git a/engine/src/flutter/display_list/testing/dl_test_surface_provider_software.cc b/engine/src/flutter/display_list/testing/dl_test_surface_provider_software.cc new file mode 100644 index 00000000000..6da75c41ab8 --- /dev/null +++ b/engine/src/flutter/display_list/testing/dl_test_surface_provider_software.cc @@ -0,0 +1,15 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/display_list/testing/dl_test_surface_provider.h" + +#include "flutter/display_list/testing/dl_test_surface_software.h" + +namespace flutter::testing { + +std::unique_ptr DlSurfaceProvider::CreateSoftware() { + return std::make_unique(); +} + +} // namespace flutter::testing