From 9b8236f6f1a660432a8b89ee92a6c62cd2173118 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Mon, 18 Nov 2024 15:45:09 -0800 Subject: [PATCH] Move renderer config to EmbedderTestContext Moves all backend-specific renderer configuration out of EmbedderConfigBuilder and into the backend-specific subclass of EmbedderTestContext. EmbedderTestContext is already backend-specific and as of recent patches, also houses compositor configuration, making it the natural home of this code. As a result, we no longer need backend-specific methods such as SetSoftwareRendererConfig, SetMetalRendererConfig, etc. Nor do we need manual backend initialization in EmbedderConfigBuilder. Nor does that initialization any longer require relying on internal backend-specific code within EmbedderTestContext, since we now do that initialization in the EmbedderTestContext constructor. Since the bulk of the work previously done by this method now occurs in the EmbedderTestContext constructor, the only work remaining in these methods is surface creation. Further, since theses are now implemented in backend-specific EmbedderTestContext subclasses, they have all been renamed to a single method: SetSurface. Previously, all of these methods took a surface_size parameter with two exceptions: * SetVulkanRendererConfig also took an optional FlutterVulkanInstanceProcAddressCallback parameter. This has been extracted to a separate method SetVulkanInstanceProcAddressCallback on EmbedderTestContextVulkan. * SetSoftwareRendererConfig defaulted the parameter to a size of (1, 1). For consistency, this is no longer defaulted, and all call sites have been updated, consistent with other backends. Lastly, one nice benefit is that because the render config is initialized in the EmbedderTestContext constructor, there's no longer a requirement to call Set*RendererConfig prior modifying any specific properties on the config, nor is it problematic to call the updated SetSurface method after modifying the config. Where the renderer config was being customised in embedder unittests, I've pushed that customisation up to the top of the test where the rest of the test context is configured. Issue: https://github.com/flutter/flutter/issues/158998 --- shell/platform/embedder/BUILD.gn | 3 - .../embedder/tests/embedder_a11y_unittests.cc | 16 +- .../embedder/tests/embedder_config_builder.cc | 110 +-- .../embedder/tests/embedder_config_builder.h | 42 +- .../tests/embedder_config_builder_gl.cc | 81 -- .../tests/embedder_config_builder_metal.mm | 47 -- .../tests/embedder_config_builder_vulkan.cc | 73 -- .../embedder/tests/embedder_gl_unittests.cc | 749 +++++++++--------- .../tests/embedder_metal_unittests.mm | 21 +- .../embedder/tests/embedder_test_context.cc | 4 + .../embedder/tests/embedder_test_context.h | 9 +- .../tests/embedder_test_context_gl.cc | 82 +- .../embedder/tests/embedder_test_context_gl.h | 26 +- .../tests/embedder_test_context_metal.h | 12 +- .../tests/embedder_test_context_metal.mm | 56 +- .../tests/embedder_test_context_software.cc | 54 +- .../tests/embedder_test_context_software.h | 15 +- .../tests/embedder_test_context_vulkan.cc | 73 +- .../tests/embedder_test_context_vulkan.h | 16 +- .../embedder/tests/embedder_unittests.cc | 132 +-- .../embedder/tests/embedder_vk_unittests.cc | 11 +- 21 files changed, 705 insertions(+), 927 deletions(-) delete mode 100644 shell/platform/embedder/tests/embedder_config_builder_gl.cc delete mode 100644 shell/platform/embedder/tests/embedder_config_builder_metal.mm delete mode 100644 shell/platform/embedder/tests/embedder_config_builder_vulkan.cc diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index 78079e8da7b4c..5a430ce408fd3 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -315,7 +315,6 @@ if (enable_unittests) { if (test_enable_gl) { sources += [ - "tests/embedder_config_builder_gl.cc", "tests/embedder_test_backingstore_producer_gl.cc", "tests/embedder_test_backingstore_producer_gl.h", "tests/embedder_test_compositor_gl.cc", @@ -333,7 +332,6 @@ if (enable_unittests) { if (test_enable_metal) { sources += [ - "tests/embedder_config_builder_metal.mm", "tests/embedder_test_backingstore_producer_metal.h", "tests/embedder_test_backingstore_producer_metal.mm", "tests/embedder_test_compositor_metal.h", @@ -348,7 +346,6 @@ if (enable_unittests) { if (test_enable_vulkan) { sources += [ - "tests/embedder_config_builder_vulkan.cc", "tests/embedder_test_backingstore_producer_vulkan.cc", "tests/embedder_test_backingstore_producer_vulkan.h", "tests/embedder_test_compositor_vulkan.cc", diff --git a/shell/platform/embedder/tests/embedder_a11y_unittests.cc b/shell/platform/embedder/tests/embedder_a11y_unittests.cc index 01cfff7cac374..c3510ec52ffad 100644 --- a/shell/platform/embedder/tests/embedder_a11y_unittests.cc +++ b/shell/platform/embedder/tests/embedder_a11y_unittests.cc @@ -35,7 +35,7 @@ TEST_F(EmbedderTest, CannotProvideMultipleSemanticsCallbacks) { { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kSoftwareContext)); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.GetProjectArgs().update_semantics_callback = [](const FlutterSemanticsUpdate* update, void* user_data) {}; builder.GetProjectArgs().update_semantics_callback2 = @@ -48,7 +48,7 @@ TEST_F(EmbedderTest, CannotProvideMultipleSemanticsCallbacks) { { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kSoftwareContext)); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.GetProjectArgs().update_semantics_callback2 = [](const FlutterSemanticsUpdate2* update, void* user_data) {}; builder.GetProjectArgs().update_semantics_node_callback = @@ -63,7 +63,7 @@ TEST_F(EmbedderTest, CannotProvideMultipleSemanticsCallbacks) { { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kSoftwareContext)); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.GetProjectArgs().update_semantics_callback = [](const FlutterSemanticsUpdate* update, void* user_data) {}; builder.GetProjectArgs().update_semantics_node_callback = @@ -78,7 +78,7 @@ TEST_F(EmbedderTest, CannotProvideMultipleSemanticsCallbacks) { { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kSoftwareContext)); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.GetProjectArgs().update_semantics_callback2 = [](const FlutterSemanticsUpdate2* update, void* user_data) {}; builder.GetProjectArgs().update_semantics_callback = @@ -171,7 +171,7 @@ TEST_F(EmbedderA11yTest, A11yTreeIsConsistentUsingV3Callbacks) { }); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("a11y_main"); auto engine = builder.LaunchEngine(); @@ -375,7 +375,7 @@ TEST_F(EmbedderA11yTest, A11yStringAttributes) { }); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("a11y_string_attributes"); auto engine = builder.LaunchEngine(); @@ -468,7 +468,7 @@ TEST_F(EmbedderA11yTest, A11yTreeIsConsistentUsingV2Callbacks) { }); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("a11y_main"); auto engine = builder.LaunchEngine(); @@ -662,7 +662,7 @@ TEST_F(EmbedderA11yTest, A11yTreeIsConsistentUsingV1Callbacks) { }); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("a11y_main"); auto engine = builder.LaunchEngine(); diff --git a/shell/platform/embedder/tests/embedder_config_builder.cc b/shell/platform/embedder/tests/embedder_config_builder.cc index abba1302ffd6b..fa99c15e5a7e7 100644 --- a/shell/platform/embedder/tests/embedder_config_builder.cc +++ b/shell/platform/embedder/tests/embedder_config_builder.cc @@ -8,7 +8,6 @@ #include "flutter/runtime/dart_vm.h" #include "flutter/shell/platform/embedder/embedder.h" #include "tests/embedder_test_context.h" -#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkImage.h" namespace flutter::testing { @@ -27,28 +26,6 @@ EmbedderConfigBuilder::EmbedderConfigBuilder( custom_task_runners_.struct_size = sizeof(FlutterCustomTaskRunners); - InitializeGLRendererConfig(); - InitializeMetalRendererConfig(); - InitializeVulkanRendererConfig(); - - software_renderer_config_.struct_size = sizeof(FlutterSoftwareRendererConfig); - software_renderer_config_.surface_present_callback = - [](void* context, const void* allocation, size_t row_bytes, - size_t height) { - auto image_info = - SkImageInfo::MakeN32Premul(SkISize::Make(row_bytes / 4, height)); - SkBitmap bitmap; - if (!bitmap.installPixels(image_info, const_cast(allocation), - row_bytes)) { - FML_LOG(ERROR) << "Could not copy pixels for the software " - "composition from the engine."; - return false; - } - bitmap.setImmutable(); - return reinterpret_cast(context)->Present( - SkImages::RasterFromBitmap(bitmap)); - }; - // The first argument is always the executable name. Don't make tests have to // do this manually. AddCommandLineArgument("embedder_unittest"); @@ -79,30 +56,6 @@ FlutterProjectArgs& EmbedderConfigBuilder::GetProjectArgs() { return project_args_; } -void EmbedderConfigBuilder::SetSoftwareRendererConfig(SkISize surface_size) { - renderer_config_.type = FlutterRendererType::kSoftware; - renderer_config_.software = software_renderer_config_; - context_.SetupSurface(surface_size); -} - -void EmbedderConfigBuilder::SetRendererConfig(EmbedderTestContextType type, - SkISize surface_size) { - switch (type) { - case EmbedderTestContextType::kOpenGLContext: - SetOpenGLRendererConfig(surface_size); - break; - case EmbedderTestContextType::kMetalContext: - SetMetalRendererConfig(surface_size); - break; - case EmbedderTestContextType::kVulkanContext: - SetVulkanRendererConfig(surface_size); - break; - case EmbedderTestContextType::kSoftwareContext: - SetSoftwareRendererConfig(surface_size); - break; - } -} - void EmbedderConfigBuilder::SetAssetsPath() { project_args_.assets_path = context_.GetAssetsPath().c_str(); } @@ -217,10 +170,6 @@ void EmbedderConfigBuilder::SetupVsyncCallback() { }; } -FlutterRendererConfig& EmbedderConfigBuilder::GetRendererConfig() { - return renderer_config_; -} - void EmbedderConfigBuilder::SetRenderTaskRunner( const FlutterTaskRunnerDescription* runner) { if (runner == nullptr) { @@ -336,11 +285,12 @@ UniqueEngine EmbedderConfigBuilder::SetupEngine(bool run) const { project_args.dart_entrypoint_argc = 0; } - auto result = - run ? FlutterEngineRun(FLUTTER_ENGINE_VERSION, &renderer_config_, - &project_args, &context_, &engine) - : FlutterEngineInitialize(FLUTTER_ENGINE_VERSION, &renderer_config_, - &project_args, &context_, &engine); + auto result = run ? FlutterEngineRun(FLUTTER_ENGINE_VERSION, + &context_.GetRendererConfig(), + &project_args, &context_, &engine) + : FlutterEngineInitialize( + FLUTTER_ENGINE_VERSION, &context_.GetRendererConfig(), + &project_args, &context_, &engine); if (result != kSuccess) { return {}; @@ -349,52 +299,4 @@ UniqueEngine EmbedderConfigBuilder::SetupEngine(bool run) const { return UniqueEngine{engine}; } -#ifndef SHELL_ENABLE_GL -// OpenGL fallback implementations. -// See: flutter/shell/platform/embedder/tests/embedder_config_builder_gl.cc. - -void EmbedderConfigBuilder::InitializeGLRendererConfig() { - // no-op. -} - -void EmbedderConfigBuilder::SetOpenGLFBOCallBack() { - FML_LOG(FATAL) << "OpenGL is not enabled in this build."; -} - -void EmbedderConfigBuilder::SetOpenGLPresentCallBack() { - FML_LOG(FATAL) << "OpenGL is not enabled in this build."; -} - -void EmbedderConfigBuilder::SetOpenGLRendererConfig(SkISize surface_size) { - FML_LOG(FATAL) << "OpenGL is not enabled in this build."; -} -#endif -#ifndef SHELL_ENABLE_METAL -// Metal fallback implementations. -// See: flutter/shell/platform/embedder/tests/embedder_config_builder_metal.mm. - -void EmbedderConfigBuilder::InitializeMetalRendererConfig() { - // no-op. -} - -void EmbedderConfigBuilder::SetMetalRendererConfig(SkISize surface_size) { - FML_LOG(FATAL) << "Metal is not enabled in this build."; -} -#endif -#ifndef SHELL_ENABLE_VULKAN -// Vulkan fallback implementations. -// See: flutter/shell/platform/embedder/tests/embedder_config_builder_vulkan.cc. - -void EmbedderConfigBuilder::InitializeVulkanRendererConfig() { - // no-op. -} - -void EmbedderConfigBuilder::SetVulkanRendererConfig( - SkISize surface_size, - std::optional - instance_proc_address_callback) { - FML_LOG(FATAL) << "Vulkan is not enabled in this build."; -} -#endif - } // namespace flutter::testing diff --git a/shell/platform/embedder/tests/embedder_config_builder.h b/shell/platform/embedder/tests/embedder_config_builder.h index 3ed9a8940e767..8db7072b6762f 100644 --- a/shell/platform/embedder/tests/embedder_config_builder.h +++ b/shell/platform/embedder/tests/embedder_config_builder.h @@ -44,31 +44,6 @@ class EmbedderConfigBuilder { FlutterProjectArgs& GetProjectArgs(); - void SetRendererConfig(EmbedderTestContextType type, SkISize surface_size); - - void SetSoftwareRendererConfig(SkISize surface_size = SkISize::Make(1, 1)); - - void SetOpenGLRendererConfig(SkISize surface_size); - - void SetMetalRendererConfig(SkISize surface_size); - - void SetVulkanRendererConfig( - SkISize surface_size, - std::optional - instance_proc_address_callback = {}); - - // Used to explicitly set an `open_gl.fbo_callback`. Using this method will - // cause your test to fail since the ctor for this class sets - // `open_gl.fbo_callback_with_frame_info`. This method exists as a utility to - // explicitly test this behavior. - void SetOpenGLFBOCallBack(); - - // Used to explicitly set an `open_gl.present`. Using this method will cause - // your test to fail since the ctor for this class sets - // `open_gl.present_with_info`. This method exists as a utility to explicitly - // test this behavior. - void SetOpenGLPresentCallBack(); - void SetAssetsPath(); void SetSnapshots(); @@ -109,7 +84,7 @@ class EmbedderConfigBuilder { FlutterCompositor& GetCompositor(); - FlutterRendererConfig& GetRendererConfig(); + void SetSurface(SkISize surface_size) { context_.SetSurface(surface_size); } void SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType type, @@ -125,23 +100,8 @@ class EmbedderConfigBuilder { void SetupVsyncCallback(); private: - void InitializeGLRendererConfig(); - void InitializeVulkanRendererConfig(); - void InitializeMetalRendererConfig(); - EmbedderTestContext& context_; FlutterProjectArgs project_args_ = {}; - FlutterRendererConfig renderer_config_ = {}; - FlutterSoftwareRendererConfig software_renderer_config_ = {}; -#ifdef SHELL_ENABLE_GL - FlutterOpenGLRendererConfig opengl_renderer_config_ = {}; -#endif -#ifdef SHELL_ENABLE_METAL - FlutterMetalRendererConfig metal_renderer_config_ = {}; -#endif -#ifdef SHELL_ENABLE_VULKAN - FlutterVulkanRendererConfig vulkan_renderer_config_ = {}; -#endif std::string dart_entrypoint_; FlutterCustomTaskRunners custom_task_runners_ = {}; FlutterCompositor compositor_ = {}; diff --git a/shell/platform/embedder/tests/embedder_config_builder_gl.cc b/shell/platform/embedder/tests/embedder_config_builder_gl.cc deleted file mode 100644 index 2defa53fea62c..0000000000000 --- a/shell/platform/embedder/tests/embedder_config_builder_gl.cc +++ /dev/null @@ -1,81 +0,0 @@ -// 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_config_builder.h" - -#include "flutter/shell/platform/embedder/tests/embedder_test_compositor_gl.h" -#include "flutter/shell/platform/embedder/tests/embedder_test_context_gl.h" - -namespace flutter::testing { - -void EmbedderConfigBuilder::InitializeGLRendererConfig() { - opengl_renderer_config_.struct_size = sizeof(FlutterOpenGLRendererConfig); - opengl_renderer_config_.make_current = [](void* context) -> bool { - return reinterpret_cast(context)->GLMakeCurrent(); - }; - opengl_renderer_config_.clear_current = [](void* context) -> bool { - return reinterpret_cast(context)->GLClearCurrent(); - }; - opengl_renderer_config_.present_with_info = - [](void* context, const FlutterPresentInfo* present_info) -> bool { - return reinterpret_cast(context)->GLPresent( - *present_info); - }; - opengl_renderer_config_.fbo_with_frame_info_callback = - [](void* context, const FlutterFrameInfo* frame_info) -> uint32_t { - return reinterpret_cast(context)->GLGetFramebuffer( - *frame_info); - }; - opengl_renderer_config_.populate_existing_damage = nullptr; - opengl_renderer_config_.make_resource_current = [](void* context) -> bool { - return reinterpret_cast(context) - ->GLMakeResourceCurrent(); - }; - opengl_renderer_config_.gl_proc_resolver = [](void* context, - const char* name) -> void* { - return reinterpret_cast(context)->GLGetProcAddress( - name); - }; - opengl_renderer_config_.fbo_reset_after_present = true; - opengl_renderer_config_.surface_transformation = - [](void* context) -> FlutterTransformation { - return reinterpret_cast(context) - ->GetRootSurfaceTransformation(); - }; -} - -void EmbedderConfigBuilder::SetOpenGLFBOCallBack() { - // SetOpenGLRendererConfig must be called before this. - FML_CHECK(renderer_config_.type == FlutterRendererType::kOpenGL); - renderer_config_.open_gl.fbo_callback = [](void* context) -> uint32_t { - FlutterFrameInfo frame_info = {}; - // fbo_callback doesn't use the frame size information, only - // fbo_callback_with_frame_info does. - frame_info.struct_size = sizeof(FlutterFrameInfo); - frame_info.size.width = 0; - frame_info.size.height = 0; - return reinterpret_cast(context)->GLGetFramebuffer( - frame_info); - }; -} - -void EmbedderConfigBuilder::SetOpenGLPresentCallBack() { - // SetOpenGLRendererConfig must be called before this. - FML_CHECK(renderer_config_.type == FlutterRendererType::kOpenGL); - renderer_config_.open_gl.present = [](void* context) -> bool { - // passing a placeholder fbo_id. - return reinterpret_cast(context)->GLPresent( - FlutterPresentInfo{ - .fbo_id = 0, - }); - }; -} - -void EmbedderConfigBuilder::SetOpenGLRendererConfig(SkISize surface_size) { - renderer_config_.type = FlutterRendererType::kOpenGL; - renderer_config_.open_gl = opengl_renderer_config_; - context_.SetupSurface(surface_size); -} - -} // namespace flutter::testing diff --git a/shell/platform/embedder/tests/embedder_config_builder_metal.mm b/shell/platform/embedder/tests/embedder_config_builder_metal.mm deleted file mode 100644 index c76b311865781..0000000000000 --- a/shell/platform/embedder/tests/embedder_config_builder_metal.mm +++ /dev/null @@ -1,47 +0,0 @@ -// 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_config_builder.h" - -#include "flutter/shell/platform/embedder/tests/embedder_test_context_metal.h" - -namespace flutter::testing { - -void EmbedderConfigBuilder::InitializeMetalRendererConfig() { - if (context_.GetContextType() != EmbedderTestContextType::kMetalContext) { - return; - } - - metal_renderer_config_.struct_size = sizeof(metal_renderer_config_); - EmbedderTestContextMetal& metal_context = reinterpret_cast(context_); - - metal_renderer_config_.device = metal_context.GetTestMetalContext()->GetMetalDevice(); - metal_renderer_config_.present_command_queue = - metal_context.GetTestMetalContext()->GetMetalCommandQueue(); - metal_renderer_config_.get_next_drawable_callback = [](void* user_data, - const FlutterFrameInfo* frame_info) { - return reinterpret_cast(user_data)->GetNextDrawable(frame_info); - }; - metal_renderer_config_.present_drawable_callback = - [](void* user_data, const FlutterMetalTexture* texture) -> bool { - EmbedderTestContextMetal* metal_context = - reinterpret_cast(user_data); - return metal_context->Present(texture->texture_id); - }; - metal_renderer_config_.external_texture_frame_callback = - [](void* user_data, int64_t texture_id, size_t width, size_t height, - FlutterMetalExternalTexture* texture_out) -> bool { - EmbedderTestContextMetal* metal_context = - reinterpret_cast(user_data); - return metal_context->PopulateExternalTexture(texture_id, width, height, texture_out); - }; -} - -void EmbedderConfigBuilder::SetMetalRendererConfig(SkISize surface_size) { - renderer_config_.type = FlutterRendererType::kMetal; - renderer_config_.metal = metal_renderer_config_; - context_.SetupSurface(surface_size); -} - -} // namespace flutter::testing diff --git a/shell/platform/embedder/tests/embedder_config_builder_vulkan.cc b/shell/platform/embedder/tests/embedder_config_builder_vulkan.cc deleted file mode 100644 index 3f6558104cb77..0000000000000 --- a/shell/platform/embedder/tests/embedder_config_builder_vulkan.cc +++ /dev/null @@ -1,73 +0,0 @@ -// 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_config_builder.h" - -#include "flutter/shell/platform/embedder/tests/embedder_test_context_vulkan.h" -#include "flutter/vulkan/vulkan_device.h" // nogncheck -#include "vulkan/vulkan_core.h" // nogncheck - -namespace flutter::testing { - -void EmbedderConfigBuilder::InitializeVulkanRendererConfig() { - if (context_.GetContextType() != EmbedderTestContextType::kVulkanContext) { - return; - } - - vulkan_renderer_config_.struct_size = sizeof(FlutterVulkanRendererConfig); - vulkan_renderer_config_.version = - static_cast(context_) - .vulkan_context_->application_->GetAPIVersion(); - vulkan_renderer_config_.instance = - static_cast(context_) - .vulkan_context_->application_->GetInstance(); - vulkan_renderer_config_.physical_device = - static_cast(context_) - .vulkan_context_->device_->GetPhysicalDeviceHandle(); - vulkan_renderer_config_.device = - static_cast(context_) - .vulkan_context_->device_->GetHandle(); - vulkan_renderer_config_.queue_family_index = - static_cast(context_) - .vulkan_context_->device_->GetGraphicsQueueIndex(); - vulkan_renderer_config_.queue = - static_cast(context_) - .vulkan_context_->device_->GetQueueHandle(); - vulkan_renderer_config_.get_instance_proc_address_callback = - EmbedderTestContextVulkan::InstanceProcAddr; - vulkan_renderer_config_.get_next_image_callback = - [](void* context, - const FlutterFrameInfo* frame_info) -> FlutterVulkanImage { - VkImage image = - reinterpret_cast(context)->GetNextImage( - {static_cast(frame_info->size.width), - static_cast(frame_info->size.height)}); - return { - .struct_size = sizeof(FlutterVulkanImage), - .image = reinterpret_cast(image), - .format = VK_FORMAT_R8G8B8A8_UNORM, - }; - }; - vulkan_renderer_config_.present_image_callback = - [](void* context, const FlutterVulkanImage* image) -> bool { - return reinterpret_cast(context)->PresentImage( - reinterpret_cast(image->image)); - }; -} - -void EmbedderConfigBuilder::SetVulkanRendererConfig( - SkISize surface_size, - std::optional - instance_proc_address_callback) { - renderer_config_.type = FlutterRendererType::kVulkan; - FlutterVulkanRendererConfig vulkan_renderer_config = vulkan_renderer_config_; - if (instance_proc_address_callback.has_value()) { - vulkan_renderer_config.get_instance_proc_address_callback = - instance_proc_address_callback.value(); - } - renderer_config_.vulkan = vulkan_renderer_config; - context_.SetupSurface(surface_size); -} - -} // namespace flutter::testing diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index 086f36be9b215..f981c7465b9bf 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -41,8 +41,7 @@ // CREATE_NATIVE_ENTRY is leaky by design // NOLINTBEGIN(clang-analyzer-core.StackAddressEscape) -namespace flutter { -namespace testing { +namespace flutter::testing { using EmbedderTest = testing::EmbedderTest; @@ -54,7 +53,7 @@ TEST_F(EmbedderTest, CanGetVulkanEmbedderContext) { TEST_F(EmbedderTest, CanCreateOpenGLRenderingEngine) { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); - builder.SetOpenGLRendererConfig(SkISize::Make(1, 1)); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); } @@ -68,7 +67,7 @@ TEST_F(EmbedderTest, MustPreventEngineLaunchWhenRequiredCompositorArgsAreAbsent) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(1, 1)); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetCompositor(); builder.GetCompositor().create_backing_store_callback = nullptr; builder.GetCompositor().collect_backing_store_callback = nullptr; @@ -86,7 +85,7 @@ TEST_F(EmbedderTest, TEST_F(EmbedderTest, LaunchFailsWhenMultiplePresentCallbacks) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(1, 1)); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetCompositor(); builder.GetCompositor().present_layers_callback = [](const FlutterLayer** layers, size_t layers_count, void* user_data) { @@ -106,7 +105,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLFramebuffer) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views"); @@ -226,7 +225,7 @@ TEST_F(EmbedderTest, RasterCacheDisabledWithPlatformViews) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views_with_opacity"); @@ -359,7 +358,7 @@ TEST_F(EmbedderTest, RasterCacheEnabled) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_with_opacity"); @@ -445,7 +444,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLTexture) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views"); @@ -566,7 +565,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToSoftwareBuffer) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views"); @@ -687,7 +686,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownScene) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views_with_known_scene"); @@ -902,7 +901,7 @@ TEST_F(EmbedderTest, CustomCompositorMustWorkWithCustomTaskRunner) { EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views"); @@ -1069,7 +1068,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithRootLayerOnly) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint( "can_composite_platform_views_with_root_layer_only"); @@ -1151,7 +1150,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithPlatformLayerOnBottom) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint( "can_composite_platform_views_with_platform_layer_on_bottom"); @@ -1279,7 +1278,7 @@ TEST_F(EmbedderTest, auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 800)); + builder.SetSurface(SkISize::Make(600, 800)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views_with_known_scene"); @@ -1498,7 +1497,7 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositor) { EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("can_render_scene_without_custom_compositor"); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); auto rendered_scene = context.GetNextSceneImage(); @@ -1529,7 +1528,7 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositorWithTransformation) { EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("can_render_scene_without_custom_compositor"); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 800)); + builder.SetSurface(SkISize::Make(600, 800)); auto rendered_scene = context.GetNextSceneImage(); @@ -1556,9 +1555,8 @@ TEST_P(EmbedderTestMultiBackend, CanRenderGradientWithoutCompositor) { auto& context = GetEmbedderContext(backend); EmbedderConfigBuilder builder(context); - builder.SetDartEntrypoint("render_gradient"); - builder.SetRendererConfig(backend, SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); auto rendered_scene = context.GetNextSceneImage(); @@ -1591,7 +1589,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithoutCompositorWithXform) { const auto surface_size = SkISize::Make(600, 800); builder.SetDartEntrypoint("render_gradient"); - builder.SetOpenGLRendererConfig(surface_size); + builder.SetSurface(surface_size); auto rendered_scene = context.GetNextSceneImage(); @@ -1616,9 +1614,8 @@ TEST_P(EmbedderTestMultiBackend, CanRenderGradientWithCompositor) { auto& context = GetEmbedderContext(backend); EmbedderConfigBuilder builder(context); - builder.SetDartEntrypoint("render_gradient"); - builder.SetRendererConfig(backend, SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType(GetRenderTargetFromBackend(backend, true)); @@ -1654,7 +1651,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorWithXform) { EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("render_gradient"); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 800)); + builder.SetSurface(SkISize::Make(600, 800)); builder.SetCompositor(); builder.SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer); @@ -1683,9 +1680,8 @@ TEST_P(EmbedderTestMultiBackend, auto& context = GetEmbedderContext(backend); EmbedderConfigBuilder builder(context); - builder.SetDartEntrypoint("render_gradient_on_non_root_backing_store"); - builder.SetRendererConfig(backend, SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType(GetRenderTargetFromBackend(backend, true)); @@ -1825,7 +1821,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) { EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("render_gradient_on_non_root_backing_store"); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 800)); + builder.SetSurface(SkISize::Make(600, 800)); builder.SetCompositor(); builder.SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer); @@ -1974,7 +1970,7 @@ TEST_F(EmbedderTest, VerifyB141980393) { context.SetRootSurfaceTransformation(root_surface_transformation); // Configure the Flutter project args for the root surface transformation. - builder.SetOpenGLRendererConfig( + builder.SetSurface( SkISize::Make(root_surface_rect.width(), root_surface_rect.height())); // Use a compositor instead of rendering directly to the surface. @@ -2079,7 +2075,7 @@ TEST_F(EmbedderTest, CanCreateEmbedderWithCustomRenderTaskRunner) { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); builder.SetDartEntrypoint("can_render_scene_without_custom_compositor"); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetRenderTaskRunner( &render_task_runner.GetFlutterTaskRunnerDescription()); @@ -2138,7 +2134,7 @@ TEST_P(EmbedderTestMultiBackend, EmbedderTestContextType backend = GetParam(); EmbedderConfigBuilder builder(GetEmbedderContext(backend)); builder.SetDartEntrypoint("can_render_scene_without_custom_compositor"); - builder.SetRendererConfig(backend, SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetRenderTaskRunner( &common_task_runner.GetFlutterTaskRunnerDescription()); builder.SetPlatformTaskRunner( @@ -2194,7 +2190,7 @@ TEST_P(EmbedderTestMultiBackend, auto& context = GetEmbedderContext(backend); EmbedderConfigBuilder builder(context); - builder.SetRendererConfig(backend, SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_display_platform_view_with_pixel_ratio"); @@ -2312,7 +2308,7 @@ TEST_F( auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 800)); + builder.SetSurface(SkISize::Make(600, 800)); builder.SetCompositor(); builder.SetDartEntrypoint("can_display_platform_view_with_pixel_ratio"); @@ -2435,7 +2431,7 @@ TEST_F(EmbedderTest, auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 1024)); + builder.SetSurface(SkISize::Make(600, 1024)); builder.SetCompositor(); builder.SetDartEntrypoint("push_frames_over_and_over"); @@ -2479,7 +2475,7 @@ TEST_F(EmbedderTest, auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 1024)); + builder.SetSurface(SkISize::Make(600, 1024)); builder.SetDartEntrypoint("push_frames_over_and_over"); const auto root_surface_transformation = @@ -2519,7 +2515,7 @@ TEST_P(EmbedderTestMultiBackend, PlatformViewMutatorsAreValid) { auto& context = GetEmbedderContext(backend); EmbedderConfigBuilder builder(context); - builder.SetRendererConfig(backend, SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("platform_view_mutators"); @@ -2628,7 +2624,7 @@ TEST_F(EmbedderTest, PlatformViewMutatorsAreValidWithPixelRatio) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("platform_view_mutators_with_pixel_ratio"); @@ -2740,7 +2736,7 @@ TEST_F(EmbedderTest, auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("platform_view_mutators_with_pixel_ratio"); @@ -2857,7 +2853,7 @@ TEST_F(EmbedderTest, EmptySceneIsAcceptable) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("empty_scene"); fml::AutoResetWaitableEvent latch; @@ -2883,7 +2879,7 @@ TEST_F(EmbedderTest, SceneWithNoRootContainerIsAcceptable) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer); @@ -2913,7 +2909,7 @@ TEST_F(EmbedderTest, ArcEndCapsAreDrawnCorrectly) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 1024)); + builder.SetSurface(SkISize::Make(800, 1024)); builder.SetCompositor(); builder.SetDartEntrypoint("arc_end_caps_correct"); builder.SetRenderTargetType( @@ -2947,7 +2943,7 @@ TEST_F(EmbedderTest, ClipsAreCorrectlyCalculated) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(400, 300)); + builder.SetSurface(SkISize::Make(400, 300)); builder.SetCompositor(); builder.SetDartEntrypoint("scene_builder_with_clips"); builder.SetRenderTargetType( @@ -3027,7 +3023,7 @@ TEST_F(EmbedderTest, ComplexClipsAreCorrectlyCalculated) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(1024, 600)); + builder.SetSurface(SkISize::Make(1024, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("scene_builder_with_complex_clips"); builder.SetRenderTargetType( @@ -3111,7 +3107,7 @@ TEST_F(EmbedderTest, ComplexClipsAreCorrectlyCalculated) { TEST_F(EmbedderTest, ObjectsCanBePostedViaPorts) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 1024)); + builder.SetSurface(SkISize::Make(800, 1024)); builder.SetDartEntrypoint("objects_can_be_posted"); // Synchronously acquire the send port from the Dart end. We will be using @@ -3311,7 +3307,7 @@ TEST_F(EmbedderTest, CompositorCanPostZeroLayersForPresentation) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(300, 200)); + builder.SetSurface(SkISize::Make(300, 200)); builder.SetCompositor(); builder.SetDartEntrypoint("empty_scene_posts_zero_layers_to_compositor"); builder.SetRenderTargetType( @@ -3345,7 +3341,7 @@ TEST_F(EmbedderTest, CompositorCanPostOnlyPlatformViews) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(300, 200)); + builder.SetSurface(SkISize::Make(300, 200)); builder.SetCompositor(); builder.SetDartEntrypoint("compositor_can_post_only_platform_views"); builder.SetRenderTargetType( @@ -3409,7 +3405,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreRecycled) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(300, 200)); + builder.SetSurface(SkISize::Make(300, 200)); builder.SetCompositor(); builder.SetDartEntrypoint("render_targets_are_recycled"); builder.SetRenderTargetType( @@ -3455,7 +3451,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreInStableOrder) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(300, 200)); + builder.SetSurface(SkISize::Make(300, 200)); builder.SetCompositor(); builder.SetDartEntrypoint("render_targets_are_in_stable_order"); builder.SetRenderTargetType( @@ -3522,17 +3518,15 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreInStableOrder) { } TEST_F(EmbedderTest, FrameInfoContainsValidWidthAndHeight) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 1024)); - builder.SetDartEntrypoint("push_frames_over_and_over"); - + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); const auto root_surface_transformation = SkMatrix().preTranslate(0, 1024).preRotate(-90, 0, 0); - context.SetRootSurfaceTransformation(root_surface_transformation); + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(600, 1024)); + builder.SetDartEntrypoint("push_frames_over_and_over"); auto engine = builder.LaunchEngine(); // Send a window metrics events so frames may be scheduled. @@ -3552,111 +3546,113 @@ TEST_F(EmbedderTest, FrameInfoContainsValidWidthAndHeight) { /* Nothing to do. */ })); - static_cast(context).SetGLGetFBOCallback( - [](FlutterFrameInfo frame_info) { - // width and height are rotated by 90 deg - ASSERT_EQ(frame_info.size.width, event.height); - ASSERT_EQ(frame_info.size.height, event.width); + context.SetGLGetFBOCallback([](FlutterFrameInfo frame_info) { + // width and height are rotated by 90 deg + ASSERT_EQ(frame_info.size.width, event.height); + ASSERT_EQ(frame_info.size.height, event.width); - frame_latch.CountDown(); - }); + frame_latch.CountDown(); + }); frame_latch.Wait(); } TEST_F(EmbedderTest, MustNotRunWithBothFBOCallbacksSet) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.SetOpenGLFBOCallBack(); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 1024)); - builder.SetOpenGLFBOCallBack(); + builder.SetSurface(SkISize::Make(600, 1024)); auto engine = builder.LaunchEngine(); ASSERT_FALSE(engine.is_valid()); } TEST_F(EmbedderTest, MustNotRunWithBothPresentCallbacksSet) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.SetOpenGLPresentCallBack(); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 1024)); - builder.SetOpenGLPresentCallBack(); + builder.SetSurface(SkISize::Make(600, 1024)); auto engine = builder.LaunchEngine(); ASSERT_FALSE(engine.is_valid()); } TEST_F(EmbedderTest, MustStillRunWhenPopulateExistingDamageIsNotProvided) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = nullptr; EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(1, 1)); - builder.GetRendererConfig().open_gl.populate_existing_damage = nullptr; + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); } TEST_F(EmbedderTest, MustRunWhenPopulateExistingDamageIsProvided) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(1, 1)); - - builder.GetRendererConfig().open_gl.populate_existing_damage = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); } TEST_F(EmbedderTest, MustRunWithPopulateExistingDamageAndFBOCallback) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(1, 1)); - builder.GetRendererConfig().open_gl.fbo_callback = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.fbo_callback = [](void* context) -> uint32_t { return 0; }; - builder.GetRendererConfig().open_gl.fbo_with_frame_info_callback = nullptr; - builder.GetRendererConfig().open_gl.populate_existing_damage = + context.GetRendererConfig().open_gl.fbo_with_frame_info_callback = nullptr; + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); } TEST_F(EmbedderTest, MustNotRunWhenPopulateExistingDamageButNoOtherFBOCallback) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(1, 1)); - builder.GetRendererConfig().open_gl.fbo_callback = nullptr; - builder.GetRendererConfig().open_gl.fbo_with_frame_info_callback = nullptr; - builder.GetRendererConfig().open_gl.populate_existing_damage = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.fbo_callback = nullptr; + context.GetRendererConfig().open_gl.fbo_with_frame_info_callback = nullptr; + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_FALSE(engine.is_valid()); } TEST_F(EmbedderTest, PresentInfoContainsValidFBOId) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(600, 1024)); + builder.SetSurface(SkISize::Make(600, 1024)); builder.SetDartEntrypoint("push_frames_over_and_over"); const auto root_surface_transformation = @@ -3683,9 +3679,8 @@ TEST_F(EmbedderTest, PresentInfoContainsValidFBOId) { /* Nothing to do. */ })); - const uint32_t window_fbo_id = - static_cast(context).GetWindowFBOId(); - static_cast(context).SetGLPresentCallback( + const uint32_t window_fbo_id = context.GetWindowFBOId(); + context.SetGLPresentCallback( [window_fbo_id = window_fbo_id](FlutterPresentInfo present_info) { ASSERT_EQ(present_info.fbo_id, window_fbo_id); @@ -3697,53 +3692,50 @@ TEST_F(EmbedderTest, PresentInfoContainsValidFBOId) { TEST_F(EmbedderTest, PresentInfoReceivesFullDamageWhenExistingDamageIsWholeScreen) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); - builder.SetDartEntrypoint("render_gradient_retained"); - builder.GetRendererConfig().open_gl.populate_existing_damage = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; - // Return existing damage as the entire screen on purpose. - static_cast(context) - .SetGLPopulateExistingDamageCallback( - [](const intptr_t id, FlutterDamage* existing_damage_ptr) { - const size_t num_rects = 1; - // The array must be valid after the callback returns. - static FlutterRect existing_damage_rects[num_rects] = { - FlutterRect{0, 0, 800, 600}}; - existing_damage_ptr->num_rects = num_rects; - existing_damage_ptr->damage = existing_damage_rects; - }); + context.SetGLPopulateExistingDamageCallback( + [](const intptr_t id, FlutterDamage* existing_damage_ptr) { + const size_t num_rects = 1; + // The array must be valid after the callback returns. + static FlutterRect existing_damage_rects[num_rects] = { + FlutterRect{0, 0, 800, 600}}; + existing_damage_ptr->num_rects = num_rects; + existing_damage_ptr->damage = existing_damage_rects; + }); + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(800, 600)); + builder.SetDartEntrypoint("render_gradient_retained"); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); fml::AutoResetWaitableEvent latch; // First frame should be entirely rerendered. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 800); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 0); - ASSERT_EQ(present_info.buffer_damage.damage->top, 0); - ASSERT_EQ(present_info.buffer_damage.damage->right, 800); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 800); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 0); + ASSERT_EQ(present_info.buffer_damage.damage->top, 0); + ASSERT_EQ(present_info.buffer_damage.damage->right, 800); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); + + latch.Signal(); + }); // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; @@ -3758,23 +3750,22 @@ TEST_F(EmbedderTest, // Because it's the same as the first frame, the second frame damage should // be empty but, because there was a full existing buffer damage, the buffer // damage should be the entire screen. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 0); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 0); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 0); - ASSERT_EQ(present_info.buffer_damage.damage->top, 0); - ASSERT_EQ(present_info.buffer_damage.damage->right, 800); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 0); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 0); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 0); + ASSERT_EQ(present_info.buffer_damage.damage->top, 0); + ASSERT_EQ(present_info.buffer_damage.damage->right, 800); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); + + latch.Signal(); + }); ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3782,53 +3773,50 @@ TEST_F(EmbedderTest, } TEST_F(EmbedderTest, PresentInfoReceivesEmptyDamage) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); - builder.SetDartEntrypoint("render_gradient_retained"); - builder.GetRendererConfig().open_gl.populate_existing_damage = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; - // Return no existing damage on purpose. - static_cast(context) - .SetGLPopulateExistingDamageCallback( - [](const intptr_t id, FlutterDamage* existing_damage_ptr) { - const size_t num_rects = 1; - // The array must be valid after the callback returns. - static FlutterRect existing_damage_rects[num_rects] = { - FlutterRect{0, 0, 0, 0}}; - existing_damage_ptr->num_rects = num_rects; - existing_damage_ptr->damage = existing_damage_rects; - }); + context.SetGLPopulateExistingDamageCallback( + [](const intptr_t id, FlutterDamage* existing_damage_ptr) { + const size_t num_rects = 1; + // The array must be valid after the callback returns. + static FlutterRect existing_damage_rects[num_rects] = { + FlutterRect{0, 0, 0, 0}}; + existing_damage_ptr->num_rects = num_rects; + existing_damage_ptr->damage = existing_damage_rects; + }); + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(800, 600)); + builder.SetDartEntrypoint("render_gradient_retained"); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); fml::AutoResetWaitableEvent latch; // First frame should be entirely rerendered. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 800); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 0); - ASSERT_EQ(present_info.buffer_damage.damage->top, 0); - ASSERT_EQ(present_info.buffer_damage.damage->right, 800); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 800); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 0); + ASSERT_EQ(present_info.buffer_damage.damage->top, 0); + ASSERT_EQ(present_info.buffer_damage.damage->right, 800); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); + + latch.Signal(); + }); // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; @@ -3842,23 +3830,22 @@ TEST_F(EmbedderTest, PresentInfoReceivesEmptyDamage) { // Because it's the same as the first frame, the second frame should not be // rerendered assuming there is no existing damage. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 0); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 0); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 0); - ASSERT_EQ(present_info.buffer_damage.damage->top, 0); - ASSERT_EQ(present_info.buffer_damage.damage->right, 0); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 0); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 0); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 0); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 0); + ASSERT_EQ(present_info.buffer_damage.damage->top, 0); + ASSERT_EQ(present_info.buffer_damage.damage->right, 0); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 0); + + latch.Signal(); + }); ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3866,53 +3853,50 @@ TEST_F(EmbedderTest, PresentInfoReceivesEmptyDamage) { } TEST_F(EmbedderTest, PresentInfoReceivesPartialDamage) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); - builder.SetDartEntrypoint("render_gradient_retained"); - builder.GetRendererConfig().open_gl.populate_existing_damage = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; - // Return existing damage as only part of the screen on purpose. - static_cast(context) - .SetGLPopulateExistingDamageCallback( - [&](const intptr_t id, FlutterDamage* existing_damage_ptr) { - const size_t num_rects = 1; - // The array must be valid after the callback returns. - static FlutterRect existing_damage_rects[num_rects] = { - FlutterRect{200, 150, 400, 300}}; - existing_damage_ptr->num_rects = num_rects; - existing_damage_ptr->damage = existing_damage_rects; - }); + context.SetGLPopulateExistingDamageCallback( + [&](const intptr_t id, FlutterDamage* existing_damage_ptr) { + const size_t num_rects = 1; + // The array must be valid after the callback returns. + static FlutterRect existing_damage_rects[num_rects] = { + FlutterRect{200, 150, 400, 300}}; + existing_damage_ptr->num_rects = num_rects; + existing_damage_ptr->damage = existing_damage_rects; + }); + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(800, 600)); + builder.SetDartEntrypoint("render_gradient_retained"); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); fml::AutoResetWaitableEvent latch; // First frame should be entirely rerendered. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 800); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 0); - ASSERT_EQ(present_info.buffer_damage.damage->top, 0); - ASSERT_EQ(present_info.buffer_damage.damage->right, 800); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 800); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 0); + ASSERT_EQ(present_info.buffer_damage.damage->top, 0); + ASSERT_EQ(present_info.buffer_damage.damage->right, 800); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); + + latch.Signal(); + }); // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; @@ -3927,23 +3911,22 @@ TEST_F(EmbedderTest, PresentInfoReceivesPartialDamage) { // Because it's the same as the first frame, the second frame damage should be // empty but, because there was a partial existing damage, the buffer damage // should represent that partial damage area. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 0); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 0); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 200); - ASSERT_EQ(present_info.buffer_damage.damage->top, 150); - ASSERT_EQ(present_info.buffer_damage.damage->right, 400); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 300); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 0); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 0); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 200); + ASSERT_EQ(present_info.buffer_damage.damage->top, 150); + ASSERT_EQ(present_info.buffer_damage.damage->right, 400); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 300); + + latch.Signal(); + }); ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3951,31 +3934,29 @@ TEST_F(EmbedderTest, PresentInfoReceivesPartialDamage) { } TEST_F(EmbedderTest, PopulateExistingDamageReceivesValidID) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); - builder.SetDartEntrypoint("render_gradient_retained"); - builder.GetRendererConfig().open_gl.populate_existing_damage = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(800, 600)); + builder.SetDartEntrypoint("render_gradient_retained"); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); - const uint32_t window_fbo_id = - static_cast(context).GetWindowFBOId(); - static_cast(context) - .SetGLPopulateExistingDamageCallback( - [window_fbo_id = window_fbo_id](intptr_t id, - FlutterDamage* existing_damage) { - ASSERT_EQ(id, window_fbo_id); - existing_damage->num_rects = 0; - existing_damage->damage = nullptr; - }); + const uint32_t window_fbo_id = context.GetWindowFBOId(); + context.SetGLPopulateExistingDamageCallback( + [window_fbo_id = window_fbo_id](intptr_t id, + FlutterDamage* existing_damage) { + ASSERT_EQ(id, window_fbo_id); + existing_damage->num_rects = 0; + existing_damage->damage = nullptr; + }); // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; @@ -3988,24 +3969,23 @@ TEST_F(EmbedderTest, PopulateExistingDamageReceivesValidID) { } TEST_F(EmbedderTest, PopulateExistingDamageReceivesInvalidID) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); - builder.SetDartEntrypoint("render_gradient_retained"); - builder.GetRendererConfig().open_gl.populate_existing_damage = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; - // Return a bad FBO ID on purpose. - builder.GetRendererConfig().open_gl.fbo_with_frame_info_callback = + context.GetRendererConfig().open_gl.fbo_with_frame_info_callback = [](void* context, const FlutterFrameInfo* frame_info) -> uint32_t { return 123; }; + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(800, 600)); + builder.SetDartEntrypoint("render_gradient_retained"); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -4014,16 +3994,14 @@ TEST_F(EmbedderTest, PopulateExistingDamageReceivesInvalidID) { /* Nothing to do. */ })); - const uint32_t window_fbo_id = - static_cast(context).GetWindowFBOId(); - static_cast(context) - .SetGLPopulateExistingDamageCallback( - [window_fbo_id = window_fbo_id](intptr_t id, - FlutterDamage* existing_damage) { - ASSERT_NE(id, window_fbo_id); - existing_damage->num_rects = 0; - existing_damage->damage = nullptr; - }); + const uint32_t window_fbo_id = context.GetWindowFBOId(); + context.SetGLPopulateExistingDamageCallback( + [window_fbo_id = window_fbo_id](intptr_t id, + FlutterDamage* existing_damage) { + ASSERT_NE(id, window_fbo_id); + existing_damage->num_rects = 0; + existing_damage->damage = nullptr; + }); // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; @@ -4039,7 +4017,7 @@ TEST_F(EmbedderTest, SetSingleDisplayConfigurationWithDisplayId) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("empty_scene"); fml::AutoResetWaitableEvent latch; @@ -4081,7 +4059,7 @@ TEST_F(EmbedderTest, SetSingleDisplayConfigurationWithoutDisplayId) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("empty_scene"); fml::AutoResetWaitableEvent latch; @@ -4123,7 +4101,7 @@ TEST_F(EmbedderTest, SetValidMultiDisplayConfiguration) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("empty_scene"); fml::AutoResetWaitableEvent latch; @@ -4172,7 +4150,7 @@ TEST_F(EmbedderTest, MultipleDisplaysWithSingleDisplayTrueIsInvalid) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("empty_scene"); fml::AutoResetWaitableEvent latch; @@ -4218,7 +4196,7 @@ TEST_F(EmbedderTest, MultipleDisplaysWithSameDisplayIdIsInvalid) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("empty_scene"); fml::AutoResetWaitableEvent latch; @@ -4264,7 +4242,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsNotRecycledWhenAvoidsCacheSet) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(300, 200)); + builder.SetSurface(SkISize::Make(300, 200)); builder.SetCompositor(/*avoid_backing_store_cache=*/true); builder.SetDartEntrypoint("render_targets_are_recycled"); builder.SetRenderTargetType( @@ -4312,7 +4290,7 @@ TEST_F(EmbedderTest, SnapshotRenderTargetScalesDownToDriverMax) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); auto max_size = context.GetCompositor().GetGrContext()->maxRenderTargetSize(); @@ -4354,7 +4332,7 @@ TEST_F(EmbedderTest, SnapshotRenderTargetScalesDownToDriverMax) { TEST_F(EmbedderTest, ObjectsPostedViaPortsServicedOnSecondaryTaskHeap) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 1024)); + builder.SetSurface(SkISize::Make(800, 1024)); builder.SetDartEntrypoint("objects_can_be_posted"); // Synchronously acquire the send port from the Dart end. We will be using @@ -4404,7 +4382,7 @@ TEST_F(EmbedderTest, ObjectsPostedViaPortsServicedOnSecondaryTaskHeap) { TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLTexture) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLTexture); @@ -4467,7 +4445,7 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLTexture) { TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLFramebuffer) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer); @@ -4530,7 +4508,7 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLFramebuffer) { TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLSurface) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLSurface); @@ -4650,36 +4628,35 @@ TEST_F(EmbedderTest, ExternalTextureGLRefreshedTooOften) { TEST_F( EmbedderTest, PresentInfoReceivesFullScreenDamageWhenPopulateExistingDamageIsNotProvided) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = nullptr; EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetDartEntrypoint("render_gradient_retained"); - builder.GetRendererConfig().open_gl.populate_existing_damage = nullptr; - auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); fml::AutoResetWaitableEvent latch; // First frame should be entirely rerendered. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 800); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 0); - ASSERT_EQ(present_info.buffer_damage.damage->top, 0); - ASSERT_EQ(present_info.buffer_damage.damage->right, 800); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 800); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 0); + ASSERT_EQ(present_info.buffer_damage.damage->top, 0); + ASSERT_EQ(present_info.buffer_damage.damage->right, 800); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); + + latch.Signal(); + }); // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; @@ -4694,23 +4671,22 @@ TEST_F( // Since populate_existing_damage is not provided, the partial repaint // functionality is actually disabled. So, the next frame should be entirely // new frame. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 800); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 0); - ASSERT_EQ(present_info.buffer_damage.damage->top, 0); - ASSERT_EQ(present_info.buffer_damage.damage->right, 800); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 800); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 0); + ASSERT_EQ(present_info.buffer_damage.damage->top, 0); + ASSERT_EQ(present_info.buffer_damage.damage->right, 800); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); + + latch.Signal(); + }); ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4719,55 +4695,52 @@ TEST_F( TEST_F(EmbedderTest, PresentInfoReceivesJoinedDamageWhenExistingDamageContainsMultipleRects) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); - - EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); - builder.SetDartEntrypoint("render_gradient_retained"); - builder.GetRendererConfig().open_gl.populate_existing_damage = + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kOpenGLContext)); + context.GetRendererConfig().open_gl.populate_existing_damage = [](void* context, const intptr_t id, FlutterDamage* existing_damage) -> void { return reinterpret_cast(context) ->GLPopulateExistingDamage(id, existing_damage); }; - // Return existing damage as the entire screen on purpose. - static_cast(context) - .SetGLPopulateExistingDamageCallback( - [](const intptr_t id, FlutterDamage* existing_damage_ptr) { - const size_t num_rects = 2; - // The array must be valid after the callback returns. - static FlutterRect existing_damage_rects[num_rects] = { - FlutterRect{100, 150, 200, 250}, - FlutterRect{200, 250, 300, 350}, - }; - existing_damage_ptr->num_rects = num_rects; - existing_damage_ptr->damage = existing_damage_rects; - }); + context.SetGLPopulateExistingDamageCallback( + [](const intptr_t id, FlutterDamage* existing_damage_ptr) { + const size_t num_rects = 2; + // The array must be valid after the callback returns. + static FlutterRect existing_damage_rects[num_rects] = { + FlutterRect{100, 150, 200, 250}, + FlutterRect{200, 250, 300, 350}, + }; + existing_damage_ptr->num_rects = num_rects; + existing_damage_ptr->damage = existing_damage_rects; + }); + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(800, 600)); + builder.SetDartEntrypoint("render_gradient_retained"); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); fml::AutoResetWaitableEvent latch; // First frame should be entirely rerendered. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 800); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 0); - ASSERT_EQ(present_info.buffer_damage.damage->top, 0); - ASSERT_EQ(present_info.buffer_damage.damage->right, 800); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 800); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 600); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 0); + ASSERT_EQ(present_info.buffer_damage.damage->top, 0); + ASSERT_EQ(present_info.buffer_damage.damage->right, 800); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 600); + + latch.Signal(); + }); // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; @@ -4782,23 +4755,22 @@ TEST_F(EmbedderTest, // Because it's the same as the first frame, the second frame damage should // be empty but, because there was a full existing buffer damage, the buffer // damage should be the entire screen. - static_cast(context).SetGLPresentCallback( - [&](FlutterPresentInfo present_info) { - const size_t num_rects = 1; - ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); - ASSERT_EQ(present_info.frame_damage.damage->left, 0); - ASSERT_EQ(present_info.frame_damage.damage->top, 0); - ASSERT_EQ(present_info.frame_damage.damage->right, 0); - ASSERT_EQ(present_info.frame_damage.damage->bottom, 0); - - ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); - ASSERT_EQ(present_info.buffer_damage.damage->left, 100); - ASSERT_EQ(present_info.buffer_damage.damage->top, 150); - ASSERT_EQ(present_info.buffer_damage.damage->right, 300); - ASSERT_EQ(present_info.buffer_damage.damage->bottom, 350); - - latch.Signal(); - }); + context.SetGLPresentCallback([&](FlutterPresentInfo present_info) { + const size_t num_rects = 1; + ASSERT_EQ(present_info.frame_damage.num_rects, num_rects); + ASSERT_EQ(present_info.frame_damage.damage->left, 0); + ASSERT_EQ(present_info.frame_damage.damage->top, 0); + ASSERT_EQ(present_info.frame_damage.damage->right, 0); + ASSERT_EQ(present_info.frame_damage.damage->bottom, 0); + + ASSERT_EQ(present_info.buffer_damage.num_rects, num_rects); + ASSERT_EQ(present_info.buffer_damage.damage->left, 100); + ASSERT_EQ(present_info.buffer_damage.damage->top, 150); + ASSERT_EQ(present_info.buffer_damage.damage->right, 300); + ASSERT_EQ(present_info.buffer_damage.damage->bottom, 350); + + latch.Signal(); + }); ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4811,14 +4783,14 @@ TEST_F(EmbedderTest, CanRenderWithImpellerOpenGL) { EmbedderConfigBuilder builder(context); bool present_called = false; - static_cast(context).SetGLPresentCallback( + context.SetGLPresentCallback( [&present_called](FlutterPresentInfo present_info) { present_called = true; }); builder.AddCommandLineArgument("--enable-impeller"); builder.SetDartEntrypoint("render_impeller_test"); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer); @@ -4869,7 +4841,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLSurface) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views"); @@ -4985,7 +4957,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownSceneToOpenGLSurfaces) { auto& context = GetEmbedderContext(EmbedderTestContextType::kOpenGLContext); EmbedderConfigBuilder builder(context); - builder.SetOpenGLRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views_with_known_scene"); @@ -5197,7 +5169,6 @@ INSTANTIATE_TEST_SUITE_P( ::testing::Values(EmbedderTestContextType::kOpenGLContext, EmbedderTestContextType::kVulkanContext)); -} // namespace testing -} // namespace flutter +} // namespace flutter::testing // NOLINTEND(clang-analyzer-core.StackAddressEscape) diff --git a/shell/platform/embedder/tests/embedder_metal_unittests.mm b/shell/platform/embedder/tests/embedder_metal_unittests.mm index d59c92bf62c24..a1a2088a634cc 100644 --- a/shell/platform/embedder/tests/embedder_metal_unittests.mm +++ b/shell/platform/embedder/tests/embedder_metal_unittests.mm @@ -39,9 +39,8 @@ auto& context = GetEmbedderContext(EmbedderTestContextType::kMetalContext); EmbedderConfigBuilder builder(context); - builder.SetDartEntrypoint("render_gradient"); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); auto rendered_scene = context.GetNextSceneImage(); @@ -108,7 +107,7 @@ EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("render_texture"); - builder.SetMetalRendererConfig(texture_size); + builder.SetSurface(texture_size); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -132,7 +131,7 @@ auto& context = GetEmbedderContext(EmbedderTestContextType::kMetalContext); EmbedderConfigBuilder builder(context); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views"); @@ -245,7 +244,7 @@ EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("can_render_scene_without_custom_compositor"); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); auto rendered_scene = context.GetNextSceneImage(); @@ -267,7 +266,7 @@ EmbedderTestContextMetal& context = reinterpret_cast( GetEmbedderContext(EmbedderTestContextType::kMetalContext)); EmbedderConfigBuilder builder(context); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetDartEntrypoint("texture_destruction_callback_called_without_custom_compositor"); struct CollectContext { @@ -317,7 +316,7 @@ auto& context = GetEmbedderContext(EmbedderTestContextType::kMetalContext); EmbedderConfigBuilder builder(context); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views_with_known_scene"); @@ -513,7 +512,7 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreMetalTexture) { auto& context = GetEmbedderContext(EmbedderTestContextType::kMetalContext); EmbedderConfigBuilder builder(context); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType(EmbedderTestBackingStoreProducer::RenderTargetType::kMetalTexture); builder.SetDartEntrypoint("invalid_backingstore"); @@ -621,7 +620,7 @@ void Collect() { builder.AddCommandLineArgument("--enable-impeller"); builder.SetDartEntrypoint("render_impeller_test"); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); auto rendered_scene = context.GetNextSceneImage(); @@ -646,7 +645,7 @@ void Collect() { builder.AddCommandLineArgument("--enable-impeller"); builder.SetDartEntrypoint("render_impeller_text_test"); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); auto rendered_scene = context.GetNextSceneImage(); @@ -671,7 +670,7 @@ void Collect() { builder.AddCommandLineArgument("--enable-impeller"); builder.SetDartEntrypoint("render_impeller_text_test"); - builder.SetMetalRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetRenderTargetType(EmbedderTestBackingStoreProducer::RenderTargetType::kMetalTexture); diff --git a/shell/platform/embedder/tests/embedder_test_context.cc b/shell/platform/embedder/tests/embedder_test_context.cc index 0f5e3dcf9afe5..0b6959cb022e7 100644 --- a/shell/platform/embedder/tests/embedder_test_context.cc +++ b/shell/platform/embedder/tests/embedder_test_context.cc @@ -96,6 +96,10 @@ void EmbedderTestContext::SetRootSurfaceTransformation(SkMatrix matrix) { root_surface_transformation_ = matrix; } +FlutterRendererConfig& EmbedderTestContext::GetRendererConfig() { + return renderer_config_; +} + void EmbedderTestContext::AddIsolateCreateCallback( const fml::closure& closure) { if (closure) { diff --git a/shell/platform/embedder/tests/embedder_test_context.h b/shell/platform/embedder/tests/embedder_test_context.h index 11d2eb6a322ad..903c47d02a0e7 100644 --- a/shell/platform/embedder/tests/embedder_test_context.h +++ b/shell/platform/embedder/tests/embedder_test_context.h @@ -72,9 +72,7 @@ class EmbedderTestContext { void SetRootSurfaceTransformation(SkMatrix matrix); - void SetRenderTargetType( - EmbedderTestBackingStoreProducer::RenderTargetType type, - FlutterSoftwarePixelFormat software_pixfmt); + FlutterRendererConfig& GetRendererConfig(); void AddIsolateCreateCallback(const fml::closure& closure); @@ -129,6 +127,7 @@ class EmbedderTestContext { UniqueAOTData aot_data_; std::vector isolate_create_callbacks_; std::shared_ptr native_resolver_; + FlutterRendererConfig renderer_config_ = {}; SemanticsUpdateCallback2 update_semantics_callback2_; SemanticsUpdateCallback update_semantics_callback_; SemanticsNodeCallback update_semantics_node_callback_; @@ -163,6 +162,8 @@ class EmbedderTestContext { void SetupAOTDataIfNecessary(); + virtual void SetSurface(SkISize surface_size) = 0; + virtual void SetupCompositor() = 0; void FireIsolateCreateCallbacks(); @@ -178,8 +179,6 @@ class EmbedderTestContext { void SetNextSceneCallback(const NextSceneCallback& next_scene_callback); - virtual void SetupSurface(SkISize surface_size) = 0; - FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTestContext); }; diff --git a/shell/platform/embedder/tests/embedder_test_context_gl.cc b/shell/platform/embedder/tests/embedder_test_context_gl.cc index 2ee44156b9260..055c2f2ace802 100644 --- a/shell/platform/embedder/tests/embedder_test_context_gl.cc +++ b/shell/platform/embedder/tests/embedder_test_context_gl.cc @@ -4,6 +4,7 @@ #include "flutter/shell/platform/embedder/tests/embedder_test_context_gl.h" +#include #include #include "flutter/fml/make_copyable.h" @@ -11,26 +12,85 @@ #include "flutter/runtime/dart_vm.h" #include "flutter/shell/platform/embedder/tests/embedder_assertions.h" #include "flutter/shell/platform/embedder/tests/embedder_test_compositor_gl.h" -#include "flutter/testing/test_gl_surface.h" #include "flutter/testing/testing.h" #include "tests/embedder_test.h" #include "third_party/dart/runtime/bin/elf_loader.h" #include "third_party/skia/include/core/SkSurface.h" -namespace flutter { -namespace testing { +namespace flutter::testing { EmbedderTestContextGL::EmbedderTestContextGL(std::string assets_path) : EmbedderTestContext(std::move(assets_path)), - egl_context_(std::make_shared()) {} + egl_context_(std::make_shared()) { + renderer_config_.type = FlutterRendererType::kOpenGL; + renderer_config_.open_gl = { + .struct_size = sizeof(FlutterOpenGLRendererConfig), + .make_current = [](void* context) -> bool { + return reinterpret_cast(context) + ->GLMakeCurrent(); + }, + .clear_current = [](void* context) -> bool { + return reinterpret_cast(context) + ->GLClearCurrent(); + }, + .make_resource_current = [](void* context) -> bool { + return reinterpret_cast(context) + ->GLMakeResourceCurrent(); + }, + .fbo_reset_after_present = true, + .surface_transformation = [](void* context) -> FlutterTransformation { + return reinterpret_cast(context) + ->GetRootSurfaceTransformation(); + }, + .gl_proc_resolver = [](void* context, const char* name) -> void* { + return reinterpret_cast(context) + ->GLGetProcAddress(name); + }, + .fbo_with_frame_info_callback = + [](void* context, const FlutterFrameInfo* frame_info) -> uint32_t { + return reinterpret_cast(context) + ->GLGetFramebuffer(*frame_info); + }, + .present_with_info = [](void* context, + const FlutterPresentInfo* present_info) -> bool { + return reinterpret_cast(context)->GLPresent( + *present_info); + }, + .populate_existing_damage = nullptr, + }; +} EmbedderTestContextGL::~EmbedderTestContextGL() { SetGLGetFBOCallback(nullptr); } -void EmbedderTestContextGL::SetupSurface(SkISize surface_size) { - FML_CHECK(!gl_surface_); - gl_surface_ = std::make_unique(egl_context_, surface_size); +void EmbedderTestContextGL::SetOpenGLFBOCallBack() { + // SetOpenGLRendererConfig must be called before this. + FML_CHECK(renderer_config_.type == FlutterRendererType::kOpenGL); + + renderer_config_.open_gl.fbo_callback = [](void* context) -> uint32_t { + FlutterFrameInfo frame_info = {}; + // fbo_callback doesn't use the frame size information, only + // fbo_callback_with_frame_info does. + frame_info.struct_size = sizeof(FlutterFrameInfo); + frame_info.size.width = 0; + frame_info.size.height = 0; + return reinterpret_cast(context)->GLGetFramebuffer( + frame_info); + }; +} + +void EmbedderTestContextGL::SetOpenGLPresentCallBack() { + // SetOpenGLRendererConfig must be called before this. + FML_CHECK(renderer_config_.type == FlutterRendererType::kOpenGL); + + renderer_config_.open_gl.present = [](void* context) -> bool { + // passing a placeholder fbo_id. + return reinterpret_cast(context)->GLPresent( + FlutterPresentInfo{ + .fbo_id = 0, + }); + }; } bool EmbedderTestContextGL::GLMakeCurrent() { @@ -136,6 +196,11 @@ uint32_t EmbedderTestContextGL::GetWindowFBOId() const { return gl_surface_->GetWindowFBOId(); } +void EmbedderTestContextGL::SetSurface(SkISize surface_size) { + FML_CHECK(!gl_surface_); + gl_surface_ = std::make_unique(egl_context_, surface_size); +} + void EmbedderTestContextGL::SetupCompositor() { FML_CHECK(!compositor_) << "Already set up a compositor in this context."; FML_CHECK(gl_surface_) @@ -145,5 +210,4 @@ void EmbedderTestContextGL::SetupCompositor() { GLClearCurrent(); } -} // namespace testing -} // namespace flutter +} // namespace flutter::testing diff --git a/shell/platform/embedder/tests/embedder_test_context_gl.h b/shell/platform/embedder/tests/embedder_test_context_gl.h index a16cbca55d1ea..9335d1c66a777 100644 --- a/shell/platform/embedder/tests/embedder_test_context_gl.h +++ b/shell/platform/embedder/tests/embedder_test_context_gl.h @@ -29,6 +29,18 @@ class EmbedderTestContextGL : public EmbedderTestContext { // |EmbedderTestContext| EmbedderTestContextType GetContextType() const override; + // Used to explicitly set an `open_gl.fbo_callback`. Using this method will + // cause your test to fail since the ctor for this class sets + // `open_gl.fbo_callback_with_frame_info`. This method exists as a utility to + // explicitly test this behavior. + void SetOpenGLFBOCallBack(); + + // Used to explicitly set an `open_gl.present`. Using this method will cause + // your test to fail since the ctor for this class sets + // `open_gl.present_with_info`. This method exists as a utility to explicitly + // test this behavior. + void SetOpenGLPresentCallBack(); + //---------------------------------------------------------------------------- /// @brief Sets a callback that will be invoked (on the raster task /// runner) when the engine asks the embedder for a new FBO ID at @@ -65,14 +77,12 @@ class EmbedderTestContextGL : public EmbedderTestContext { void* GLGetProcAddress(const char* name); - protected: - virtual void SetupCompositor() override; - - void SetupCompositorUsingGLSurfaces(); - private: - // This allows the builder to access the hooks. - friend class EmbedderConfigBuilder; + // |EmbedderTestContext| + void SetSurface(SkISize surface_size) override; + + // |EmbedderTestContext| + void SetupCompositor() override; std::shared_ptr egl_context_; std::unique_ptr gl_surface_; @@ -82,8 +92,6 @@ class EmbedderTestContextGL : public EmbedderTestContext { GLPresentCallback gl_present_callback_; GLPopulateExistingDamageCallback gl_populate_existing_damage_callback_; - void SetupSurface(SkISize surface_size) override; - bool GLMakeCurrent(); bool GLClearCurrent(); diff --git a/shell/platform/embedder/tests/embedder_test_context_metal.h b/shell/platform/embedder/tests/embedder_test_context_metal.h index eea599fe0c07c..b063db6973be2 100644 --- a/shell/platform/embedder/tests/embedder_test_context_metal.h +++ b/shell/platform/embedder/tests/embedder_test_context_metal.h @@ -35,9 +35,6 @@ class EmbedderTestContextMetal : public EmbedderTestContext { // |EmbedderTestContext| size_t GetSurfacePresentCount() const override; - // |EmbedderTestContext| - void SetupCompositor() override; - void SetExternalTextureCallback( TestExternalTextureCallback external_texture_frame_callback); @@ -61,8 +58,11 @@ class EmbedderTestContextMetal : public EmbedderTestContext { FlutterMetalTexture GetNextDrawable(const FlutterFrameInfo* frame_info); private: - // This allows the builder to access the hooks. - friend class EmbedderConfigBuilder; + // |EmbedderTestContext| + void SetSurface(SkISize surface_size) override; + + // |EmbedderTestContext| + void SetupCompositor() override; TestExternalTextureCallback external_texture_frame_callback_ = nullptr; SkISize surface_size_ = SkISize::MakeEmpty(); @@ -72,8 +72,6 @@ class EmbedderTestContextMetal : public EmbedderTestContext { PresentCallback present_callback_ = nullptr; NextDrawableCallback next_drawable_callback_ = nullptr; - void SetupSurface(SkISize surface_size) override; - FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTestContextMetal); }; diff --git a/shell/platform/embedder/tests/embedder_test_context_metal.mm b/shell/platform/embedder/tests/embedder_test_context_metal.mm index 1ffaad31b54e6..848c93c4b90be 100644 --- a/shell/platform/embedder/tests/embedder_test_context_metal.mm +++ b/shell/platform/embedder/tests/embedder_test_context_metal.mm @@ -11,35 +11,41 @@ #include "flutter/fml/logging.h" #include "flutter/shell/platform/embedder/tests/embedder_test_compositor_metal.h" -namespace flutter { -namespace testing { +namespace flutter::testing { EmbedderTestContextMetal::EmbedderTestContextMetal(std::string assets_path) : EmbedderTestContext(std::move(assets_path)) { metal_context_ = std::make_unique(); + renderer_config_.type = FlutterRendererType::kMetal; + renderer_config_.metal = { + .struct_size = sizeof(FlutterMetalRendererConfig), + .device = metal_context_->GetMetalDevice(), + .present_command_queue = metal_context_->GetMetalCommandQueue(), + .get_next_drawable_callback = + [](void* user_data, const FlutterFrameInfo* frame_info) { + return reinterpret_cast(user_data)->GetNextDrawable( + frame_info); + }, + .present_drawable_callback = [](void* user_data, const FlutterMetalTexture* texture) -> bool { + return reinterpret_cast(user_data)->Present(texture->texture_id); + }, + .external_texture_frame_callback = [](void* user_data, int64_t texture_id, size_t width, + size_t height, + FlutterMetalExternalTexture* texture_out) -> bool { + return reinterpret_cast(user_data)->PopulateExternalTexture( + texture_id, width, height, texture_out); + }, + }; } EmbedderTestContextMetal::~EmbedderTestContextMetal() {} -void EmbedderTestContextMetal::SetupSurface(SkISize surface_size) { - FML_CHECK(surface_size_.isEmpty()); - surface_size_ = surface_size; - metal_surface_ = TestMetalSurface::Create(*metal_context_, surface_size_); -} - -size_t EmbedderTestContextMetal::GetSurfacePresentCount() const { - return present_count_; -} - EmbedderTestContextType EmbedderTestContextMetal::GetContextType() const { return EmbedderTestContextType::kMetalContext; } -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()); +size_t EmbedderTestContextMetal::GetSurfacePresentCount() const { + return present_count_; } TestMetalContext* EmbedderTestContextMetal::GetTestMetalContext() { @@ -98,5 +104,17 @@ return texture; } -} // namespace testing -} // namespace flutter +void EmbedderTestContextMetal::SetSurface(SkISize surface_size) { + FML_CHECK(surface_size_.isEmpty()); + surface_size_ = surface_size; + metal_surface_ = TestMetalSurface::Create(*metal_context_, surface_size_); +} + +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()); +} + +} // namespace flutter::testing diff --git a/shell/platform/embedder/tests/embedder_test_context_software.cc b/shell/platform/embedder/tests/embedder_test_context_software.cc index cddeed7656b25..1f06890abb725 100644 --- a/shell/platform/embedder/tests/embedder_test_context_software.cc +++ b/shell/platform/embedder/tests/embedder_test_context_software.cc @@ -13,34 +13,43 @@ #include "flutter/shell/platform/embedder/tests/embedder_test_compositor_software.h" #include "flutter/testing/testing.h" #include "third_party/dart/runtime/bin/elf_loader.h" +#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkSurface.h" -namespace flutter { -namespace testing { +namespace flutter::testing { EmbedderTestContextSoftware::EmbedderTestContextSoftware( std::string assets_path) - : EmbedderTestContext(std::move(assets_path)) {} - -EmbedderTestContextSoftware::~EmbedderTestContextSoftware() = default; - -bool EmbedderTestContextSoftware::Present(const sk_sp& image) { - software_surface_present_count_++; - - FireRootSurfacePresentCallbackIfPresent([image] { return image; }); - - return true; + : EmbedderTestContext(std::move(assets_path)) { + renderer_config_.type = FlutterRendererType::kSoftware; + renderer_config_.software = { + .struct_size = sizeof(FlutterSoftwareRendererConfig), + .surface_present_callback = + [](void* context, const void* allocation, size_t row_bytes, + size_t height) { + auto image_info = SkImageInfo::MakeN32Premul( + SkISize::Make(row_bytes / 4, height)); + SkBitmap bitmap; + if (!bitmap.installPixels(image_info, const_cast(allocation), + row_bytes)) { + FML_LOG(ERROR) << "Could not copy pixels for the software " + "composition from the engine."; + return false; + } + bitmap.setImmutable(); + return reinterpret_cast(context) + ->Present(SkImages::RasterFromBitmap(bitmap)); + }, + }; } -size_t EmbedderTestContextSoftware::GetSurfacePresentCount() const { - return software_surface_present_count_; -} +EmbedderTestContextSoftware::~EmbedderTestContextSoftware() = default; EmbedderTestContextType EmbedderTestContextSoftware::GetContextType() const { return EmbedderTestContextType::kSoftwareContext; } -void EmbedderTestContextSoftware::SetupSurface(SkISize surface_size) { +void EmbedderTestContextSoftware::SetSurface(SkISize surface_size) { surface_size_ = surface_size; } @@ -49,5 +58,14 @@ void EmbedderTestContextSoftware::SetupCompositor() { compositor_ = std::make_unique(surface_size_); } -} // namespace testing -} // namespace flutter +size_t EmbedderTestContextSoftware::GetSurfacePresentCount() const { + return software_surface_present_count_; +} + +bool EmbedderTestContextSoftware::Present(const sk_sp& image) { + software_surface_present_count_++; + FireRootSurfacePresentCallbackIfPresent([image] { return image; }); + return true; +} + +} // namespace flutter::testing diff --git a/shell/platform/embedder/tests/embedder_test_context_software.h b/shell/platform/embedder/tests/embedder_test_context_software.h index 25c0ce52c92e5..05396b160352b 100644 --- a/shell/platform/embedder/tests/embedder_test_context_software.h +++ b/shell/platform/embedder/tests/embedder_test_context_software.h @@ -18,21 +18,24 @@ class EmbedderTestContextSoftware : public EmbedderTestContext { ~EmbedderTestContextSoftware() override; - size_t GetSurfacePresentCount() const override; - // |EmbedderTestContext| EmbedderTestContextType GetContextType() const override; - bool Present(const sk_sp& image); + // |EmbedderTestContext| + size_t GetSurfacePresentCount() const override; - protected: - virtual void SetupCompositor() override; + bool Present(const sk_sp& image); private: + // |EmbedderTestContext| + void SetSurface(SkISize surface_size) override; + + // |EmbedderTestContext| + void SetupCompositor() override; + sk_sp surface_; SkISize surface_size_; size_t software_surface_present_count_ = 0; - void SetupSurface(SkISize surface_size) override; FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTestContextSoftware); }; diff --git a/shell/platform/embedder/tests/embedder_test_context_vulkan.cc b/shell/platform/embedder/tests/embedder_test_context_vulkan.cc index 4f3678597dda1..09bb264a38616 100644 --- a/shell/platform/embedder/tests/embedder_test_context_vulkan.cc +++ b/shell/platform/embedder/tests/embedder_test_context_vulkan.cc @@ -15,20 +15,52 @@ #include "flutter/vulkan/vulkan_device.h" #include "third_party/skia/include/core/SkSurface.h" -namespace flutter { -namespace testing { +namespace flutter::testing { EmbedderTestContextVulkan::EmbedderTestContextVulkan(std::string assets_path) : EmbedderTestContext(std::move(assets_path)), surface_() { vulkan_context_ = fml::MakeRefCounted(); + renderer_config_.type = FlutterRendererType::kVulkan; + renderer_config_.vulkan = { + .struct_size = sizeof(FlutterVulkanRendererConfig), + .version = vulkan_context_->application_->GetAPIVersion(), + .instance = vulkan_context_->application_->GetInstance(), + .physical_device = vulkan_context_->device_->GetPhysicalDeviceHandle(), + .device = vulkan_context_->device_->GetHandle(), + .queue_family_index = vulkan_context_->device_->GetGraphicsQueueIndex(), + .queue = vulkan_context_->device_->GetQueueHandle(), + .get_instance_proc_address_callback = + EmbedderTestContextVulkan::InstanceProcAddr, + .get_next_image_callback = + [](void* context, + const FlutterFrameInfo* frame_info) -> FlutterVulkanImage { + VkImage image = + reinterpret_cast(context)->GetNextImage( + {static_cast(frame_info->size.width), + static_cast(frame_info->size.height)}); + return { + .struct_size = sizeof(FlutterVulkanImage), + .image = reinterpret_cast(image), + .format = VK_FORMAT_R8G8B8A8_UNORM, + }; + }, + .present_image_callback = [](void* context, + const FlutterVulkanImage* image) -> bool { + return reinterpret_cast(context) + ->PresentImage(reinterpret_cast(image->image)); + }, + }; } EmbedderTestContextVulkan::~EmbedderTestContextVulkan() {} -void EmbedderTestContextVulkan::SetupSurface(SkISize surface_size) { - FML_CHECK(surface_size_.isEmpty()); - surface_size_ = surface_size; - surface_ = TestVulkanSurface::Create(*vulkan_context_, surface_size_); +EmbedderTestContextType EmbedderTestContextVulkan::GetContextType() const { + return EmbedderTestContextType::kVulkanContext; +} + +void EmbedderTestContextVulkan::SetVulkanInstanceProcAddressCallback( + FlutterVulkanInstanceProcAddressCallback callback) { + renderer_config_.vulkan.get_instance_proc_address_callback = callback; } size_t EmbedderTestContextVulkan::GetSurfacePresentCount() const { @@ -46,18 +78,6 @@ bool EmbedderTestContextVulkan::PresentImage(VkImage image) { return true; } -EmbedderTestContextType EmbedderTestContextVulkan::GetContextType() const { - return EmbedderTestContextType::kVulkanContext; -} - -void EmbedderTestContextVulkan::SetupCompositor() { - FML_CHECK(!compositor_) << "Already set up a compositor in this context."; - FML_CHECK(surface_) - << "Set up the Vulkan surface before setting up a compositor."; - compositor_ = std::make_unique( - surface_size_, vulkan_context_->GetGrDirectContext()); -} - void* EmbedderTestContextVulkan::InstanceProcAddr( void* user_data, FlutterVulkanInstanceHandle instance, @@ -68,5 +88,18 @@ void* EmbedderTestContextVulkan::InstanceProcAddr( return reinterpret_cast(proc_addr); } -} // namespace testing -} // namespace flutter +void EmbedderTestContextVulkan::SetSurface(SkISize surface_size) { + FML_CHECK(surface_size_.isEmpty()); + surface_size_ = surface_size; + surface_ = TestVulkanSurface::Create(*vulkan_context_, surface_size_); +} + +void EmbedderTestContextVulkan::SetupCompositor() { + FML_CHECK(!compositor_) << "Already set up a compositor in this context."; + FML_CHECK(surface_) + << "Set up the Vulkan surface before setting up a compositor."; + compositor_ = std::make_unique( + surface_size_, vulkan_context_->GetGrDirectContext()); +} + +} // namespace flutter::testing diff --git a/shell/platform/embedder/tests/embedder_test_context_vulkan.h b/shell/platform/embedder/tests/embedder_test_context_vulkan.h index 18cceab4a28d4..2fde79996207d 100644 --- a/shell/platform/embedder/tests/embedder_test_context_vulkan.h +++ b/shell/platform/embedder/tests/embedder_test_context_vulkan.h @@ -26,18 +26,24 @@ class EmbedderTestContextVulkan : public EmbedderTestContext { // |EmbedderTestContext| size_t GetSurfacePresentCount() const override; - // |EmbedderTestContext| - void SetupCompositor() override; - VkImage GetNextImage(const SkISize& size); bool PresentImage(VkImage image); + void SetVulkanInstanceProcAddressCallback( + FlutterVulkanInstanceProcAddressCallback callback); + static void* InstanceProcAddr(void* user_data, FlutterVulkanInstanceHandle instance, const char* name); private: + // |EmbedderTestContext| + void SetSurface(SkISize surface_size) override; + + // |EmbedderTestContext| + void SetupCompositor() override; + // The TestVulkanContext destructor must be called _after_ the compositor is // freed. fml::RefPtr vulkan_context_ = nullptr; @@ -47,10 +53,6 @@ class EmbedderTestContextVulkan : public EmbedderTestContext { SkISize surface_size_ = SkISize::MakeEmpty(); size_t present_count_ = 0; - void SetupSurface(SkISize surface_size) override; - - friend class EmbedderConfigBuilder; - FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTestContextVulkan); }; diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index 4acdcde9aa170..1f6323427a785 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -69,7 +69,7 @@ TEST_F(EmbedderTest, CanLaunchAndShutdownWithValidProjectArgs) { fml::AutoResetWaitableEvent latch; context.AddIsolateCreateCallback([&latch]() { latch.Signal(); }); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); // Wait for the root isolate to launch. @@ -81,7 +81,7 @@ TEST_F(EmbedderTest, CanLaunchAndShutdownWithValidProjectArgs) { TEST_F(EmbedderTest, DISABLED_CanLaunchAndShutdownMultipleTimes) { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kSoftwareContext)); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); for (size_t i = 0; i < 3; ++i) { auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -97,7 +97,7 @@ TEST_F(EmbedderTest, CanInvokeCustomEntrypoint) { }; context.AddNativeCallback("SayHiFromCustomEntrypoint", entrypoint); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("customEntrypoint"); auto engine = builder.LaunchEngine(); latch.Wait(); @@ -136,7 +136,7 @@ TEST_F(EmbedderTest, CanInvokeCustomEntrypointMacro) { })); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("customEntrypoint1"); auto engine = builder.LaunchEngine(); latch1.Wait(); @@ -148,7 +148,7 @@ TEST_F(EmbedderTest, CanInvokeCustomEntrypointMacro) { TEST_F(EmbedderTest, CanTerminateCleanly) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("terminateExitCodeHandler"); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -169,7 +169,7 @@ TEST_F(EmbedderTest, ExecutableNameNotNull) { })); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("executableNameNotNull"); builder.SetExecutableName("/path/to/binary"); auto engine = builder.LaunchEngine(); @@ -192,7 +192,7 @@ TEST_F(EmbedderTest, ImplicitViewNotNull) { })); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("implicitViewNotNull"); auto engine = builder.LaunchEngine(); latch.Wait(); @@ -239,7 +239,7 @@ TEST_F(EmbedderTest, CanSpecifyCustomPlatformTaskRunner) { EmbedderConfigBuilder builder(context); const auto task_runner_description = test_task_runner.GetFlutterTaskRunnerDescription(); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetPlatformTaskRunner(&task_runner_description); builder.SetDartEntrypoint("invokePlatformTaskRunner"); std::scoped_lock lock(engine_mutex); @@ -283,7 +283,7 @@ TEST(EmbedderTestNoFixture, CanGetCurrentTimeInNanoseconds) { TEST_F(EmbedderTest, CanReloadSystemFonts) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -301,7 +301,7 @@ TEST_F(EmbedderTest, IsolateServiceIdSent) { thread.GetTaskRunner()->PostTask([&]() { EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("main"); builder.SetPlatformMessageCallback( [&](const FlutterPlatformMessage* message) { @@ -337,7 +337,7 @@ TEST_F(EmbedderTest, IsolateServiceIdSent) { TEST_F(EmbedderTest, CanCreateAndCollectCallbacks) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("platform_messages_response"); context.AddNativeCallback( "SignalNativeTest", @@ -376,7 +376,7 @@ TEST_F(EmbedderTest, PlatformMessagesCanReceiveResponse) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("platform_messages_response"); fml::AutoResetWaitableEvent ready; @@ -432,7 +432,7 @@ TEST_F(EmbedderTest, PlatformMessagesCanReceiveResponse) { TEST_F(EmbedderTest, PlatformMessagesCanBeSentWithoutResponseHandles) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("platform_messages_no_response"); const std::string message_data = "Hello but don't call me back."; @@ -477,7 +477,7 @@ TEST_F(EmbedderTest, PlatformMessagesCanBeSentWithoutResponseHandles) { TEST_F(EmbedderTest, NullPlatformMessagesCanBeSent) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("null_platform_messages"); fml::AutoResetWaitableEvent ready, message; @@ -519,7 +519,7 @@ TEST_F(EmbedderTest, NullPlatformMessagesCanBeSent) { TEST_F(EmbedderTest, InvalidPlatformMessages) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -544,7 +544,7 @@ TEST_F(EmbedderTest, CanSetCustomLogMessageCallback) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("custom_logger"); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); context.SetLogMessageCallback( [&callback_latch](const char* tag, const char* message) { EXPECT_EQ(std::string(tag), "flutter"); @@ -563,7 +563,7 @@ TEST_F(EmbedderTest, CanSetCustomLogTag) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("custom_logger"); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetLogTag("butterfly"); context.SetLogMessageCallback( [&callback_latch](const char* tag, const char* message) { @@ -583,7 +583,7 @@ TEST_F(EmbedderTest, CanSetCustomLogTag) { TEST_F(EmbedderTest, VMShutsDownWhenNoEnginesInProcess) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); const auto launch_count = DartVM::GetVMLaunchCount(); { @@ -602,7 +602,7 @@ TEST_F(EmbedderTest, VMShutsDownWhenNoEnginesInProcess) { TEST_F(EmbedderTest, DartEntrypointArgs) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.AddDartEntrypointArgument("foo"); builder.AddDartEntrypointArgument("bar"); builder.SetDartEntrypoint("dart_entrypoint_args"); @@ -636,7 +636,7 @@ TEST_F(EmbedderTest, VMAndIsolateSnapshotSizesAreRedundantInAOTMode) { } auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); // The fixture sets this up correctly. Intentionally mess up the args. builder.GetProjectArgs().vm_snapshot_data_size = 0; @@ -652,7 +652,7 @@ TEST_F(EmbedderTest, CanRenderImplicitView) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("render_implicit_view"); builder.SetRenderTargetType( @@ -684,7 +684,7 @@ TEST_F(EmbedderTest, CanRenderImplicitViewUsingPresentLayersCallback) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(/* avoid_backing_store_cache = */ false, /* use_present_layers_callback = */ true); builder.SetDartEntrypoint("render_implicit_view"); @@ -729,7 +729,7 @@ TEST_F(EmbedderTest, auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views_with_known_scene"); @@ -948,7 +948,7 @@ TEST_F(EmbedderTest, NoLayerCreatedForTransparentOverlayOnTopOfPlatformLayer) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views_transparent_overlay"); @@ -1085,7 +1085,7 @@ TEST_F(EmbedderTest, NoLayerCreatedForNoOverlayOnTopOfPlatformLayer) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("can_composite_platform_views_no_overlay"); @@ -1220,7 +1220,7 @@ TEST_F(EmbedderTest, NoLayerCreatedForNoOverlayOnTopOfPlatformLayer) { TEST_F(EmbedderTest, CanCreateInitializedEngine) { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kSoftwareContext)); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.InitializeEngine(); ASSERT_TRUE(engine.is_valid()); engine.reset(); @@ -1232,7 +1232,7 @@ TEST_F(EmbedderTest, CanCreateInitializedEngine) { TEST_F(EmbedderTest, CanRunInitializedEngine) { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kSoftwareContext)); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.InitializeEngine(); ASSERT_TRUE(engine.is_valid()); ASSERT_EQ(FlutterEngineRunInitialized(engine.get()), kSuccess); @@ -1247,7 +1247,7 @@ TEST_F(EmbedderTest, CanRunInitializedEngine) { TEST_F(EmbedderTest, CanDeinitializeAnEngine) { EmbedderConfigBuilder builder( GetEmbedderContext(EmbedderTestContextType::kSoftwareContext)); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.InitializeEngine(); ASSERT_TRUE(engine.is_valid()); ASSERT_EQ(FlutterEngineRunInitialized(engine.get()), kSuccess); @@ -1278,7 +1278,7 @@ TEST_F(EmbedderTest, CanDeinitializeAnEngine) { TEST_F(EmbedderTest, CanAddView) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("window_metrics_event_all_view_ids"); fml::AutoResetWaitableEvent ready_latch, message_latch; @@ -1326,7 +1326,7 @@ TEST_F(EmbedderTest, CanAddView) { TEST_F(EmbedderTest, AddViewSchedulesFrame) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("add_view_schedules_frame"); fml::AutoResetWaitableEvent latch; context.AddNativeCallback( @@ -1371,7 +1371,7 @@ TEST_F(EmbedderTest, AddViewSchedulesFrame) { TEST_F(EmbedderTest, CanRemoveView) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("window_metrics_event_all_view_ids"); fml::AutoResetWaitableEvent ready_latch, message_latch; @@ -1432,7 +1432,7 @@ TEST_F(EmbedderTest, CanRemoveView) { TEST_F(EmbedderTest, CannotRemoveImplicitView) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -1452,7 +1452,7 @@ TEST_F(EmbedderTest, CannotRemoveImplicitView) { TEST_F(EmbedderTest, CannotAddDuplicateViews) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("window_metrics_event_all_view_ids"); fml::AutoResetWaitableEvent ready_latch, message_latch; @@ -1524,7 +1524,7 @@ TEST_F(EmbedderTest, CannotAddDuplicateViews) { TEST_F(EmbedderTest, CanReuseViewIds) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("window_metrics_event_all_view_ids"); fml::AutoResetWaitableEvent ready_latch, message_latch; @@ -1589,7 +1589,7 @@ TEST_F(EmbedderTest, CanReuseViewIds) { TEST_F(EmbedderTest, CannotRemoveUnknownView) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -1615,7 +1615,7 @@ TEST_F(EmbedderTest, CannotRemoveUnknownView) { TEST_F(EmbedderTest, ViewOperationsOrdered) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("window_metrics_event_all_view_ids"); fml::AutoResetWaitableEvent ready_latch; @@ -1762,7 +1762,7 @@ TEST_F(EmbedderTest, ViewOperationsOrdered) { TEST_F(EmbedderTest, CanRenderMultipleViews) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetCompositor(); builder.SetDartEntrypoint("render_all_views"); @@ -1843,7 +1843,7 @@ TEST_F(EmbedderTest, BackingStoresCorrespondToTheirViews) { EmbedderConfigBuilder builder(context); builder.SetDartEntrypoint("render_all_views"); - builder.SetSoftwareRendererConfig(SkISize::Make(800, 600)); + builder.SetSurface(SkISize::Make(800, 600)); builder.SetCompositor(); EmbedderTestBackingStoreProducerSoftware producer( @@ -1995,7 +1995,7 @@ TEST_F(EmbedderTest, BackingStoresCorrespondToTheirViews) { TEST_F(EmbedderTest, CanUpdateLocales) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("can_receive_locale_updates"); fml::AutoResetWaitableEvent latch; context.AddNativeCallback( @@ -2056,7 +2056,7 @@ TEST_F(EmbedderTest, LocalizationCallbacksCalled) { fml::AutoResetWaitableEvent latch; context.AddIsolateCreateCallback([&latch]() { latch.Signal(); }); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); // Wait for the root isolate to launch. @@ -2087,7 +2087,7 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(SkISize::Make(1024, 600)); + builder.SetSurface(SkISize::Make(1024, 600)); builder.SetCompositor(); builder.SetDartEntrypoint("verify_b143464703"); @@ -2211,7 +2211,7 @@ TEST_F(EmbedderTest, CanSendLowMemoryNotification) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); @@ -2241,7 +2241,7 @@ TEST_F(EmbedderTest, CanPostTaskToAllNativeThreads) { GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); engine = builder.LaunchEngine(); @@ -2385,7 +2385,7 @@ TEST_F(EmbedderTest, MustNotRunWithMultipleAOTSources) { context, EmbedderConfigBuilder::InitializationPreference::kMultiAOTInitialize); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_FALSE(engine.is_valid()); @@ -2430,7 +2430,7 @@ TEST_F(EmbedderTest, CanLaunchAndShutdownWithAValidElfSource) { context, EmbedderConfigBuilder::InitializationPreference::kAOTDataInitialize); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2466,7 +2466,7 @@ TEST_F(EmbedderTest, CanSuccessfullyPopulateSpecificJITSnapshotCallbacks) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); // Construct the location of valid JIT snapshots. const std::string src_path = GetSourcePath(); @@ -2522,7 +2522,7 @@ TEST_F(EmbedderTest, JITSnapshotCallbacksFailWithInvalidLocation) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); // Explicitly define the locations of the invalid JIT snapshots builder.GetProjectArgs().vm_snapshot_data = @@ -2559,7 +2559,7 @@ TEST_F(EmbedderTest, CanLaunchEngineWithSpecifiedJITSnapshots) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); // Construct the location of valid JIT snapshots. const std::string src_path = GetSourcePath(); @@ -2599,7 +2599,7 @@ TEST_F(EmbedderTest, CanLaunchEngineWithSomeSpecifiedJITSnapshots) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); // Construct the location of valid JIT snapshots. const std::string src_path = GetSourcePath(); @@ -2632,7 +2632,7 @@ TEST_F(EmbedderTest, CanLaunchEngineWithInvalidJITSnapshots) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); // Explicitly define the locations of the JIT snapshots builder.GetProjectArgs().isolate_snapshot_data = @@ -2658,7 +2658,7 @@ TEST_F(EmbedderTest, CanLaunchEngineWithUnspecifiedJITSnapshots) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); ASSERT_EQ(builder.GetProjectArgs().vm_snapshot_data, nullptr); ASSERT_EQ(builder.GetProjectArgs().vm_snapshot_instructions, nullptr); @@ -2672,7 +2672,7 @@ TEST_F(EmbedderTest, CanLaunchEngineWithUnspecifiedJITSnapshots) { TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); @@ -2724,7 +2724,7 @@ static void expectSoftwareRenderingOutputMatches( fml::AutoResetWaitableEvent latch; bool matches = false; - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetCompositor(); builder.SetDartEntrypoint(std::move(entrypoint)); builder.SetRenderTargetType( @@ -2943,7 +2943,7 @@ TEST_F(EmbedderTest, KeyDataIsCorrectlySerialized) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("key_data_echo"); builder.SetPlatformMessageCallback( [&](const FlutterPlatformMessage* message) { @@ -3065,7 +3065,7 @@ TEST_F(EmbedderTest, KeyDataAreBuffered) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("key_data_late_echo"); builder.SetPlatformMessageCallback( [&](const FlutterPlatformMessage* message) { @@ -3166,7 +3166,7 @@ TEST_F(EmbedderTest, KeyDataResponseIsCorrectlyInvoked) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("key_data_echo"); context.AddNativeCallback( "SignalNativeTest", @@ -3241,7 +3241,7 @@ TEST_F(EmbedderTest, BackToBackKeyEventResponsesCorrectlyInvoked) { GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("key_data_echo"); context.AddNativeCallback( "SignalNativeTest", @@ -3340,7 +3340,7 @@ TEST_F(EmbedderTest, VsyncCallbackPostedIntoFuture) { })); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetupVsyncCallback(); builder.SetDartEntrypoint("empty_scene"); engine = builder.LaunchEngine(); @@ -3371,7 +3371,7 @@ TEST_F(EmbedderTest, VsyncCallbackPostedIntoFuture) { TEST_F(EmbedderTest, CanScheduleFrame) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("can_schedule_frame"); fml::AutoResetWaitableEvent latch; context.AddNativeCallback( @@ -3399,7 +3399,7 @@ TEST_F(EmbedderTest, CanScheduleFrame) { TEST_F(EmbedderTest, CanSetNextFrameCallback) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("draw_solid_red"); auto engine = builder.LaunchEngine(); @@ -3486,7 +3486,7 @@ TEST_F(EmbedderTest, EmbedderThreadHostUseCustomThreadConfig) { TEST_F(EmbedderTest, CanSendPointer) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("pointer_data_packet"); fml::AutoResetWaitableEvent ready_latch, count_latch, message_latch; @@ -3537,7 +3537,7 @@ TEST_F(EmbedderTest, CanSendPointer) { TEST_F(EmbedderTest, CanSendPointerEventWithViewId) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("pointer_data_packet_view_id"); fml::AutoResetWaitableEvent ready_latch, add_view_latch, message_latch; @@ -3599,7 +3599,7 @@ TEST_F(EmbedderTest, CanSendPointerEventWithViewId) { TEST_F(EmbedderTest, WindowMetricsEventDefaultsToImplicitView) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("window_metrics_event_view_id"); fml::AutoResetWaitableEvent ready_latch, message_latch; @@ -3640,7 +3640,7 @@ TEST_F(EmbedderTest, WindowMetricsEventDefaultsToImplicitView) { TEST_F(EmbedderTest, IgnoresWindowMetricsEventForUnknownView) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("window_metrics_event_view_id"); fml::AutoResetWaitableEvent ready_latch, message_latch; @@ -3710,7 +3710,7 @@ TEST_F(EmbedderTest, RegisterChannelListener) { }); EmbedderConfigBuilder builder(context); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetDartEntrypoint("channel_listener_response"); auto engine = builder.LaunchEngine(); @@ -3769,7 +3769,7 @@ TEST_F(EmbedderTest, PlatformThreadIsolatesWithCustomPlatformTaskRunner) { EmbedderConfigBuilder builder(context); const auto task_runner_description = test_task_runner.GetFlutterTaskRunnerDescription(); - builder.SetSoftwareRendererConfig(); + builder.SetSurface(SkISize::Make(1, 1)); builder.SetPlatformTaskRunner(&task_runner_description); builder.SetDartEntrypoint("invokePlatformThreadIsolate"); builder.AddCommandLineArgument("--enable-platform-isolates"); diff --git a/shell/platform/embedder/tests/embedder_vk_unittests.cc b/shell/platform/embedder/tests/embedder_vk_unittests.cc index d6209d2ed96d0..53ab019948e4b 100644 --- a/shell/platform/embedder/tests/embedder_vk_unittests.cc +++ b/shell/platform/embedder/tests/embedder_vk_unittests.cc @@ -96,12 +96,12 @@ static_assert( } // namespace TEST_F(EmbedderTest, CanSwapOutVulkanCalls) { - auto& context = GetEmbedderContext(EmbedderTestContextType::kVulkanContext); fml::AutoResetWaitableEvent latch; + + auto& context = static_cast( + GetEmbedderContext(EmbedderTestContextType::kVulkanContext)); context.AddIsolateCreateCallback([&latch]() { latch.Signal(); }); - EmbedderConfigBuilder builder(context); - builder.SetVulkanRendererConfig( - SkISize::Make(1024, 1024), + context.SetVulkanInstanceProcAddressCallback( [](void* user_data, FlutterVulkanInstanceHandle instance, const char* name) -> void* { if (StrcmpFixed(name, "vkGetInstanceProcAddr") == 0) { @@ -114,6 +114,9 @@ TEST_F(EmbedderTest, CanSwapOutVulkanCalls) { return EmbedderTestContextVulkan::InstanceProcAddr(user_data, instance, name); }); + + EmbedderConfigBuilder builder(context); + builder.SetSurface(SkISize::Make(1024, 1024)); auto engine = builder.LaunchEngine(); ASSERT_TRUE(engine.is_valid()); // Wait for the root isolate to launch.