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
This commit is contained in:
Chris Bracken
2024-11-13 18:10:49 -08:00
committed by GitHub
parent bcfae15d0e
commit f01b0705eb
6 changed files with 94 additions and 37 deletions

View File

@@ -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 += [

View File

@@ -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<EmbedderTestContextSoftware>(
GetFixturesDirectory());
embedder_contexts_[type] = CreateSoftwareContext();
break;
#ifdef SHELL_ENABLE_VULKAN
case EmbedderTestContextType::kVulkanContext:
embedder_contexts_[type] =
std::make_unique<EmbedderTestContextVulkan>(GetFixturesDirectory());
break;
#endif
#ifdef SHELL_ENABLE_GL
case EmbedderTestContextType::kOpenGLContext:
embedder_contexts_[type] =
std::make_unique<EmbedderTestContextGL>(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<EmbedderTestContextMetal>(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<EmbedderTestContext> EmbedderTest::CreateSoftwareContext() {
return std::make_unique<EmbedderTestContextSoftware>(GetFixturesDirectory());
}
#ifndef SHELL_ENABLE_GL
// Fallback implementation.
// See: flutter/shell/platform/embedder/tests/embedder_test_gl.cc.
std::unique_ptr<EmbedderTestContext> 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<EmbedderTestContext> 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<EmbedderTestContext> EmbedderTest::CreateVulkanContext() {
FML_LOG(FATAL) << "Vulkan is not supported in this build";
return nullptr;
}
#endif
} // namespace flutter::testing

View File

@@ -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<EmbedderTestContextType, std::unique_ptr<EmbedderTestContext>>
embedder_contexts_;
std::unique_ptr<EmbedderTestContext> CreateSoftwareContext();
std::unique_ptr<EmbedderTestContext> CreateGLContext();
std::unique_ptr<EmbedderTestContext> CreateMetalContext();
std::unique_ptr<EmbedderTestContext> CreateVulkanContext();
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTest);
};
@@ -36,7 +40,6 @@ class EmbedderTestMultiBackend
: public EmbedderTest,
public ::testing::WithParamInterface<EmbedderTestContextType> {};
} // namespace testing
} // namespace flutter
} // namespace flutter::testing
#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_H_

View File

@@ -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<EmbedderTestContext> EmbedderTest::CreateGLContext() {
return std::make_unique<EmbedderTestContextGL>(GetFixturesDirectory());
}
} // namespace flutter::testing

View File

@@ -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<EmbedderTestContext> EmbedderTest::CreateMetalContext() {
return std::make_unique<EmbedderTestContextMetal>(GetFixturesDirectory());
}
} // namespace flutter::testing

View File

@@ -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<EmbedderTestContext> EmbedderTest::CreateVulkanContext() {
return std::make_unique<EmbedderTestContextVulkan>(GetFixturesDirectory());
}
} // namespace flutter::testing