From f01b0705ebcc9525e9200863bd4eb3979c6662fa Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Wed, 13 Nov 2024 18:10:49 -0800 Subject: [PATCH] Embedder: Refactor EmbedderTestContext creation (flutter/engine#56563) Extracts creation of graphics backend specfic EmbedderTestContext creation to their own translation units. In particular, this allows for less conditional header includes, and more specifically, for code relating to the Metal backend to include headers that include Objective-C types -- today we cast these all to void* to avoid declaring them in headers, which requires special handling for ARC. An alternative approach would have been to extract backend-specific subclasses, but there are test suites such as `EmbedderTestMultiBackend` that are executed against multiple backends, which make that approach impractical. No test changes since this patch makes 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 --- .../flutter/shell/platform/embedder/BUILD.gn | 3 + .../platform/embedder/tests/embedder_test.cc | 72 ++++++++++--------- .../platform/embedder/tests/embedder_test.h | 11 +-- .../embedder/tests/embedder_test_gl.cc | 15 ++++ .../embedder/tests/embedder_test_metal.mm | 15 ++++ .../embedder/tests/embedder_test_vulkan.cc | 15 ++++ 6 files changed, 94 insertions(+), 37 deletions(-) create mode 100644 engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl.cc create mode 100644 engine/src/flutter/shell/platform/embedder/tests/embedder_test_metal.mm create mode 100644 engine/src/flutter/shell/platform/embedder/tests/embedder_test_vulkan.cc diff --git a/engine/src/flutter/shell/platform/embedder/BUILD.gn b/engine/src/flutter/shell/platform/embedder/BUILD.gn index a0c1b25899..849bc8fcee 100644 --- a/engine/src/flutter/shell/platform/embedder/BUILD.gn +++ b/engine/src/flutter/shell/platform/embedder/BUILD.gn @@ -317,6 +317,7 @@ if (enable_unittests) { "tests/embedder_test_compositor_gl.h", "tests/embedder_test_context_gl.cc", "tests/embedder_test_context_gl.h", + "tests/embedder_test_gl.cc", ] public_deps += [ @@ -331,6 +332,7 @@ if (enable_unittests) { "tests/embedder_test_compositor_metal.h", "tests/embedder_test_context_metal.cc", "tests/embedder_test_context_metal.h", + "tests/embedder_test_metal.mm", ] public_deps += [ "//flutter/testing:metal" ] @@ -342,6 +344,7 @@ if (enable_unittests) { "tests/embedder_test_compositor_vulkan.h", "tests/embedder_test_context_vulkan.cc", "tests/embedder_test_context_vulkan.h", + "tests/embedder_test_vulkan.cc", ] public_deps += [ diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_test.cc b/engine/src/flutter/shell/platform/embedder/tests/embedder_test.cc index 0b557d318e..10eb559560 100644 --- a/engine/src/flutter/shell/platform/embedder/tests/embedder_test.cc +++ b/engine/src/flutter/shell/platform/embedder/tests/embedder_test.cc @@ -5,20 +5,7 @@ #include "flutter/shell/platform/embedder/tests/embedder_test.h" #include "flutter/shell/platform/embedder/tests/embedder_test_context_software.h" -#ifdef SHELL_ENABLE_GL -#include "flutter/shell/platform/embedder/tests/embedder_test_context_gl.h" -#endif - -#ifdef SHELL_ENABLE_METAL -#include "flutter/shell/platform/embedder/tests/embedder_test_context_metal.h" -#endif - -#ifdef SHELL_ENABLE_VULKAN -#include "flutter/shell/platform/embedder/tests/embedder_test_context_vulkan.h" -#endif - -namespace flutter { -namespace testing { +namespace flutter::testing { EmbedderTest::EmbedderTest() = default; @@ -33,28 +20,17 @@ EmbedderTestContext& EmbedderTest::GetEmbedderContext( if (!embedder_contexts_[type]) { switch (type) { case EmbedderTestContextType::kSoftwareContext: - embedder_contexts_[type] = - std::make_unique( - GetFixturesDirectory()); + embedder_contexts_[type] = CreateSoftwareContext(); break; -#ifdef SHELL_ENABLE_VULKAN - case EmbedderTestContextType::kVulkanContext: - embedder_contexts_[type] = - std::make_unique(GetFixturesDirectory()); - break; -#endif -#ifdef SHELL_ENABLE_GL case EmbedderTestContextType::kOpenGLContext: - embedder_contexts_[type] = - std::make_unique(GetFixturesDirectory()); + embedder_contexts_[type] = CreateGLContext(); + break; + case EmbedderTestContextType::kVulkanContext: + embedder_contexts_[type] = CreateVulkanContext(); break; -#endif -#ifdef SHELL_ENABLE_METAL case EmbedderTestContextType::kMetalContext: - embedder_contexts_[type] = - std::make_unique(GetFixturesDirectory()); + embedder_contexts_[type] = CreateMetalContext(); break; -#endif default: FML_DCHECK(false) << "Invalid context type specified."; break; @@ -64,5 +40,35 @@ EmbedderTestContext& EmbedderTest::GetEmbedderContext( return *embedder_contexts_[type]; } -} // namespace testing -} // namespace flutter +std::unique_ptr EmbedderTest::CreateSoftwareContext() { + return std::make_unique(GetFixturesDirectory()); +} + +#ifndef SHELL_ENABLE_GL +// Fallback implementation. +// See: flutter/shell/platform/embedder/tests/embedder_test_gl.cc. +std::unique_ptr EmbedderTest::CreateGLContext() { + FML_LOG(FATAL) << "OpenGL is not supported in this build"; + return nullptr; +} +#endif + +#ifndef SHELL_ENABLE_METAL +// Fallback implementation. +// See: flutter/shell/platform/embedder/tests/embedder_test_metal.mm. +std::unique_ptr EmbedderTest::CreateMetalContext() { + FML_LOG(FATAL) << "Metal is not supported in this build"; + return nullptr; +} +#endif + +#ifndef SHELL_ENABLE_VULKAN +// Fallback implementation. +// See: flutter/shell/platform/embedder/tests/embedder_test_vulkan.cc. +std::unique_ptr EmbedderTest::CreateVulkanContext() { + FML_LOG(FATAL) << "Vulkan is not supported in this build"; + return nullptr; +} +#endif + +} // namespace flutter::testing diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_test.h b/engine/src/flutter/shell/platform/embedder/tests/embedder_test.h index eb16637872..4ba11ffdb4 100644 --- a/engine/src/flutter/shell/platform/embedder/tests/embedder_test.h +++ b/engine/src/flutter/shell/platform/embedder/tests/embedder_test.h @@ -14,8 +14,7 @@ #include "flutter/testing/thread_test.h" #include "gtest/gtest.h" -namespace flutter { -namespace testing { +namespace flutter::testing { class EmbedderTest : public ThreadTest { public: @@ -29,6 +28,11 @@ class EmbedderTest : public ThreadTest { std::map> embedder_contexts_; + std::unique_ptr CreateSoftwareContext(); + std::unique_ptr CreateGLContext(); + std::unique_ptr CreateMetalContext(); + std::unique_ptr CreateVulkanContext(); + FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTest); }; @@ -36,7 +40,6 @@ class EmbedderTestMultiBackend : public EmbedderTest, public ::testing::WithParamInterface {}; -} // namespace testing -} // namespace flutter +} // namespace flutter::testing #endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_H_ diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl.cc b/engine/src/flutter/shell/platform/embedder/tests/embedder_test_gl.cc new file mode 100644 index 0000000000..6361437b57 --- /dev/null +++ b/engine/src/flutter/shell/platform/embedder/tests/embedder_test_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/shell/platform/embedder/tests/embedder_test.h" + +#include "flutter/shell/platform/embedder/tests/embedder_test_context_gl.h" + +namespace flutter::testing { + +std::unique_ptr EmbedderTest::CreateGLContext() { + return std::make_unique(GetFixturesDirectory()); +} + +} // namespace flutter::testing diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_test_metal.mm b/engine/src/flutter/shell/platform/embedder/tests/embedder_test_metal.mm new file mode 100644 index 0000000000..63c210fced --- /dev/null +++ b/engine/src/flutter/shell/platform/embedder/tests/embedder_test_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/shell/platform/embedder/tests/embedder_test.h" + +#include "flutter/shell/platform/embedder/tests/embedder_test_context_metal.h" + +namespace flutter::testing { + +std::unique_ptr EmbedderTest::CreateMetalContext() { + return std::make_unique(GetFixturesDirectory()); +} + +} // namespace flutter::testing diff --git a/engine/src/flutter/shell/platform/embedder/tests/embedder_test_vulkan.cc b/engine/src/flutter/shell/platform/embedder/tests/embedder_test_vulkan.cc new file mode 100644 index 0000000000..2dea4f6265 --- /dev/null +++ b/engine/src/flutter/shell/platform/embedder/tests/embedder_test_vulkan.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/shell/platform/embedder/tests/embedder_test.h" + +#include "flutter/shell/platform/embedder/tests/embedder_test_context_vulkan.h" + +namespace flutter::testing { + +std::unique_ptr EmbedderTest::CreateVulkanContext() { + return std::make_unique(GetFixturesDirectory()); +} + +} // namespace flutter::testing