Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit a304e2e

Browse files
authored
Embedder: Refactor EmbedderConfigBuilder by backend (#56598)
Extracts backend-specific code in EmbedderConfigBuilder to separate 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 currently make that approach impractical, though that should likely be the long-term goal. Issue: flutter/flutter#137801 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
1 parent 3e326c3 commit a304e2e

8 files changed

+284
-221
lines changed

shell/platform/embedder/BUILD.gn

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ if (enable_unittests) {
313313

314314
if (test_enable_gl) {
315315
sources += [
316+
"tests/embedder_config_builder_gl.cc",
316317
"tests/embedder_test_compositor_gl.cc",
317318
"tests/embedder_test_compositor_gl.h",
318319
"tests/embedder_test_context_gl.cc",
@@ -328,6 +329,7 @@ if (enable_unittests) {
328329

329330
if (test_enable_metal) {
330331
sources += [
332+
"tests/embedder_config_builder_metal.mm",
331333
"tests/embedder_test_compositor_metal.h",
332334
"tests/embedder_test_compositor_metal.mm",
333335
"tests/embedder_test_context_metal.h",
@@ -340,6 +342,7 @@ if (enable_unittests) {
340342

341343
if (test_enable_vulkan) {
342344
sources += [
345+
"tests/embedder_config_builder_vulkan.cc",
343346
"tests/embedder_test_compositor_vulkan.cc",
344347
"tests/embedder_test_compositor_vulkan.h",
345348
"tests/embedder_test_context_vulkan.cc",

shell/platform/embedder/tests/embedder_config_builder.cc

Lines changed: 41 additions & 212 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,7 @@
1111
#include "third_party/skia/include/core/SkBitmap.h"
1212
#include "third_party/skia/include/core/SkImage.h"
1313

14-
#ifdef SHELL_ENABLE_GL
15-
#include "flutter/shell/platform/embedder/tests/embedder_test_compositor_gl.h"
16-
#include "flutter/shell/platform/embedder/tests/embedder_test_context_gl.h"
17-
#endif
18-
19-
#ifdef SHELL_ENABLE_VULKAN
20-
#include "flutter/shell/platform/embedder/tests/embedder_test_context_vulkan.h"
21-
#include "flutter/vulkan/vulkan_device.h" // nogncheck
22-
#include "vulkan/vulkan_core.h" // nogncheck
23-
#endif
24-
25-
#ifdef SHELL_ENABLE_METAL
26-
#include "flutter/shell/platform/embedder/tests/embedder_test_context_metal.h"
27-
#endif
28-
29-
namespace flutter {
30-
namespace testing {
14+
namespace flutter::testing {
3115

3216
EmbedderConfigBuilder::EmbedderConfigBuilder(
3317
EmbedderTestContext& context,
@@ -43,49 +27,9 @@ EmbedderConfigBuilder::EmbedderConfigBuilder(
4327

4428
custom_task_runners_.struct_size = sizeof(FlutterCustomTaskRunners);
4529

46-
#ifdef SHELL_ENABLE_GL
47-
opengl_renderer_config_.struct_size = sizeof(FlutterOpenGLRendererConfig);
48-
opengl_renderer_config_.make_current = [](void* context) -> bool {
49-
return reinterpret_cast<EmbedderTestContextGL*>(context)->GLMakeCurrent();
50-
};
51-
opengl_renderer_config_.clear_current = [](void* context) -> bool {
52-
return reinterpret_cast<EmbedderTestContextGL*>(context)->GLClearCurrent();
53-
};
54-
opengl_renderer_config_.present_with_info =
55-
[](void* context, const FlutterPresentInfo* present_info) -> bool {
56-
return reinterpret_cast<EmbedderTestContextGL*>(context)->GLPresent(
57-
*present_info);
58-
};
59-
opengl_renderer_config_.fbo_with_frame_info_callback =
60-
[](void* context, const FlutterFrameInfo* frame_info) -> uint32_t {
61-
return reinterpret_cast<EmbedderTestContextGL*>(context)->GLGetFramebuffer(
62-
*frame_info);
63-
};
64-
opengl_renderer_config_.populate_existing_damage = nullptr;
65-
opengl_renderer_config_.make_resource_current = [](void* context) -> bool {
66-
return reinterpret_cast<EmbedderTestContextGL*>(context)
67-
->GLMakeResourceCurrent();
68-
};
69-
opengl_renderer_config_.gl_proc_resolver = [](void* context,
70-
const char* name) -> void* {
71-
return reinterpret_cast<EmbedderTestContextGL*>(context)->GLGetProcAddress(
72-
name);
73-
};
74-
opengl_renderer_config_.fbo_reset_after_present = true;
75-
opengl_renderer_config_.surface_transformation =
76-
[](void* context) -> FlutterTransformation {
77-
return reinterpret_cast<EmbedderTestContext*>(context)
78-
->GetRootSurfaceTransformation();
79-
};
80-
#endif
81-
82-
#ifdef SHELL_ENABLE_METAL
30+
InitializeGLRendererConfig();
8331
InitializeMetalRendererConfig();
84-
#endif
85-
86-
#ifdef SHELL_ENABLE_VULKAN
8732
InitializeVulkanRendererConfig();
88-
#endif
8933

9034
software_renderer_config_.struct_size = sizeof(FlutterSoftwareRendererConfig);
9135
software_renderer_config_.surface_present_callback =
@@ -141,37 +85,6 @@ void EmbedderConfigBuilder::SetSoftwareRendererConfig(SkISize surface_size) {
14185
context_.SetupSurface(surface_size);
14286
}
14387

144-
void EmbedderConfigBuilder::SetOpenGLFBOCallBack() {
145-
#ifdef SHELL_ENABLE_GL
146-
// SetOpenGLRendererConfig must be called before this.
147-
FML_CHECK(renderer_config_.type == FlutterRendererType::kOpenGL);
148-
renderer_config_.open_gl.fbo_callback = [](void* context) -> uint32_t {
149-
FlutterFrameInfo frame_info = {};
150-
// fbo_callback doesn't use the frame size information, only
151-
// fbo_callback_with_frame_info does.
152-
frame_info.struct_size = sizeof(FlutterFrameInfo);
153-
frame_info.size.width = 0;
154-
frame_info.size.height = 0;
155-
return reinterpret_cast<EmbedderTestContextGL*>(context)->GLGetFramebuffer(
156-
frame_info);
157-
};
158-
#endif
159-
}
160-
161-
void EmbedderConfigBuilder::SetOpenGLPresentCallBack() {
162-
#ifdef SHELL_ENABLE_GL
163-
// SetOpenGLRendererConfig must be called before this.
164-
FML_CHECK(renderer_config_.type == FlutterRendererType::kOpenGL);
165-
renderer_config_.open_gl.present = [](void* context) -> bool {
166-
// passing a placeholder fbo_id.
167-
return reinterpret_cast<EmbedderTestContextGL*>(context)->GLPresent(
168-
FlutterPresentInfo{
169-
.fbo_id = 0,
170-
});
171-
};
172-
#endif
173-
}
174-
17588
void EmbedderConfigBuilder::SetRendererConfig(EmbedderTestContextType type,
17689
SkISize surface_size) {
17790
switch (type) {
@@ -190,38 +103,6 @@ void EmbedderConfigBuilder::SetRendererConfig(EmbedderTestContextType type,
190103
}
191104
}
192105

193-
void EmbedderConfigBuilder::SetOpenGLRendererConfig(SkISize surface_size) {
194-
#ifdef SHELL_ENABLE_GL
195-
renderer_config_.type = FlutterRendererType::kOpenGL;
196-
renderer_config_.open_gl = opengl_renderer_config_;
197-
context_.SetupSurface(surface_size);
198-
#endif
199-
}
200-
201-
void EmbedderConfigBuilder::SetMetalRendererConfig(SkISize surface_size) {
202-
#ifdef SHELL_ENABLE_METAL
203-
renderer_config_.type = FlutterRendererType::kMetal;
204-
renderer_config_.metal = metal_renderer_config_;
205-
context_.SetupSurface(surface_size);
206-
#endif
207-
}
208-
209-
void EmbedderConfigBuilder::SetVulkanRendererConfig(
210-
SkISize surface_size,
211-
std::optional<FlutterVulkanInstanceProcAddressCallback>
212-
instance_proc_address_callback) {
213-
#ifdef SHELL_ENABLE_VULKAN
214-
renderer_config_.type = FlutterRendererType::kVulkan;
215-
FlutterVulkanRendererConfig vulkan_renderer_config = vulkan_renderer_config_;
216-
if (instance_proc_address_callback.has_value()) {
217-
vulkan_renderer_config.get_instance_proc_address_callback =
218-
instance_proc_address_callback.value();
219-
}
220-
renderer_config_.vulkan = vulkan_renderer_config;
221-
context_.SetupSurface(surface_size);
222-
#endif
223-
}
224-
225106
void EmbedderConfigBuilder::SetAssetsPath() {
226107
project_args_.assets_path = context_.GetAssetsPath().c_str();
227108
}
@@ -406,18 +287,7 @@ FlutterCompositor& EmbedderConfigBuilder::GetCompositor() {
406287
void EmbedderConfigBuilder::SetRenderTargetType(
407288
EmbedderTestBackingStoreProducer::RenderTargetType type,
408289
FlutterSoftwarePixelFormat software_pixfmt) {
409-
auto& compositor = context_.GetCompositor();
410-
411-
auto producer = std::make_unique<EmbedderTestBackingStoreProducer>(
412-
compositor.GetGrContext(), type, software_pixfmt);
413-
414-
#ifdef SHELL_ENABLE_GL
415-
producer->SetEGLContext(context_.egl_context_);
416-
#endif
417-
418-
// TODO(wrightgeorge): figure out a better way of plumbing through the
419-
// GrDirectContext
420-
compositor.SetBackingStoreProducer(std::move(producer));
290+
context_.SetRenderTargetType(type, software_pixfmt);
421291
}
422292

423293
UniqueEngine EmbedderConfigBuilder::LaunchEngine() const {
@@ -479,93 +349,52 @@ UniqueEngine EmbedderConfigBuilder::SetupEngine(bool run) const {
479349
return UniqueEngine{engine};
480350
}
481351

482-
#ifdef SHELL_ENABLE_METAL
352+
#ifndef SHELL_ENABLE_GL
353+
// OpenGL fallback implementations.
354+
// See: flutter/shell/platform/embedder/tests/embedder_config_builder_gl.cc.
483355

484-
void EmbedderConfigBuilder::InitializeMetalRendererConfig() {
485-
if (context_.GetContextType() != EmbedderTestContextType::kMetalContext) {
486-
return;
487-
}
356+
void EmbedderConfigBuilder::InitializeGLRendererConfig() {
357+
// no-op.
358+
}
488359

489-
metal_renderer_config_.struct_size = sizeof(metal_renderer_config_);
490-
EmbedderTestContextMetal& metal_context =
491-
reinterpret_cast<EmbedderTestContextMetal&>(context_);
492-
493-
metal_renderer_config_.device =
494-
metal_context.GetTestMetalContext()->GetMetalDevice();
495-
metal_renderer_config_.present_command_queue =
496-
metal_context.GetTestMetalContext()->GetMetalCommandQueue();
497-
metal_renderer_config_.get_next_drawable_callback =
498-
[](void* user_data, const FlutterFrameInfo* frame_info) {
499-
return reinterpret_cast<EmbedderTestContextMetal*>(user_data)
500-
->GetNextDrawable(frame_info);
501-
};
502-
metal_renderer_config_.present_drawable_callback =
503-
[](void* user_data, const FlutterMetalTexture* texture) -> bool {
504-
EmbedderTestContextMetal* metal_context =
505-
reinterpret_cast<EmbedderTestContextMetal*>(user_data);
506-
return metal_context->Present(texture->texture_id);
507-
};
508-
metal_renderer_config_.external_texture_frame_callback =
509-
[](void* user_data, int64_t texture_id, size_t width, size_t height,
510-
FlutterMetalExternalTexture* texture_out) -> bool {
511-
EmbedderTestContextMetal* metal_context =
512-
reinterpret_cast<EmbedderTestContextMetal*>(user_data);
513-
return metal_context->PopulateExternalTexture(texture_id, width, height,
514-
texture_out);
515-
};
360+
void EmbedderConfigBuilder::SetOpenGLFBOCallBack() {
361+
FML_LOG(FATAL) << "OpenGL is not enabled in this build.";
516362
}
517363

518-
#endif // SHELL_ENABLE_METAL
364+
void EmbedderConfigBuilder::SetOpenGLPresentCallBack() {
365+
FML_LOG(FATAL) << "OpenGL is not enabled in this build.";
366+
}
519367

520-
#ifdef SHELL_ENABLE_VULKAN
368+
void EmbedderConfigBuilder::SetOpenGLRendererConfig(SkISize surface_size) {
369+
FML_LOG(FATAL) << "OpenGL is not enabled in this build.";
370+
}
371+
#endif
372+
#ifndef SHELL_ENABLE_METAL
373+
// Metal fallback implementations.
374+
// See: flutter/shell/platform/embedder/tests/embedder_config_builder_metal.mm.
521375

522-
void EmbedderConfigBuilder::InitializeVulkanRendererConfig() {
523-
if (context_.GetContextType() != EmbedderTestContextType::kVulkanContext) {
524-
return;
525-
}
376+
void EmbedderConfigBuilder::InitializeMetalRendererConfig() {
377+
// no-op.
378+
}
526379

527-
vulkan_renderer_config_.struct_size = sizeof(FlutterVulkanRendererConfig);
528-
vulkan_renderer_config_.version =
529-
static_cast<EmbedderTestContextVulkan&>(context_)
530-
.vulkan_context_->application_->GetAPIVersion();
531-
vulkan_renderer_config_.instance =
532-
static_cast<EmbedderTestContextVulkan&>(context_)
533-
.vulkan_context_->application_->GetInstance();
534-
vulkan_renderer_config_.physical_device =
535-
static_cast<EmbedderTestContextVulkan&>(context_)
536-
.vulkan_context_->device_->GetPhysicalDeviceHandle();
537-
vulkan_renderer_config_.device =
538-
static_cast<EmbedderTestContextVulkan&>(context_)
539-
.vulkan_context_->device_->GetHandle();
540-
vulkan_renderer_config_.queue_family_index =
541-
static_cast<EmbedderTestContextVulkan&>(context_)
542-
.vulkan_context_->device_->GetGraphicsQueueIndex();
543-
vulkan_renderer_config_.queue =
544-
static_cast<EmbedderTestContextVulkan&>(context_)
545-
.vulkan_context_->device_->GetQueueHandle();
546-
vulkan_renderer_config_.get_instance_proc_address_callback =
547-
EmbedderTestContextVulkan::InstanceProcAddr;
548-
vulkan_renderer_config_.get_next_image_callback =
549-
[](void* context,
550-
const FlutterFrameInfo* frame_info) -> FlutterVulkanImage {
551-
VkImage image =
552-
reinterpret_cast<EmbedderTestContextVulkan*>(context)->GetNextImage(
553-
{static_cast<int>(frame_info->size.width),
554-
static_cast<int>(frame_info->size.height)});
555-
return {
556-
.struct_size = sizeof(FlutterVulkanImage),
557-
.image = reinterpret_cast<uint64_t>(image),
558-
.format = VK_FORMAT_R8G8B8A8_UNORM,
559-
};
560-
};
561-
vulkan_renderer_config_.present_image_callback =
562-
[](void* context, const FlutterVulkanImage* image) -> bool {
563-
return reinterpret_cast<EmbedderTestContextVulkan*>(context)->PresentImage(
564-
reinterpret_cast<VkImage>(image->image));
565-
};
380+
void EmbedderConfigBuilder::SetMetalRendererConfig(SkISize surface_size) {
381+
FML_LOG(FATAL) << "Metal is not enabled in this build.";
382+
}
383+
#endif
384+
#ifndef SHELL_ENABLE_VULKAN
385+
// Vulkan fallback implementations.
386+
// See: flutter/shell/platform/embedder/tests/embedder_config_builder_vulkan.cc.
387+
388+
void EmbedderConfigBuilder::InitializeVulkanRendererConfig() {
389+
// no-op.
566390
}
567391

392+
void EmbedderConfigBuilder::SetVulkanRendererConfig(
393+
SkISize surface_size,
394+
std::optional<FlutterVulkanInstanceProcAddressCallback>
395+
instance_proc_address_callback) {
396+
FML_LOG(FATAL) << "Vulkan is not enabled in this build.";
397+
}
568398
#endif
569399

570-
} // namespace testing
571-
} // namespace flutter
400+
} // namespace flutter::testing

shell/platform/embedder/tests/embedder_config_builder.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
#include "flutter/shell/platform/embedder/tests/embedder_test.h"
1212
#include "flutter/shell/platform/embedder/tests/embedder_test_context_software.h"
1313

14-
namespace flutter {
15-
namespace testing {
14+
namespace flutter::testing {
1615

1716
struct UniqueEngineTraits {
1817
static FlutterEngine InvalidValue() { return nullptr; }
@@ -126,20 +125,22 @@ class EmbedderConfigBuilder {
126125
void SetupVsyncCallback();
127126

128127
private:
128+
void InitializeGLRendererConfig();
129+
void InitializeVulkanRendererConfig();
130+
void InitializeMetalRendererConfig();
131+
129132
EmbedderTestContext& context_;
130133
FlutterProjectArgs project_args_ = {};
131134
FlutterRendererConfig renderer_config_ = {};
132135
FlutterSoftwareRendererConfig software_renderer_config_ = {};
133136
#ifdef SHELL_ENABLE_GL
134137
FlutterOpenGLRendererConfig opengl_renderer_config_ = {};
135138
#endif
136-
#ifdef SHELL_ENABLE_VULKAN
137-
void InitializeVulkanRendererConfig();
138-
FlutterVulkanRendererConfig vulkan_renderer_config_ = {};
139-
#endif
140139
#ifdef SHELL_ENABLE_METAL
141-
void InitializeMetalRendererConfig();
142140
FlutterMetalRendererConfig metal_renderer_config_ = {};
141+
#endif
142+
#ifdef SHELL_ENABLE_VULKAN
143+
FlutterVulkanRendererConfig vulkan_renderer_config_ = {};
143144
#endif
144145
std::string dart_entrypoint_;
145146
FlutterCustomTaskRunners custom_task_runners_ = {};
@@ -153,7 +154,6 @@ class EmbedderConfigBuilder {
153154
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderConfigBuilder);
154155
};
155156

156-
} // namespace testing
157-
} // namespace flutter
157+
} // namespace flutter::testing
158158

159159
#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_CONFIG_BUILDER_H_

0 commit comments

Comments
 (0)