From a21ab7649fafb50965050590ec08395942d4b46b Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 3 Jul 2023 15:14:53 -0700 Subject: [PATCH 01/29] [Impeller] support Impeller via GL/Angle on Windows. --- shell/common/rasterizer.cc | 1 - shell/gpu/gpu_surface_gl_delegate.h | 2 +- shell/gpu/gpu_surface_gl_impeller.cc | 14 +- shell/platform/embedder/BUILD.gn | 27 ++- shell/platform/embedder/embedder.cc | 120 ++++++++++-- .../embedder/embedder_surface_gl_impeller.cc | 178 ++++++++++++++++++ .../embedder/embedder_surface_gl_impeller.h | 79 ++++++++ .../embedder/platform_view_embedder.cc | 8 +- .../embedder/platform_view_embedder.h | 4 +- .../platform/windows/angle_surface_manager.cc | 5 +- .../platform/windows/angle_surface_manager.h | 1 + 11 files changed, 394 insertions(+), 45 deletions(-) create mode 100644 shell/platform/embedder/embedder_surface_gl_impeller.cc create mode 100644 shell/platform/embedder/embedder_surface_gl_impeller.h diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc index 163e7aa36e131..28f9a7a70cb3e 100644 --- a/shell/common/rasterizer.cc +++ b/shell/common/rasterizer.cc @@ -552,7 +552,6 @@ RasterStatus Rasterizer::DrawToSurfaceUnsafe( auto root_surface_canvas = embedder_root_canvas ? embedder_root_canvas : frame->Canvas(); - auto compositor_frame = compositor_context_->AcquireFrame( surface_->GetContext(), // skia GrContext root_surface_canvas, // root surface canvas diff --git a/shell/gpu/gpu_surface_gl_delegate.h b/shell/gpu/gpu_surface_gl_delegate.h index f097cba2d0266..dee0c682969a0 100644 --- a/shell/gpu/gpu_surface_gl_delegate.h +++ b/shell/gpu/gpu_surface_gl_delegate.h @@ -58,7 +58,7 @@ class GPUSurfaceGLDelegate { virtual std::unique_ptr GLContextMakeCurrent() = 0; // Called to clear the current GL context on the thread. This may be called on - // either the GPU or IO threads. + // either the Raster or IO threads. virtual bool GLContextClearCurrent() = 0; // Inform the GL Context that there's going to be no writing beyond diff --git a/shell/gpu/gpu_surface_gl_impeller.cc b/shell/gpu/gpu_surface_gl_impeller.cc index 20fd96142d917..a3e4cc4a49dcf 100644 --- a/shell/gpu/gpu_surface_gl_impeller.cc +++ b/shell/gpu/gpu_surface_gl_impeller.cc @@ -61,7 +61,7 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( delegate = delegate_]() -> bool { if (weak) { GLPresentInfo present_info = { - .fbo_id = 0, + .fbo_id = 0u, .frame_damage = std::nullopt, // TODO (https://github.com/flutter/flutter/issues/105597): wire-up // presentation time to impeller backend. @@ -122,12 +122,12 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( }); return std::make_unique( - nullptr, // surface - SurfaceFrame::FramebufferInfo{}, // framebuffer info - submit_callback, // submit callback - size, // frame size - std::move(context_switch), // context result - true // display list fallback + nullptr, // surface + delegate_->GLContextFramebufferInfo(), // framebuffer info + submit_callback, // submit callback + size, // frame size + std::move(context_switch), // context result + true // display list fallback ); } diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index aa43f3f48b755..424219e54c903 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -95,16 +95,6 @@ template("embedder_source_set") { ] public_deps = [ ":embedder_headers" ] - - if (embedder_enable_gl) { - sources += [ - "embedder_external_texture_gl.cc", - "embedder_external_texture_gl.h", - "embedder_surface_gl.cc", - "embedder_surface_gl.h", - ] - } - deps = [ ":embedder_gpu_configuration", "//flutter/assets", @@ -121,6 +111,23 @@ template("embedder_source_set") { "//third_party/skia", ] + + if (embedder_enable_gl) { + sources += [ + "embedder_external_texture_gl.cc", + "embedder_external_texture_gl.h", + "embedder_surface_gl.cc", + "embedder_surface_gl.h", + ] + + if (impeller_supports_rendering) { + sources += [ + "embedder_surface_gl_impeller.cc", + "embedder_surface_gl_impeller.h", + ] + } + } + if (impeller_supports_rendering) { sources += [ "embedder_render_target_impeller.cc", diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index c9d1ce9866744..6c5a3a04e6c88 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -66,7 +66,16 @@ extern const intptr_t kPlatformStrongDillSize; #ifdef SHELL_ENABLE_GL #include "flutter/shell/platform/embedder/embedder_external_texture_gl.h" -#endif +#ifdef IMPELLER_SUPPORTS_RENDERING +#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" // nogncheck +#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" // nogncheck +#include "impeller/core/texture.h" // nogncheck +#include "impeller/renderer/backend/gles/context_gles.h" // nogncheck +#include "impeller/renderer/backend/gles/texture_gles.h" // nogncheck +#include "impeller/renderer/context.h" // nogncheck +#include "impeller/renderer/render_target.h" // nogncheck +#endif // IMPELLER_SUPPORTS_RENDERING +#endif // SHELL_ENABLE_GL #ifdef SHELL_ENABLE_METAL #include "flutter/shell/platform/embedder/embedder_surface_metal.h" @@ -263,7 +272,8 @@ InferOpenGLPlatformViewCreationCallback( const flutter::PlatformViewEmbedder::PlatformDispatchTable& platform_dispatch_table, std::unique_ptr - external_view_embedder) { + external_view_embedder, + bool enable_impeller) { #ifdef SHELL_ENABLE_GL if (config->type != kOpenGL) { return nullptr; @@ -439,15 +449,30 @@ InferOpenGLPlatformViewCreationCallback( return fml::MakeCopyable( [gl_dispatch_table, fbo_reset_after_present, platform_dispatch_table, + enable_impeller, external_view_embedder = std::move(external_view_embedder)](flutter::Shell& shell) mutable { + std::shared_ptr view_embedder = + std::move(external_view_embedder); + if (enable_impeller) { + return std::make_unique( + shell, // delegate + shell.GetTaskRunners(), // task runners + std::make_unique( + gl_dispatch_table, fbo_reset_after_present, + view_embedder), // embedder_surface + platform_dispatch_table, // embedder platform dispatch table + view_embedder // external view embedder + ); + } return std::make_unique( - shell, // delegate - shell.GetTaskRunners(), // task runners - gl_dispatch_table, // embedder GL dispatch table - fbo_reset_after_present, // fbo reset after present + shell, // delegate + shell.GetTaskRunners(), // task runners + std::make_unique( + gl_dispatch_table, fbo_reset_after_present, + view_embedder), // embedder_surface platform_dispatch_table, // embedder platform dispatch table - std::move(external_view_embedder) // external view embedder + view_embedder // external view embedder ); }); #else @@ -684,7 +709,7 @@ InferPlatformViewCreationCallback( case kOpenGL: return InferOpenGLPlatformViewCreationCallback( config, user_data, platform_dispatch_table, - std::move(external_view_embedder)); + std::move(external_view_embedder), enable_impeller); case kSoftware: return InferSoftwarePlatformViewCreationCallback( config, user_data, platform_dispatch_table, @@ -922,6 +947,66 @@ static sk_sp MakeSkSurfaceFromBackingStore( #endif } +static std::unique_ptr +MakeRenderTargetFromBackingStoreImpeller( + FlutterBackingStore backing_store, + const fml::closure& on_release, + const std::shared_ptr& aiks_context, + const FlutterBackingStoreConfig& config, + const FlutterOpenGLFramebuffer* framebuffer) { +#if defined(SHELL_ENABLE_GL) && defined(IMPELLER_SUPPORTS_RENDERING) + + const auto& gl_context = + impeller::ContextGLES::Cast(*aiks_context->GetContext()); + const auto size = impeller::ISize(config.size.width, config.size.height); + + impeller::TextureDescriptor color0_tex; + color0_tex.type = impeller::TextureType::kTexture2D; + color0_tex.format = impeller::PixelFormat::kR8G8B8A8UNormInt; + color0_tex.size = size; + color0_tex.usage = static_cast( + impeller::TextureUsage::kRenderTarget); + color0_tex.sample_count = impeller::SampleCount::kCount1; + color0_tex.storage_mode = impeller::StorageMode::kDevicePrivate; + + impeller::ColorAttachment color0; + color0.texture = std::make_shared( + gl_context.GetReactor(), color0_tex, + impeller::TextureGLES::IsWrapped::kWrapped); + color0.clear_color = impeller::Color::DarkSlateGray(); + color0.load_action = impeller::LoadAction::kClear; + color0.store_action = impeller::StoreAction::kStore; + + impeller::TextureDescriptor stencil0_tex; + stencil0_tex.type = impeller::TextureType::kTexture2D; + stencil0_tex.format = impeller::PixelFormat::kR8G8B8A8UNormInt; + stencil0_tex.size = size; + stencil0_tex.usage = static_cast( + impeller::TextureUsage::kRenderTarget); + stencil0_tex.sample_count = impeller::SampleCount::kCount1; + + impeller::StencilAttachment stencil0; + stencil0.clear_stencil = 0; + stencil0.texture = std::make_shared( + gl_context.GetReactor(), stencil0_tex, + impeller::TextureGLES::IsWrapped::kWrapped); + stencil0.load_action = impeller::LoadAction::kClear; + stencil0.store_action = impeller::StoreAction::kDontCare; + + impeller::RenderTarget render_target_desc; + + render_target_desc.SetColorAttachment(color0, framebuffer->target); + render_target_desc.SetStencilAttachment(stencil0); + + return std::make_unique( + backing_store, aiks_context, + std::make_unique(std::move(render_target_desc)), + on_release); +#else + return nullptr; +#endif +} + static std::unique_ptr MakeRenderTargetFromBackingStoreImpeller( FlutterBackingStore backing_store, @@ -1111,12 +1196,19 @@ CreateEmbedderRenderTarget( break; } case kFlutterOpenGLTargetTypeFramebuffer: { - auto skia_surface = MakeSkSurfaceFromBackingStore( - context, config, &backing_store.open_gl.framebuffer); - render_target = MakeRenderTargetFromSkSurface( - backing_store, std::move(skia_surface), - collect_callback.Release()); - break; + if (enable_impeller) { + render_target = MakeRenderTargetFromBackingStoreImpeller( + backing_store, collect_callback.Release(), aiks_context, config, + &backing_store.open_gl.framebuffer); + break; + } else { + auto skia_surface = MakeSkSurfaceFromBackingStore( + context, config, &backing_store.open_gl.framebuffer); + render_target = MakeRenderTargetFromSkSurface( + backing_store, std::move(skia_surface), + collect_callback.Release()); + break; + } } } break; diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.cc b/shell/platform/embedder/embedder_surface_gl_impeller.cc new file mode 100644 index 0000000000000..4c75fc3cbce5c --- /dev/null +++ b/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -0,0 +1,178 @@ +// 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/embedder_surface_gl_impeller.h" + +#include + +#include "flutter/shell/common/shell_io_manager.h" +#include "impeller/entity/gles/entity_shaders_gles.h" +#include "impeller/renderer/backend/gles/context_gles.h" +#include "impeller/renderer/backend/gles/proc_table_gles.h" +#include "impeller/scene/shaders/gles/scene_shaders_gles.h" + +namespace flutter { + +class ReactorWorker final : public impeller::ReactorGLES::Worker { + public: + ReactorWorker() = default; + + // |ReactorGLES::Worker| + bool CanReactorReactOnCurrentThreadNow( + const impeller::ReactorGLES& reactor) const override { + impeller::ReaderLock lock(mutex_); + auto found = reactions_allowed_.find(std::this_thread::get_id()); + if (found == reactions_allowed_.end()) { + return false; + } + return found->second; + } + + void SetReactionsAllowedOnCurrentThread(bool allowed) { + impeller::WriterLock lock(mutex_); + reactions_allowed_[std::this_thread::get_id()] = allowed; + } + + private: + mutable impeller::RWMutex mutex_; + std::map reactions_allowed_ IPLR_GUARDED_BY(mutex_); + + FML_DISALLOW_COPY_AND_ASSIGN(ReactorWorker); +}; + +EmbedderSurfaceGLImpeller::EmbedderSurfaceGLImpeller( + EmbedderSurfaceGL::GLDispatchTable gl_dispatch_table, + bool fbo_reset_after_present, + std::shared_ptr external_view_embedder) + : gl_dispatch_table_(std::move(gl_dispatch_table)), + fbo_reset_after_present_(fbo_reset_after_present), + external_view_embedder_(std::move(external_view_embedder)), + worker_(std::make_shared()) { + // Make sure all required members of the dispatch table are checked. + if (!gl_dispatch_table_.gl_make_current_callback || + !gl_dispatch_table_.gl_clear_current_callback || + !gl_dispatch_table_.gl_present_callback || + !gl_dispatch_table_.gl_fbo_callback || + !gl_dispatch_table_.gl_populate_existing_damage || + !gl_dispatch_table_.gl_proc_resolver) { + // TODO: add default to gl proc resolver? + return; + } + std::vector> shader_mappings = { + std::make_shared( + impeller_entity_shaders_gles_data, + impeller_entity_shaders_gles_length), + std::make_shared( + impeller_scene_shaders_gles_data, impeller_scene_shaders_gles_length), + }; + auto gl = std::make_unique( + gl_dispatch_table_.gl_proc_resolver); + if (!gl->IsValid()) { + return; + } + + impeller_context_ = + impeller::ContextGLES::Create(std::move(gl), shader_mappings); + + if (!impeller_context_) { + FML_LOG(ERROR) << "Could not create Impeller context."; + return; + } + + auto worker_id = impeller_context_->AddReactorWorker(worker_); + if (!worker_id.has_value()) { + FML_LOG(ERROR) << "Could not add reactor worker."; + return; + } + + FML_LOG(ERROR) << "Using the Impeller rendering backend (GLES/ANGLE)."; + worker_->SetReactionsAllowedOnCurrentThread(true); + valid_ = true; +} + +EmbedderSurfaceGLImpeller::~EmbedderSurfaceGLImpeller() = default; + +// |EmbedderSurface| +bool EmbedderSurfaceGLImpeller::IsValid() const { + return valid_; +} + +// |GPUSurfaceGLDelegate| +std::unique_ptr +EmbedderSurfaceGLImpeller::GLContextMakeCurrent() { + worker_->SetReactionsAllowedOnCurrentThread(true); + return std::make_unique( + gl_dispatch_table_.gl_make_current_callback()); +} + +// |GPUSurfaceGLDelegate| +bool EmbedderSurfaceGLImpeller::GLContextClearCurrent() { + worker_->SetReactionsAllowedOnCurrentThread(false); + return gl_dispatch_table_.gl_clear_current_callback(); +} + +// |GPUSurfaceGLDelegate| +bool EmbedderSurfaceGLImpeller::GLContextPresent( + const GLPresentInfo& present_info) { + // Pass the present information to the embedder present callback. + return gl_dispatch_table_.gl_present_callback(present_info); +} + +// |GPUSurfaceGLDelegate| +GLFBOInfo EmbedderSurfaceGLImpeller::GLContextFBO( + GLFrameInfo frame_info) const { + // Get the FBO ID using the gl_fbo_callback and then get exiting damage by + // passing that ID to the gl_populate_existing_damage. + return gl_dispatch_table_.gl_populate_existing_damage( + gl_dispatch_table_.gl_fbo_callback(frame_info)); +} + +// |GPUSurfaceGLDelegate| +bool EmbedderSurfaceGLImpeller::GLContextFBOResetAfterPresent() const { + return fbo_reset_after_present_; +} + +// |GPUSurfaceGLDelegate| +SkMatrix EmbedderSurfaceGLImpeller::GLContextSurfaceTransformation() const { + auto callback = gl_dispatch_table_.gl_surface_transformation_callback; + if (!callback) { + SkMatrix matrix; + matrix.setIdentity(); + return matrix; + } + return callback(); +} + +// |GPUSurfaceGLDelegate| +EmbedderSurfaceGL::GLProcResolver EmbedderSurfaceGLImpeller::GetGLProcResolver() + const { + return gl_dispatch_table_.gl_proc_resolver; +} + +// |GPUSurfaceGLDelegate| +SurfaceFrame::FramebufferInfo +EmbedderSurfaceGLImpeller::GLContextFramebufferInfo() const { + // Enable partial repaint by default on the embedders. + auto info = SurfaceFrame::FramebufferInfo{}; + info.supports_readback = true; + info.supports_partial_repaint = + gl_dispatch_table_.gl_populate_existing_damage != nullptr; + return info; +} + +// |EmbedderSurface| +std::unique_ptr EmbedderSurfaceGLImpeller::CreateGPUSurface() { + const bool render_to_surface = !external_view_embedder_; + return std::make_unique( + this, // GPU surface GL delegate + impeller_context_ // render to surface + ); +} + +// |EmbedderSurface| +std::shared_ptr EmbedderSurfaceGLImpeller::CreateImpellerContext() const { + return impeller_context_; +} + +} // namespace flutter diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.h b/shell/platform/embedder/embedder_surface_gl_impeller.h new file mode 100644 index 0000000000000..b0dc557a923db --- /dev/null +++ b/shell/platform/embedder/embedder_surface_gl_impeller.h @@ -0,0 +1,79 @@ +// 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. + +#ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SURFACE_GL_IMPELLER_H_ +#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SURFACE_GL_IMPELLER_H_ + +#include "flutter/fml/macros.h" +#include "flutter/shell/gpu/gpu_surface_gl_impeller.h" +#include "flutter/shell/platform/embedder/embedder_external_view_embedder.h" +#include "flutter/shell/platform/embedder/embedder_surface.h" +#include "flutter/shell/platform/embedder/embedder_surface_gl.h" + +namespace impeller { +class ContextGLES; +} // namespace impeller + +namespace flutter { + +class ReactorWorker; + +class EmbedderSurfaceGLImpeller final : public EmbedderSurface, + public GPUSurfaceGLDelegate { + public: + EmbedderSurfaceGLImpeller( + EmbedderSurfaceGL::GLDispatchTable gl_dispatch_table, + bool fbo_reset_after_present, + std::shared_ptr external_view_embedder); + + ~EmbedderSurfaceGLImpeller() override; + + private: + bool valid_ = false; + EmbedderSurfaceGL::GLDispatchTable gl_dispatch_table_; + bool fbo_reset_after_present_; + std::shared_ptr impeller_context_; + std::shared_ptr worker_; + + std::shared_ptr external_view_embedder_; + + // |EmbedderSurface| + bool IsValid() const override; + + // |EmbedderSurface| + std::unique_ptr CreateGPUSurface() override; + + // |EmbedderSurface| + std::shared_ptr CreateImpellerContext() const override; + + // |GPUSurfaceGLDelegate| + std::unique_ptr GLContextMakeCurrent() override; + + // |GPUSurfaceGLDelegate| + bool GLContextClearCurrent() override; + + // |GPUSurfaceGLDelegate| + bool GLContextPresent(const GLPresentInfo& present_info) override; + + // |GPUSurfaceGLDelegate| + GLFBOInfo GLContextFBO(GLFrameInfo frame_info) const override; + + // |GPUSurfaceGLDelegate| + bool GLContextFBOResetAfterPresent() const override; + + // |GPUSurfaceGLDelegate| + SkMatrix GLContextSurfaceTransformation() const override; + + // |GPUSurfaceGLDelegate| + GLProcResolver GetGLProcResolver() const override; + + // |GPUSurfaceGLDelegate| + SurfaceFrame::FramebufferInfo GLContextFramebufferInfo() const override; + + FML_DISALLOW_COPY_AND_ASSIGN(EmbedderSurfaceGLImpeller); +}; + +} // namespace flutter + +#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SURFACE_GL_IMPELLER_H_ diff --git a/shell/platform/embedder/platform_view_embedder.cc b/shell/platform/embedder/platform_view_embedder.cc index ccbe0fc01a524..7e7ed026079f3 100644 --- a/shell/platform/embedder/platform_view_embedder.cc +++ b/shell/platform/embedder/platform_view_embedder.cc @@ -66,16 +66,12 @@ PlatformViewEmbedder::PlatformViewEmbedder( PlatformViewEmbedder::PlatformViewEmbedder( PlatformView::Delegate& delegate, const flutter::TaskRunners& task_runners, - const EmbedderSurfaceGL::GLDispatchTable& gl_dispatch_table, - bool fbo_reset_after_present, + std::unique_ptr embedder_surface, PlatformDispatchTable platform_dispatch_table, std::shared_ptr external_view_embedder) : PlatformView(delegate, task_runners), external_view_embedder_(std::move(external_view_embedder)), - embedder_surface_( - std::make_unique(gl_dispatch_table, - fbo_reset_after_present, - external_view_embedder_)), + embedder_surface_(std::move(embedder_surface)), platform_message_handler_(new EmbedderPlatformMessageHandler( GetWeakPtr(), task_runners.GetPlatformTaskRunner())), diff --git a/shell/platform/embedder/platform_view_embedder.h b/shell/platform/embedder/platform_view_embedder.h index 87378b5074672..f6b554635319c 100644 --- a/shell/platform/embedder/platform_view_embedder.h +++ b/shell/platform/embedder/platform_view_embedder.h @@ -16,6 +16,7 @@ #include "flutter/shell/platform/embedder/vsync_waiter_embedder.h" #ifdef SHELL_ENABLE_GL +#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" #include "flutter/shell/platform/embedder/embedder_surface_gl.h" #endif @@ -65,8 +66,7 @@ class PlatformViewEmbedder final : public PlatformView { PlatformViewEmbedder( PlatformView::Delegate& delegate, const flutter::TaskRunners& task_runners, - const EmbedderSurfaceGL::GLDispatchTable& gl_dispatch_table, - bool fbo_reset_after_present, + std::unique_ptr embedder_surface, PlatformDispatchTable platform_dispatch_table, std::shared_ptr external_view_embedder); #endif diff --git a/shell/platform/windows/angle_surface_manager.cc b/shell/platform/windows/angle_surface_manager.cc index 18d21f6b425b9..6ff3a9454bd43 100644 --- a/shell/platform/windows/angle_surface_manager.cc +++ b/shell/platform/windows/angle_surface_manager.cc @@ -67,13 +67,10 @@ bool AngleSurfaceManager::InitializeEGL( } bool AngleSurfaceManager::Initialize() { - // TODO(dnfield): Enable MSAA here, see similar code in android_context_gl.cc - // Will need to plumb in argument from project bundle for sampling rate. - // https://github.com/flutter/flutter/issues/100392 const EGLint config_attributes[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8, - EGL_NONE}; + EGL_SAMPLES, 4}; const EGLint display_context_attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; diff --git a/shell/platform/windows/angle_surface_manager.h b/shell/platform/windows/angle_surface_manager.h index edfe7a8cbcd95..166ac25d83bb1 100644 --- a/shell/platform/windows/angle_surface_manager.h +++ b/shell/platform/windows/angle_surface_manager.h @@ -28,6 +28,7 @@ namespace flutter { class AngleSurfaceManager { public: static std::unique_ptr Create(); + virtual ~AngleSurfaceManager(); // Creates an EGLSurface wrapper and backing DirectX 11 SwapChain From 24fca1c006b5569a7b2d95b6f04bd820c6e650a5 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 3 Jul 2023 15:51:19 -0700 Subject: [PATCH 02/29] ++ --- shell/platform/embedder/embedder_surface_gl_impeller.cc | 2 +- shell/platform/windows/angle_surface_manager.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.cc b/shell/platform/embedder/embedder_surface_gl_impeller.cc index 4c75fc3cbce5c..fe040041d3398 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.cc +++ b/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -49,6 +49,7 @@ EmbedderSurfaceGLImpeller::EmbedderSurfaceGLImpeller( fbo_reset_after_present_(fbo_reset_after_present), external_view_embedder_(std::move(external_view_embedder)), worker_(std::make_shared()) { + worker_->SetReactionsAllowedOnCurrentThread(true); // Make sure all required members of the dispatch table are checked. if (!gl_dispatch_table_.gl_make_current_callback || !gl_dispatch_table_.gl_clear_current_callback || @@ -87,7 +88,6 @@ EmbedderSurfaceGLImpeller::EmbedderSurfaceGLImpeller( } FML_LOG(ERROR) << "Using the Impeller rendering backend (GLES/ANGLE)."; - worker_->SetReactionsAllowedOnCurrentThread(true); valid_ = true; } diff --git a/shell/platform/windows/angle_surface_manager.cc b/shell/platform/windows/angle_surface_manager.cc index 6ff3a9454bd43..1e32528d51c34 100644 --- a/shell/platform/windows/angle_surface_manager.cc +++ b/shell/platform/windows/angle_surface_manager.cc @@ -70,7 +70,7 @@ bool AngleSurfaceManager::Initialize() { const EGLint config_attributes[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8, - EGL_SAMPLES, 4}; + EGL_NONE}; const EGLint display_context_attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; From b3d8c6c8fe785b1491e940ac7255a8275d03a31b Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 3 Jul 2023 15:57:46 -0700 Subject: [PATCH 03/29] + --- shell/platform/windows/angle_surface_manager.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shell/platform/windows/angle_surface_manager.cc b/shell/platform/windows/angle_surface_manager.cc index 1e32528d51c34..cea930e94d3dc 100644 --- a/shell/platform/windows/angle_surface_manager.cc +++ b/shell/platform/windows/angle_surface_manager.cc @@ -67,10 +67,10 @@ bool AngleSurfaceManager::InitializeEGL( } bool AngleSurfaceManager::Initialize() { - const EGLint config_attributes[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, - EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8, - EGL_NONE}; + const EGLint config_attributes[] = { + EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8, + EGL_SAMPLE_BUFFERS, 1, EGL_SAMPLES, 4, EGL_NONE}; const EGLint display_context_attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; From f6cc6261612bec4e08487e77225897e3fcbb5357 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 4 Jul 2023 23:56:32 -0700 Subject: [PATCH 04/29] ++ --- .../renderer/backend/gles/render_pass_gles.cc | 38 +++++++++---------- .../platform/windows/angle_surface_manager.cc | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/impeller/renderer/backend/gles/render_pass_gles.cc b/impeller/renderer/backend/gles/render_pass_gles.cc index 422ab1fc5932c..c44e518bd50aa 100644 --- a/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/impeller/renderer/backend/gles/render_pass_gles.cc @@ -450,25 +450,25 @@ struct RenderPassData { } } - if (gl.DiscardFramebufferEXT.IsAvailable()) { - std::vector attachments; - if (pass_data.discard_color_attachment) { - attachments.push_back(is_default_fbo ? GL_COLOR_EXT - : GL_COLOR_ATTACHMENT0); - } - if (pass_data.discard_depth_attachment) { - attachments.push_back(is_default_fbo ? GL_DEPTH_EXT - : GL_DEPTH_ATTACHMENT); - } - if (pass_data.discard_stencil_attachment) { - attachments.push_back(is_default_fbo ? GL_STENCIL_EXT - : GL_STENCIL_ATTACHMENT); - } - gl.DiscardFramebufferEXT(GL_FRAMEBUFFER, // target - attachments.size(), // attachments to discard - attachments.data() // size - ); - } + // if (gl.DiscardFramebufferEXT.IsAvailable()) { + // std::vector attachments; + // if (pass_data.discard_color_attachment) { + // attachments.push_back(is_default_fbo ? GL_COLOR_EXT + // : GL_COLOR_ATTACHMENT0); + // } + // if (pass_data.discard_depth_attachment) { + // attachments.push_back(is_default_fbo ? GL_DEPTH_EXT + // : GL_DEPTH_ATTACHMENT); + // } + // if (pass_data.discard_stencil_attachment) { + // attachments.push_back(is_default_fbo ? GL_STENCIL_EXT + // : GL_STENCIL_ATTACHMENT); + // } + // gl.DiscardFramebufferEXT(GL_FRAMEBUFFER, // target + // attachments.size(), // attachments to discard + // attachments.data() // size + // ); + // } return true; } diff --git a/shell/platform/windows/angle_surface_manager.cc b/shell/platform/windows/angle_surface_manager.cc index cea930e94d3dc..ddbb40781ab29 100644 --- a/shell/platform/windows/angle_surface_manager.cc +++ b/shell/platform/windows/angle_surface_manager.cc @@ -69,7 +69,7 @@ bool AngleSurfaceManager::InitializeEGL( bool AngleSurfaceManager::Initialize() { const EGLint config_attributes[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, - EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8, + EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 0, EGL_STENCIL_SIZE, 8, EGL_SAMPLE_BUFFERS, 1, EGL_SAMPLES, 4, EGL_NONE}; const EGLint display_context_attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, From e7c5f3484215d0f34c788c0ea974fb5c083fe1a5 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 5 Jul 2023 17:45:15 -0700 Subject: [PATCH 05/29] ++ --- .../renderer/backend/gles/render_pass_gles.cc | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/impeller/renderer/backend/gles/render_pass_gles.cc b/impeller/renderer/backend/gles/render_pass_gles.cc index c44e518bd50aa..dd986042f300b 100644 --- a/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/impeller/renderer/backend/gles/render_pass_gles.cc @@ -450,25 +450,34 @@ struct RenderPassData { } } - // if (gl.DiscardFramebufferEXT.IsAvailable()) { - // std::vector attachments; - // if (pass_data.discard_color_attachment) { - // attachments.push_back(is_default_fbo ? GL_COLOR_EXT - // : GL_COLOR_ATTACHMENT0); - // } - // if (pass_data.discard_depth_attachment) { - // attachments.push_back(is_default_fbo ? GL_DEPTH_EXT - // : GL_DEPTH_ATTACHMENT); - // } - // if (pass_data.discard_stencil_attachment) { - // attachments.push_back(is_default_fbo ? GL_STENCIL_EXT - // : GL_STENCIL_ATTACHMENT); - // } - // gl.DiscardFramebufferEXT(GL_FRAMEBUFFER, // target - // attachments.size(), // attachments to discard - // attachments.data() // size - // ); - // } + if (gl.DiscardFramebufferEXT.IsAvailable()) { + std::vector attachments; + + if (pass_data.discard_color_attachment) { + attachments.push_back(is_default_fbo ? GL_COLOR_EXT + : GL_COLOR_ATTACHMENT0); + } + if (pass_data.discard_depth_attachment) { + attachments.push_back(is_default_fbo ? GL_DEPTH_EXT + : GL_DEPTH_ATTACHMENT); + } + +// TODO(jonahwilliams): discarding the stencil on the default fbo when running +// on Windows. Causes Angle to discard the entire render target. Until we know +// the reason, default to storing. +#ifdef FML_OS_WIN + if (pass_data.discard_stencil_attachment && !is_default_fbo) { +#else + if (pass_data.discard_stencil_attachment) { +#endif + attachments.push_back(is_default_fbo ? GL_STENCIL_EXT + : GL_STENCIL_ATTACHMENT); + } + gl.DiscardFramebufferEXT(GL_FRAMEBUFFER, // target + attachments.size(), // attachments to discard + attachments.data() // size + ); + } return true; } From a52ea8eab1befb116f6fe9b147e9f6f998a4698e Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 5 Jul 2023 18:12:17 -0700 Subject: [PATCH 06/29] fix order. --- shell/platform/embedder/embedder_surface_gl_impeller.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.h b/shell/platform/embedder/embedder_surface_gl_impeller.h index b0dc557a923db..8e5e48340f6ff 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.h +++ b/shell/platform/embedder/embedder_surface_gl_impeller.h @@ -34,9 +34,8 @@ class EmbedderSurfaceGLImpeller final : public EmbedderSurface, EmbedderSurfaceGL::GLDispatchTable gl_dispatch_table_; bool fbo_reset_after_present_; std::shared_ptr impeller_context_; - std::shared_ptr worker_; - std::shared_ptr external_view_embedder_; + std::shared_ptr worker_; // |EmbedderSurface| bool IsValid() const override; From cbe84727b8138278ccb59a43eecebebcd39a2d56 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 6 Jul 2023 10:18:00 -0700 Subject: [PATCH 07/29] ++ --- .../embedder/embedder_surface_gl_impeller.cc | 22 ++++++++++++++++++- .../embedder/embedder_surface_gl_impeller.h | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.cc b/shell/platform/embedder/embedder_surface_gl_impeller.cc index fe040041d3398..245674d4e5625 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.cc +++ b/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -11,6 +11,7 @@ #include "impeller/renderer/backend/gles/context_gles.h" #include "impeller/renderer/backend/gles/proc_table_gles.h" #include "impeller/scene/shaders/gles/scene_shaders_gles.h" +#include "flutter/shell/common/shell_io_manager.h" namespace flutter { @@ -171,8 +172,27 @@ std::unique_ptr EmbedderSurfaceGLImpeller::CreateGPUSurface() { } // |EmbedderSurface| -std::shared_ptr EmbedderSurfaceGLImpeller::CreateImpellerContext() const { +std::shared_ptr +EmbedderSurfaceGLImpeller::CreateImpellerContext() const { return impeller_context_; } +// |EmbedderSurface| +sk_sp EmbedderSurfaceGLImpeller::CreateResourceContext() + const { + sk_sp resource_context; + if (gl_dispatch_table_.gl_make_resource_current_callback()) { + worker_->SetReactionsAllowedOnCurrentThread(true); + // TODO(chinmaygarde): Currently, this code depends on the fact that only + // the OpenGL surface will be able to make a resource context current. If + // this changes, this assumption breaks. Handle the same. + resource_context = ShellIOManager::CreateCompatibleResourceLoadingContext( + GrBackend::kOpenGL_GrBackend, + GPUSurfaceGLDelegate::GetDefaultPlatformGLInterface()); + } else { + FML_DLOG(ERROR) << "Could not make the resource context current."; + } + return resource_context; +} + } // namespace flutter diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.h b/shell/platform/embedder/embedder_surface_gl_impeller.h index 8e5e48340f6ff..6d19272102bf3 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.h +++ b/shell/platform/embedder/embedder_surface_gl_impeller.h @@ -70,6 +70,9 @@ class EmbedderSurfaceGLImpeller final : public EmbedderSurface, // |GPUSurfaceGLDelegate| SurfaceFrame::FramebufferInfo GLContextFramebufferInfo() const override; + // |EmbedderSurface| + sk_sp CreateResourceContext() const override; + FML_DISALLOW_COPY_AND_ASSIGN(EmbedderSurfaceGLImpeller); }; From fbd4baeb6e7d4c3704cc5ffee428e68027f529e1 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 6 Jul 2023 11:49:37 -0700 Subject: [PATCH 08/29] formatting --- shell/platform/embedder/BUILD.gn | 1 - shell/platform/embedder/embedder_surface_gl_impeller.cc | 1 - shell/platform/embedder/platform_view_embedder.h | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index 424219e54c903..eb37108dc6d71 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -111,7 +111,6 @@ template("embedder_source_set") { "//third_party/skia", ] - if (embedder_enable_gl) { sources += [ "embedder_external_texture_gl.cc", diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.cc b/shell/platform/embedder/embedder_surface_gl_impeller.cc index 245674d4e5625..2a9f83562d14c 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.cc +++ b/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -11,7 +11,6 @@ #include "impeller/renderer/backend/gles/context_gles.h" #include "impeller/renderer/backend/gles/proc_table_gles.h" #include "impeller/scene/shaders/gles/scene_shaders_gles.h" -#include "flutter/shell/common/shell_io_manager.h" namespace flutter { diff --git a/shell/platform/embedder/platform_view_embedder.h b/shell/platform/embedder/platform_view_embedder.h index f6b554635319c..896e11a7101c6 100644 --- a/shell/platform/embedder/platform_view_embedder.h +++ b/shell/platform/embedder/platform_view_embedder.h @@ -16,8 +16,8 @@ #include "flutter/shell/platform/embedder/vsync_waiter_embedder.h" #ifdef SHELL_ENABLE_GL -#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" #include "flutter/shell/platform/embedder/embedder_surface_gl.h" +#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" #endif #ifdef SHELL_ENABLE_METAL From 26bc6076799c3f2b570de01364e951e8ca2a66b0 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Sun, 9 Jul 2023 16:40:48 -0700 Subject: [PATCH 09/29] fix window resize --- shell/gpu/gpu_surface_gl_impeller.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shell/gpu/gpu_surface_gl_impeller.cc b/shell/gpu/gpu_surface_gl_impeller.cc index a3e4cc4a49dcf..3b6777042eaa7 100644 --- a/shell/gpu/gpu_surface_gl_impeller.cc +++ b/shell/gpu/gpu_surface_gl_impeller.cc @@ -80,10 +80,14 @@ std::unique_ptr GPUSurfaceGLImpeller::AcquireFrame( return nullptr; } + GLFrameInfo frame_info = {static_cast(size.width()), + static_cast(size.height())}; + const GLFBOInfo fbo_info = delegate_->GLContextFBO(frame_info); + auto surface = impeller::SurfaceGLES::WrapFBO( impeller_context_, // context swap_callback, // swap_callback - 0u, // fbo + fbo_info.fbo_id, // fbo impeller::PixelFormat::kR8G8B8A8UNormInt, // color_format impeller::ISize{size.width(), size.height()} // fbo_size ); From f260393e49c5cba8c925cd44835e743818ffec71 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Sun, 9 Jul 2023 17:08:39 -0700 Subject: [PATCH 10/29] configure windows engine based on impeller usage. --- .../embedder/embedder_surface_gl_impeller.cc | 2 +- .../platform/windows/angle_surface_manager.cc | 47 ++++++++++++++----- .../platform/windows/angle_surface_manager.h | 6 +-- .../windows/flutter_windows_engine.cc | 21 +++++++-- .../platform/windows/flutter_windows_engine.h | 2 + .../windows/flutter_windows_view_unittests.cc | 2 +- 6 files changed, 60 insertions(+), 20 deletions(-) diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.cc b/shell/platform/embedder/embedder_surface_gl_impeller.cc index 2a9f83562d14c..df42f508900b9 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.cc +++ b/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -87,7 +87,7 @@ EmbedderSurfaceGLImpeller::EmbedderSurfaceGLImpeller( return; } - FML_LOG(ERROR) << "Using the Impeller rendering backend (GLES/ANGLE)."; + FML_LOG(ERROR) << "Using the Impeller rendering backend (OpenGL)."; valid_ = true; } diff --git a/shell/platform/windows/angle_surface_manager.cc b/shell/platform/windows/angle_surface_manager.cc index ddbb40781ab29..7deafc2d0bf8c 100644 --- a/shell/platform/windows/angle_surface_manager.cc +++ b/shell/platform/windows/angle_surface_manager.cc @@ -20,20 +20,21 @@ namespace flutter { int AngleSurfaceManager::instance_count_ = 0; -std::unique_ptr AngleSurfaceManager::Create() { +std::unique_ptr AngleSurfaceManager::Create( + bool enable_impeller) { std::unique_ptr manager; - manager.reset(new AngleSurfaceManager()); + manager.reset(new AngleSurfaceManager(enable_impeller)); if (!manager->initialize_succeeded_) { return nullptr; } return std::move(manager); } -AngleSurfaceManager::AngleSurfaceManager() +AngleSurfaceManager::AngleSurfaceManager(bool enable_impeller) : egl_config_(nullptr), egl_display_(EGL_NO_DISPLAY), egl_context_(EGL_NO_CONTEXT) { - initialize_succeeded_ = Initialize(); + initialize_succeeded_ = Initialize(enable_impeller); ++instance_count_; } @@ -66,11 +67,20 @@ bool AngleSurfaceManager::InitializeEGL( return true; } -bool AngleSurfaceManager::Initialize() { - const EGLint config_attributes[] = { +bool AngleSurfaceManager::Initialize(bool enable_impeller) { + const EGLint config_attributes[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, + EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8, + EGL_NONE}; + + const EGLint impeller_config_attributes[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 0, EGL_STENCIL_SIZE, 8, EGL_SAMPLE_BUFFERS, 1, EGL_SAMPLES, 4, EGL_NONE}; + const EGLint impeller_config_attributes_no_msaa[] = { + EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 0, EGL_STENCIL_SIZE, 8, + EGL_NONE}; const EGLint display_context_attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; @@ -144,11 +154,26 @@ bool AngleSurfaceManager::Initialize() { } EGLint numConfigs = 0; - if ((eglChooseConfig(egl_display_, config_attributes, &egl_config_, 1, - &numConfigs) == EGL_FALSE) || - (numConfigs == 0)) { - LogEglError("Failed to choose first context"); - return false; + if (enable_impeller) { + // First try the MSAA configuration. + if ((eglChooseConfig(egl_display_, impeller_config_attributes, &egl_config_, + 1, &numConfigs) == EGL_FALSE) || + (numConfigs == 0)) { + // Next fall back to disabled MSAA. + if ((eglChooseConfig(egl_display_, impeller_config_attributes_no_msaa, + &egl_config_, 1, &numConfigs) == EGL_FALSE) || + (numConfigs == 0)) { + LogEglError("Failed to choose first context"); + return false; + } + } + } else { + if ((eglChooseConfig(egl_display_, config_attributes, &egl_config_, 1, + &numConfigs) == EGL_FALSE) || + (numConfigs == 0)) { + LogEglError("Failed to choose first context"); + return false; + } } egl_context_ = eglCreateContext(egl_display_, egl_config_, EGL_NO_CONTEXT, diff --git a/shell/platform/windows/angle_surface_manager.h b/shell/platform/windows/angle_surface_manager.h index 166ac25d83bb1..576704f630054 100644 --- a/shell/platform/windows/angle_surface_manager.h +++ b/shell/platform/windows/angle_surface_manager.h @@ -27,7 +27,7 @@ namespace flutter { // destroy surfaces class AngleSurfaceManager { public: - static std::unique_ptr Create(); + static std::unique_ptr Create(bool enable_impeller); virtual ~AngleSurfaceManager(); @@ -89,10 +89,10 @@ class AngleSurfaceManager { protected: // Creates a new surface manager retaining reference to the passed-in target // for the lifetime of the manager. - AngleSurfaceManager(); + explicit AngleSurfaceManager(bool enable_impeller); private: - bool Initialize(); + bool Initialize(bool enable_impeller); void CleanUp(); // Attempts to initialize EGL using ANGLE. diff --git a/shell/platform/windows/flutter_windows_engine.cc b/shell/platform/windows/flutter_windows_engine.cc index 3dd00d422ae0f..a535afe8edea4 100644 --- a/shell/platform/windows/flutter_windows_engine.cc +++ b/shell/platform/windows/flutter_windows_engine.cc @@ -199,7 +199,13 @@ FlutterWindowsEngine::FlutterWindowsEngine(const FlutterProjectBundle& project) FlutterWindowsTextureRegistrar::ResolveGlFunctions(gl_procs_); texture_registrar_ = std::make_unique(this, gl_procs_); - surface_manager_ = AngleSurfaceManager::Create(); + + // Check for impeller support. + auto& switches = project_->GetSwitches(); + enable_impeller_ = std::find(switches.begin(), switches.end(), + "--enable-impeller=true") != switches.end(); + + surface_manager_ = AngleSurfaceManager::Create(enable_impeller_); window_proc_delegate_manager_ = std::make_unique(); window_proc_delegate_manager_->RegisterTopLevelWindowProcDelegate( [](HWND hwnd, UINT msg, WPARAM wpar, LPARAM lpar, void* user_data, @@ -369,9 +375,16 @@ bool FlutterWindowsEngine::Run(std::string_view entrypoint) { args.aot_data = aot_data_.get(); } - FlutterRendererConfig renderer_config = surface_manager_ - ? GetOpenGLRendererConfig() - : GetSoftwareRendererConfig(); + FlutterRendererConfig renderer_config; + + if (enable_impeller_) { + // Impeller does not support a Software backend. Avoid failling back and + // confusing the engine on which renderer is selected. + renderer_config = GetOpenGLRendererConfig(); + } else { + renderer_config = surface_manager_ ? GetOpenGLRendererConfig() + : GetSoftwareRendererConfig(); + } auto result = embedder_api_.Run(FLUTTER_ENGINE_VERSION, &renderer_config, &args, this, &engine_); diff --git a/shell/platform/windows/flutter_windows_engine.h b/shell/platform/windows/flutter_windows_engine.h index 01f371d0a4fee..29a904d3506b4 100644 --- a/shell/platform/windows/flutter_windows_engine.h +++ b/shell/platform/windows/flutter_windows_engine.h @@ -391,6 +391,8 @@ class FlutterWindowsEngine { bool high_contrast_enabled_ = false; + bool enable_impeller_ = false; + // The manager for WindowProc delegate registration and callbacks. std::unique_ptr window_proc_delegate_manager_; diff --git a/shell/platform/windows/flutter_windows_view_unittests.cc b/shell/platform/windows/flutter_windows_view_unittests.cc index 89082dd46cba1..2d5dfd71409d1 100644 --- a/shell/platform/windows/flutter_windows_view_unittests.cc +++ b/shell/platform/windows/flutter_windows_view_unittests.cc @@ -118,7 +118,7 @@ class MockFlutterWindowsEngine : public FlutterWindowsEngine { class MockAngleSurfaceManager : public AngleSurfaceManager { public: - MockAngleSurfaceManager() {} + MockAngleSurfaceManager() : AngleSurfaceManager(false) {} MOCK_METHOD4(CreateSurface, bool(WindowsRenderTarget*, EGLint, EGLint, bool)); MOCK_METHOD4(ResizeSurface, void(WindowsRenderTarget*, EGLint, EGLint, bool)); From e35a5bf2b89dc738d58916a581581ec49904253d Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Sun, 9 Jul 2023 17:47:48 -0700 Subject: [PATCH 11/29] ++ --- ci/licenses_golden/licenses_flutter | 4 ++++ shell/platform/embedder/embedder_surface_gl_impeller.cc | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index e10837251648e..4bf2364a2dd22 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -2822,6 +2822,8 @@ ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface.cc + ../../../ ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl_impeller.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal.mm + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal_impeller.h + ../../../flutter/LICENSE @@ -5522,6 +5524,8 @@ FILE: ../../../flutter/shell/platform/embedder/embedder_surface.cc FILE: ../../../flutter/shell/platform/embedder/embedder_surface.h FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl.cc FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl.h +FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc +FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl_impeller.h FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal.h FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal.mm FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal_impeller.h diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.cc b/shell/platform/embedder/embedder_surface_gl_impeller.cc index df42f508900b9..0a4194e6cd7a8 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.cc +++ b/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -57,7 +57,6 @@ EmbedderSurfaceGLImpeller::EmbedderSurfaceGLImpeller( !gl_dispatch_table_.gl_fbo_callback || !gl_dispatch_table_.gl_populate_existing_damage || !gl_dispatch_table_.gl_proc_resolver) { - // TODO: add default to gl proc resolver? return; } std::vector> shader_mappings = { @@ -163,7 +162,6 @@ EmbedderSurfaceGLImpeller::GLContextFramebufferInfo() const { // |EmbedderSurface| std::unique_ptr EmbedderSurfaceGLImpeller::CreateGPUSurface() { - const bool render_to_surface = !external_view_embedder_; return std::make_unique( this, // GPU surface GL delegate impeller_context_ // render to surface From a08c2221bf6eba63ef3c6c11a4002ae3f44dc066 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Tue, 11 Jul 2023 12:25:41 -0700 Subject: [PATCH 12/29] try this for testing. --- .../windows/flutter_windows_engine.cc | 7 +++- .../flutter_windows_engine_unittests.cc | 35 +++++++++++++++++++ .../testing/flutter_windows_engine_builder.cc | 5 +++ .../testing/flutter_windows_engine_builder.h | 3 ++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/shell/platform/windows/flutter_windows_engine.cc b/shell/platform/windows/flutter_windows_engine.cc index a535afe8edea4..005950f0efcc3 100644 --- a/shell/platform/windows/flutter_windows_engine.cc +++ b/shell/platform/windows/flutter_windows_engine.cc @@ -378,7 +378,12 @@ bool FlutterWindowsEngine::Run(std::string_view entrypoint) { FlutterRendererConfig renderer_config; if (enable_impeller_) { - // Impeller does not support a Software backend. Avoid failling back and + if (!surface_manager_) { + FML_LOG(ERROR) << "Could not create surface manager. Impeller backend " + "does not support software rendering."; + return false; + } + // Impeller does not support a Software backend. Avoid falling back and // confusing the engine on which renderer is selected. renderer_config = GetOpenGLRendererConfig(); } else { diff --git a/shell/platform/windows/flutter_windows_engine_unittests.cc b/shell/platform/windows/flutter_windows_engine_unittests.cc index d518e7f9c1f66..f7824a380f452 100644 --- a/shell/platform/windows/flutter_windows_engine_unittests.cc +++ b/shell/platform/windows/flutter_windows_engine_unittests.cc @@ -223,6 +223,41 @@ TEST_F(FlutterWindowsEngineTest, RunWithoutANGLEUsesSoftware) { modifier.embedder_api().Shutdown = [](auto engine) { return kSuccess; }; } +TEST_F(FlutterWindowsEngineTest, RunWithoutANGLEOnImpellerFailsToStart) { + FlutterWindowsEngineBuilder builder{GetContext()}; + builder.SetSwitches({"--enable-impeller"}); + std::unique_ptr engine = builder.Build(); + EngineModifier modifier(engine.get()); + + modifier.embedder_api().NotifyDisplayUpdate = + MOCK_ENGINE_PROC(NotifyDisplayUpdate, + ([engine_instance = engine.get()]( + FLUTTER_API_SYMBOL(FlutterEngine) raw_engine, + const FlutterEngineDisplaysUpdateType update_type, + const FlutterEngineDisplay* embedder_displays, + size_t display_count) { return kSuccess; })); + + // Accessibility updates must do nothing when the embedder engine is mocked + modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC( + UpdateAccessibilityFeatures, + [](FLUTTER_API_SYMBOL(FlutterEngine) engine, + FlutterAccessibilityFeature flags) { return kSuccess; }); + + // Stub out UpdateLocales and SendPlatformMessage as we don't have a fully + // initialized engine instance. + modifier.embedder_api().UpdateLocales = MOCK_ENGINE_PROC( + UpdateLocales, ([](auto engine, const FlutterLocale** locales, + size_t locales_count) { return kSuccess; })); + modifier.embedder_api().SendPlatformMessage = + MOCK_ENGINE_PROC(SendPlatformMessage, + ([](auto engine, auto message) { return kSuccess; })); + + // Set the AngleSurfaceManager to nullptr to test software fallback path. + modifier.SetSurfaceManager(nullptr); + + EXPECT_FALSE(engine->Run()); +} + TEST_F(FlutterWindowsEngineTest, SendPlatformMessageWithoutResponse) { FlutterWindowsEngineBuilder builder{GetContext()}; std::unique_ptr engine = builder.Build(); diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.cc b/shell/platform/windows/testing/flutter_windows_engine_builder.cc index d4f8086c89609..00a2aa44b4b27 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.cc +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.cc @@ -62,6 +62,10 @@ void FlutterWindowsEngineBuilder::AddDartEntrypointArgument(std::string arg) { dart_entrypoint_arguments_.emplace_back(std::move(arg)); } +void FlutterWindowsEngineBuilder::SetSwitches(std::vector switches) { + switches_ = std::move(switches); +} + void FlutterWindowsEngineBuilder::SetCreateKeyboardHandlerCallbacks( KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state, KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan) { @@ -86,6 +90,7 @@ std::unique_ptr FlutterWindowsEngineBuilder::Build() { } FlutterProjectBundle project(properties_); + project.SetSwitches(switches_); return std::make_unique(project, get_key_state_, map_vk_to_scan_); diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.h b/shell/platform/windows/testing/flutter_windows_engine_builder.h index ce3648a82a005..e17d3c794227e 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.h +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.h @@ -29,6 +29,8 @@ class FlutterWindowsEngineBuilder { KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state, KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan); + void SetSwitches(std::vector switches); + std::unique_ptr Build(); private: @@ -36,6 +38,7 @@ class FlutterWindowsEngineBuilder { FlutterDesktopEngineProperties properties_ = {}; std::string dart_entrypoint_; std::vector dart_entrypoint_arguments_; + std::vector switches_; KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state_; KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan_; From 8ce0237b14f986b0c9c0e78ff5adbf79864e107e Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Tue, 11 Jul 2023 12:27:18 -0700 Subject: [PATCH 13/29] ++ --- .../platform/windows/testing/flutter_windows_engine_builder.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.cc b/shell/platform/windows/testing/flutter_windows_engine_builder.cc index 00a2aa44b4b27..9b8f6e4053dbc 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.cc +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.cc @@ -62,7 +62,8 @@ void FlutterWindowsEngineBuilder::AddDartEntrypointArgument(std::string arg) { dart_entrypoint_arguments_.emplace_back(std::move(arg)); } -void FlutterWindowsEngineBuilder::SetSwitches(std::vector switches) { +void FlutterWindowsEngineBuilder::SetSwitches( + std::vector switches) { switches_ = std::move(switches); } From efa76a90fc6701c6386ffcb92dcd102527c36274 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 11 Jul 2023 16:45:31 -0700 Subject: [PATCH 14/29] ++ --- .../flutter_windows_engine_unittests.cc | 26 ++++++++++++++++++- .../testing/flutter_windows_engine_builder.cc | 1 - .../testing/flutter_windows_engine_builder.h | 3 --- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/shell/platform/windows/flutter_windows_engine_unittests.cc b/shell/platform/windows/flutter_windows_engine_unittests.cc index f7824a380f452..23ab05c5ebe07 100644 --- a/shell/platform/windows/flutter_windows_engine_unittests.cc +++ b/shell/platform/windows/flutter_windows_engine_unittests.cc @@ -5,6 +5,7 @@ #include "flutter/shell/platform/windows/flutter_windows_engine.h" #include "flutter/fml/macros.h" +#include "flutter/shell/platform/common/engine_switches.h" #include "flutter/shell/platform/embedder/embedder.h" #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h" #include "flutter/shell/platform/windows/flutter_windows_view.h" @@ -25,6 +26,26 @@ namespace flutter { namespace testing { +namespace { +// Sets |key=value| in the environment of this process. +void SetEnvironmentVariable(const char* key, const char* value) { +#ifdef _WIN32 + _putenv_s(key, value); +#else + setenv(key, value, 1); +#endif +} + +// Removes |key| from the environment of this process, if present. +void ClearEnvironmentVariable(const char* key) { +#ifdef _WIN32 + _putenv_s(key, ""); +#else + unsetenv(key); +#endif +} +} // namespace + class FlutterWindowsEngineTest : public WindowsTest {}; TEST_F(FlutterWindowsEngineTest, RunDoesExpectedInitialization) { @@ -224,8 +245,10 @@ TEST_F(FlutterWindowsEngineTest, RunWithoutANGLEUsesSoftware) { } TEST_F(FlutterWindowsEngineTest, RunWithoutANGLEOnImpellerFailsToStart) { + SetEnvironmentVariable("FLUTTER_ENGINE_SWITCHES", "1"); + SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_1", "enable-impeller=true"); + FlutterWindowsEngineBuilder builder{GetContext()}; - builder.SetSwitches({"--enable-impeller"}); std::unique_ptr engine = builder.Build(); EngineModifier modifier(engine.get()); @@ -255,6 +278,7 @@ TEST_F(FlutterWindowsEngineTest, RunWithoutANGLEOnImpellerFailsToStart) { // Set the AngleSurfaceManager to nullptr to test software fallback path. modifier.SetSurfaceManager(nullptr); + ClearEnvironmentVariable("FLUTTER_ENGINE_SWITCHES"); EXPECT_FALSE(engine->Run()); } diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.cc b/shell/platform/windows/testing/flutter_windows_engine_builder.cc index 9b8f6e4053dbc..beebd7e66209d 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.cc +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.cc @@ -91,7 +91,6 @@ std::unique_ptr FlutterWindowsEngineBuilder::Build() { } FlutterProjectBundle project(properties_); - project.SetSwitches(switches_); return std::make_unique(project, get_key_state_, map_vk_to_scan_); diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.h b/shell/platform/windows/testing/flutter_windows_engine_builder.h index e17d3c794227e..ce3648a82a005 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.h +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.h @@ -29,8 +29,6 @@ class FlutterWindowsEngineBuilder { KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state, KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan); - void SetSwitches(std::vector switches); - std::unique_ptr Build(); private: @@ -38,7 +36,6 @@ class FlutterWindowsEngineBuilder { FlutterDesktopEngineProperties properties_ = {}; std::string dart_entrypoint_; std::vector dart_entrypoint_arguments_; - std::vector switches_; KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state_; KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan_; From 578a9658fb2c85353f92eb4ae4d9d3e2edc3d317 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 11 Jul 2023 16:53:11 -0700 Subject: [PATCH 15/29] ++ --- shell/platform/windows/flutter_windows_engine_unittests.cc | 1 - .../windows/testing/flutter_windows_engine_builder.cc | 5 ----- 2 files changed, 6 deletions(-) diff --git a/shell/platform/windows/flutter_windows_engine_unittests.cc b/shell/platform/windows/flutter_windows_engine_unittests.cc index 23ab05c5ebe07..b0cc688075ab3 100644 --- a/shell/platform/windows/flutter_windows_engine_unittests.cc +++ b/shell/platform/windows/flutter_windows_engine_unittests.cc @@ -5,7 +5,6 @@ #include "flutter/shell/platform/windows/flutter_windows_engine.h" #include "flutter/fml/macros.h" -#include "flutter/shell/platform/common/engine_switches.h" #include "flutter/shell/platform/embedder/embedder.h" #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h" #include "flutter/shell/platform/windows/flutter_windows_view.h" diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.cc b/shell/platform/windows/testing/flutter_windows_engine_builder.cc index beebd7e66209d..d4f8086c89609 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.cc +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.cc @@ -62,11 +62,6 @@ void FlutterWindowsEngineBuilder::AddDartEntrypointArgument(std::string arg) { dart_entrypoint_arguments_.emplace_back(std::move(arg)); } -void FlutterWindowsEngineBuilder::SetSwitches( - std::vector switches) { - switches_ = std::move(switches); -} - void FlutterWindowsEngineBuilder::SetCreateKeyboardHandlerCallbacks( KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state, KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan) { From b77fed10d282fe7cee2140403829f2e3c6752079 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 11 Jul 2023 19:50:47 -0700 Subject: [PATCH 16/29] Update flutter_windows_engine.cc --- shell/platform/windows/flutter_windows_engine.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/windows/flutter_windows_engine.cc b/shell/platform/windows/flutter_windows_engine.cc index 005950f0efcc3..844790db56c17 100644 --- a/shell/platform/windows/flutter_windows_engine.cc +++ b/shell/platform/windows/flutter_windows_engine.cc @@ -378,13 +378,13 @@ bool FlutterWindowsEngine::Run(std::string_view entrypoint) { FlutterRendererConfig renderer_config; if (enable_impeller_) { + // Impeller does not support a Software backend. Avoid falling back and + // confusing the engine on which renderer is selected. if (!surface_manager_) { FML_LOG(ERROR) << "Could not create surface manager. Impeller backend " "does not support software rendering."; return false; } - // Impeller does not support a Software backend. Avoid falling back and - // confusing the engine on which renderer is selected. renderer_config = GetOpenGLRendererConfig(); } else { renderer_config = surface_manager_ ? GetOpenGLRendererConfig() From ecbf4f6a3a9fa484c053bc24ec846c26c0524fe4 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 11 Jul 2023 21:19:09 -0700 Subject: [PATCH 17/29] ++ --- .../windows/flutter_project_bundle.cc | 11 +++++++- .../flutter_windows_engine_unittests.cc | 25 +------------------ .../testing/flutter_windows_engine_builder.cc | 5 ++++ .../testing/flutter_windows_engine_builder.h | 3 +++ 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/shell/platform/windows/flutter_project_bundle.cc b/shell/platform/windows/flutter_project_bundle.cc index df289b526a0f4..de21c8161a315 100644 --- a/shell/platform/windows/flutter_project_bundle.cc +++ b/shell/platform/windows/flutter_project_bundle.cc @@ -88,7 +88,16 @@ void FlutterProjectBundle::SetSwitches( } const std::vector FlutterProjectBundle::GetSwitches() { - return GetSwitchesFromEnvironment(); + if (engine_switches_.size() == 0) { + return GetSwitchesFromEnvironment(); + } + std::vector switches; + switches.insert(switches.end(), engine_switches_.begin(), engine_switches_.end()); + + auto env_switches = GetSwitchesFromEnvironment(); + switches.insert(switches.end(), env_switches.begin(), env_switches.end()); + + return switches; } } // namespace flutter diff --git a/shell/platform/windows/flutter_windows_engine_unittests.cc b/shell/platform/windows/flutter_windows_engine_unittests.cc index b0cc688075ab3..80fb26f6cd3b3 100644 --- a/shell/platform/windows/flutter_windows_engine_unittests.cc +++ b/shell/platform/windows/flutter_windows_engine_unittests.cc @@ -25,26 +25,6 @@ namespace flutter { namespace testing { -namespace { -// Sets |key=value| in the environment of this process. -void SetEnvironmentVariable(const char* key, const char* value) { -#ifdef _WIN32 - _putenv_s(key, value); -#else - setenv(key, value, 1); -#endif -} - -// Removes |key| from the environment of this process, if present. -void ClearEnvironmentVariable(const char* key) { -#ifdef _WIN32 - _putenv_s(key, ""); -#else - unsetenv(key); -#endif -} -} // namespace - class FlutterWindowsEngineTest : public WindowsTest {}; TEST_F(FlutterWindowsEngineTest, RunDoesExpectedInitialization) { @@ -244,10 +224,8 @@ TEST_F(FlutterWindowsEngineTest, RunWithoutANGLEUsesSoftware) { } TEST_F(FlutterWindowsEngineTest, RunWithoutANGLEOnImpellerFailsToStart) { - SetEnvironmentVariable("FLUTTER_ENGINE_SWITCHES", "1"); - SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_1", "enable-impeller=true"); - FlutterWindowsEngineBuilder builder{GetContext()}; + builder.SetSwitches({"--enable-impeller=true"}); std::unique_ptr engine = builder.Build(); EngineModifier modifier(engine.get()); @@ -277,7 +255,6 @@ TEST_F(FlutterWindowsEngineTest, RunWithoutANGLEOnImpellerFailsToStart) { // Set the AngleSurfaceManager to nullptr to test software fallback path. modifier.SetSurfaceManager(nullptr); - ClearEnvironmentVariable("FLUTTER_ENGINE_SWITCHES"); EXPECT_FALSE(engine->Run()); } diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.cc b/shell/platform/windows/testing/flutter_windows_engine_builder.cc index d4f8086c89609..00a2aa44b4b27 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.cc +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.cc @@ -62,6 +62,10 @@ void FlutterWindowsEngineBuilder::AddDartEntrypointArgument(std::string arg) { dart_entrypoint_arguments_.emplace_back(std::move(arg)); } +void FlutterWindowsEngineBuilder::SetSwitches(std::vector switches) { + switches_ = std::move(switches); +} + void FlutterWindowsEngineBuilder::SetCreateKeyboardHandlerCallbacks( KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state, KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan) { @@ -86,6 +90,7 @@ std::unique_ptr FlutterWindowsEngineBuilder::Build() { } FlutterProjectBundle project(properties_); + project.SetSwitches(switches_); return std::make_unique(project, get_key_state_, map_vk_to_scan_); diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.h b/shell/platform/windows/testing/flutter_windows_engine_builder.h index ce3648a82a005..e17d3c794227e 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.h +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.h @@ -29,6 +29,8 @@ class FlutterWindowsEngineBuilder { KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state, KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan); + void SetSwitches(std::vector switches); + std::unique_ptr Build(); private: @@ -36,6 +38,7 @@ class FlutterWindowsEngineBuilder { FlutterDesktopEngineProperties properties_ = {}; std::string dart_entrypoint_; std::vector dart_entrypoint_arguments_; + std::vector switches_; KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state_; KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan_; From 7527b3ca87d557f5ef8e5d5cde5aec0327ac55c4 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 11 Jul 2023 21:19:57 -0700 Subject: [PATCH 18/29] ++ --- shell/platform/windows/flutter_project_bundle.cc | 3 ++- .../platform/windows/testing/flutter_windows_engine_builder.cc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/shell/platform/windows/flutter_project_bundle.cc b/shell/platform/windows/flutter_project_bundle.cc index de21c8161a315..aab3239ce8291 100644 --- a/shell/platform/windows/flutter_project_bundle.cc +++ b/shell/platform/windows/flutter_project_bundle.cc @@ -92,7 +92,8 @@ const std::vector FlutterProjectBundle::GetSwitches() { return GetSwitchesFromEnvironment(); } std::vector switches; - switches.insert(switches.end(), engine_switches_.begin(), engine_switches_.end()); + switches.insert(switches.end(), engine_switches_.begin(), + engine_switches_.end()); auto env_switches = GetSwitchesFromEnvironment(); switches.insert(switches.end(), env_switches.begin(), env_switches.end()); diff --git a/shell/platform/windows/testing/flutter_windows_engine_builder.cc b/shell/platform/windows/testing/flutter_windows_engine_builder.cc index 00a2aa44b4b27..9b8f6e4053dbc 100644 --- a/shell/platform/windows/testing/flutter_windows_engine_builder.cc +++ b/shell/platform/windows/testing/flutter_windows_engine_builder.cc @@ -62,7 +62,8 @@ void FlutterWindowsEngineBuilder::AddDartEntrypointArgument(std::string arg) { dart_entrypoint_arguments_.emplace_back(std::move(arg)); } -void FlutterWindowsEngineBuilder::SetSwitches(std::vector switches) { +void FlutterWindowsEngineBuilder::SetSwitches( + std::vector switches) { switches_ = std::move(switches); } From e90dca338a2f2254fead7912265d2b8f7b47e112 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 12 Jul 2023 10:17:16 -0700 Subject: [PATCH 19/29] dnfield review --- shell/platform/embedder/embedder.cc | 24 +++++++++---------- .../embedder/embedder_surface_gl_impeller.cc | 13 +++------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index d3f3ab814cb24..30d0a77e0580a 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -67,13 +67,13 @@ extern const intptr_t kPlatformStrongDillSize; #ifdef SHELL_ENABLE_GL #include "flutter/shell/platform/embedder/embedder_external_texture_gl.h" #ifdef IMPELLER_SUPPORTS_RENDERING -#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" // nogncheck -#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" // nogncheck -#include "impeller/core/texture.h" // nogncheck -#include "impeller/renderer/backend/gles/context_gles.h" // nogncheck -#include "impeller/renderer/backend/gles/texture_gles.h" // nogncheck -#include "impeller/renderer/context.h" // nogncheck -#include "impeller/renderer/render_target.h" // nogncheck +#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" +#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" +#include "impeller/core/texture.h" +#include "impeller/renderer/backend/gles/context_gles.h" +#include "impeller/renderer/backend/gles/texture_gles.h" +#include "impeller/renderer/context.h" +#include "impeller/renderer/render_target.h" #endif // IMPELLER_SUPPORTS_RENDERING #endif // SHELL_ENABLE_GL @@ -81,11 +81,11 @@ extern const intptr_t kPlatformStrongDillSize; #include "flutter/shell/platform/embedder/embedder_surface_metal.h" #include "third_party/skia/include/ports/SkCFObject.h" #ifdef IMPELLER_SUPPORTS_RENDERING -#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" // nogncheck -#include "flutter/shell/platform/embedder/embedder_surface_metal_impeller.h" // nogncheck -#include "impeller/core/texture.h" // nogncheck -#include "impeller/renderer/backend/metal/texture_wrapper_mtl.h" // nogncheck -#include "impeller/renderer/render_target.h" // nogncheck +#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" +#include "flutter/shell/platform/embedder/embedder_surface_metal_impeller.h" +#include "impeller/core/texture.h" +#include "impeller/renderer/backend/metal/texture_wrapper_mtl.h" +#include "impeller/renderer/render_target.h" #endif // IMPELLER_SUPPORTS_RENDERING #endif // SHELL_ENABLE_METAL diff --git a/shell/platform/embedder/embedder_surface_gl_impeller.cc b/shell/platform/embedder/embedder_surface_gl_impeller.cc index 0a4194e6cd7a8..7a4c3ddf1524b 100644 --- a/shell/platform/embedder/embedder_surface_gl_impeller.cc +++ b/shell/platform/embedder/embedder_surface_gl_impeller.cc @@ -6,7 +6,6 @@ #include -#include "flutter/shell/common/shell_io_manager.h" #include "impeller/entity/gles/entity_shaders_gles.h" #include "impeller/renderer/backend/gles/context_gles.h" #include "impeller/renderer/backend/gles/proc_table_gles.h" @@ -49,7 +48,6 @@ EmbedderSurfaceGLImpeller::EmbedderSurfaceGLImpeller( fbo_reset_after_present_(fbo_reset_after_present), external_view_embedder_(std::move(external_view_embedder)), worker_(std::make_shared()) { - worker_->SetReactionsAllowedOnCurrentThread(true); // Make sure all required members of the dispatch table are checked. if (!gl_dispatch_table_.gl_make_current_callback || !gl_dispatch_table_.gl_clear_current_callback || @@ -80,6 +78,7 @@ EmbedderSurfaceGLImpeller::EmbedderSurfaceGLImpeller( return; } + worker_->SetReactionsAllowedOnCurrentThread(true); auto worker_id = impeller_context_->AddReactorWorker(worker_); if (!worker_id.has_value()) { FML_LOG(ERROR) << "Could not add reactor worker."; @@ -177,19 +176,13 @@ EmbedderSurfaceGLImpeller::CreateImpellerContext() const { // |EmbedderSurface| sk_sp EmbedderSurfaceGLImpeller::CreateResourceContext() const { - sk_sp resource_context; if (gl_dispatch_table_.gl_make_resource_current_callback()) { worker_->SetReactionsAllowedOnCurrentThread(true); - // TODO(chinmaygarde): Currently, this code depends on the fact that only - // the OpenGL surface will be able to make a resource context current. If - // this changes, this assumption breaks. Handle the same. - resource_context = ShellIOManager::CreateCompatibleResourceLoadingContext( - GrBackend::kOpenGL_GrBackend, - GPUSurfaceGLDelegate::GetDefaultPlatformGLInterface()); } else { FML_DLOG(ERROR) << "Could not make the resource context current."; + worker_->SetReactionsAllowedOnCurrentThread(false); } - return resource_context; + return nullptr; } } // namespace flutter From 8f907a61ef2aac363498b415703704c85b4f16ca Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 12 Jul 2023 10:19:19 -0700 Subject: [PATCH 20/29] comment fix --- impeller/renderer/backend/gles/render_pass_gles.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impeller/renderer/backend/gles/render_pass_gles.cc b/impeller/renderer/backend/gles/render_pass_gles.cc index dd986042f300b..57ac48069df53 100644 --- a/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/impeller/renderer/backend/gles/render_pass_gles.cc @@ -463,7 +463,7 @@ struct RenderPassData { } // TODO(jonahwilliams): discarding the stencil on the default fbo when running -// on Windows. Causes Angle to discard the entire render target. Until we know +// on Windows causes Angle to discard the entire render target. Until we know // the reason, default to storing. #ifdef FML_OS_WIN if (pass_data.discard_stencil_attachment && !is_default_fbo) { From 2cf3013980449bb288f05311b8056d3a73efcc3d Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 12 Jul 2023 10:29:18 -0700 Subject: [PATCH 21/29] Add dep --- shell/platform/embedder/BUILD.gn | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index eb37108dc6d71..7fd5020229ed2 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -133,7 +133,10 @@ template("embedder_source_set") { "embedder_render_target_impeller.h", ] - deps += [ "//flutter/impeller" ] + deps += [ + "//flutter/impeller", + "//flutter/impeller/renderer", + ] } if (embedder_enable_metal) { From 4e1670ecc55c04f462b50b89d1ae6eecbc97a8de Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 12 Jul 2023 10:32:20 -0700 Subject: [PATCH 22/29] Add missing deps --- shell/platform/embedder/BUILD.gn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index 7fd5020229ed2..5bfe8cad0215f 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -124,6 +124,7 @@ template("embedder_source_set") { "embedder_surface_gl_impeller.cc", "embedder_surface_gl_impeller.h", ] + deps += [ "//flutter/impeller/renderer/backend/gles" ] } } @@ -152,6 +153,7 @@ template("embedder_source_set") { "embedder_surface_metal_impeller.h", "embedder_surface_metal_impeller.mm", ] + deps += [ "//flutter/impeller/renderer/backend/metal" ] } cflags_objc = flutter_cflags_objc From cc357c373861b10b981ebd249cc1da534a212e74 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 12 Jul 2023 11:35:35 -0700 Subject: [PATCH 23/29] fix #if macro --- shell/platform/embedder/embedder.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index 30d0a77e0580a..78dea97e76f46 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -66,7 +66,7 @@ extern const intptr_t kPlatformStrongDillSize; #ifdef SHELL_ENABLE_GL #include "flutter/shell/platform/embedder/embedder_external_texture_gl.h" -#ifdef IMPELLER_SUPPORTS_RENDERING +#if IMPELLER_SUPPORTS_RENDERING #include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" #include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" #include "impeller/core/texture.h" @@ -80,7 +80,7 @@ extern const intptr_t kPlatformStrongDillSize; #ifdef SHELL_ENABLE_METAL #include "flutter/shell/platform/embedder/embedder_surface_metal.h" #include "third_party/skia/include/ports/SkCFObject.h" -#ifdef IMPELLER_SUPPORTS_RENDERING +#if IMPELLER_SUPPORTS_RENDERING #include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" #include "flutter/shell/platform/embedder/embedder_surface_metal_impeller.h" #include "impeller/core/texture.h" From f4a52fbc57faec570b871fd632beb03bb4b2da36 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 12 Jul 2023 11:51:17 -0700 Subject: [PATCH 24/29] ++ --- shell/platform/embedder/embedder.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index 78dea97e76f46..e5576ff6a809b 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -64,7 +64,7 @@ extern const intptr_t kPlatformStrongDillSize; #include "rapidjson/rapidjson.h" #include "rapidjson/writer.h" -#ifdef SHELL_ENABLE_GL +#if SHELL_ENABLE_GL #include "flutter/shell/platform/embedder/embedder_external_texture_gl.h" #if IMPELLER_SUPPORTS_RENDERING #include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" @@ -77,7 +77,7 @@ extern const intptr_t kPlatformStrongDillSize; #endif // IMPELLER_SUPPORTS_RENDERING #endif // SHELL_ENABLE_GL -#ifdef SHELL_ENABLE_METAL +#if SHELL_ENABLE_METAL #include "flutter/shell/platform/embedder/embedder_surface_metal.h" #include "third_party/skia/include/ports/SkCFObject.h" #if IMPELLER_SUPPORTS_RENDERING From 17025c6332523c06944ce57244f650057369d21d Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 12 Jul 2023 12:55:59 -0700 Subject: [PATCH 25/29] ++ --- shell/platform/embedder/BUILD.gn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index 5bfe8cad0215f..5dd52c664bf57 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -54,6 +54,9 @@ config("embedder_jit_snapshot_setup") { # different flags. template("embedder_source_set") { forward_variables_from(invoker, "*") + print("HERE!!!!!!!!!!!!!!!!!!!!!) + print(impeller_supports_rendering) + print(shell_enable_gl) source_set(target_name) { sources = [ From 264b4746af0a6d287b3555733089bb0cee2fdaf2 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 12 Jul 2023 13:00:53 -0700 Subject: [PATCH 26/29] ++ --- shell/platform/embedder/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index 5dd52c664bf57..21232380cd2b9 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -54,7 +54,7 @@ config("embedder_jit_snapshot_setup") { # different flags. template("embedder_source_set") { forward_variables_from(invoker, "*") - print("HERE!!!!!!!!!!!!!!!!!!!!!) + print("HERE!!!!!!!!!!!!!!!!!!!!!") print(impeller_supports_rendering) print(shell_enable_gl) From 6ae81d66b2c10e996c82a4902470f6f95aced269 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 12 Jul 2023 13:14:07 -0700 Subject: [PATCH 27/29] ++ --- impeller/BUILD.gn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/impeller/BUILD.gn b/impeller/BUILD.gn index 7d18e8550c234..e04020e7d6199 100644 --- a/impeller/BUILD.gn +++ b/impeller/BUILD.gn @@ -14,6 +14,8 @@ config("impeller_public_config") { defines += [ "IMPELLER_DEBUG=1" ] } + print("THERE!!!) + print(impeller_supports_rendering) if (impeller_supports_rendering) { defines += [ "IMPELLER_SUPPORTS_RENDERING=1" ] } From 9dc60c297abfc944e601bf589246247fbfbdd097 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 12 Jul 2023 13:14:16 -0700 Subject: [PATCH 28/29] ++ --- impeller/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impeller/BUILD.gn b/impeller/BUILD.gn index e04020e7d6199..cafdbdd7d1813 100644 --- a/impeller/BUILD.gn +++ b/impeller/BUILD.gn @@ -14,7 +14,7 @@ config("impeller_public_config") { defines += [ "IMPELLER_DEBUG=1" ] } - print("THERE!!!) + print("THERE!!!") print(impeller_supports_rendering) if (impeller_supports_rendering) { defines += [ "IMPELLER_SUPPORTS_RENDERING=1" ] From 705cf7af102a04c009bde8e57f13219ca60e3e6e Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 12 Jul 2023 15:55:38 -0700 Subject: [PATCH 29/29] ++ --- impeller/BUILD.gn | 2 -- shell/platform/embedder/BUILD.gn | 3 --- shell/platform/embedder/embedder.cc | 34 +++++++++++++++-------------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/impeller/BUILD.gn b/impeller/BUILD.gn index cafdbdd7d1813..7d18e8550c234 100644 --- a/impeller/BUILD.gn +++ b/impeller/BUILD.gn @@ -14,8 +14,6 @@ config("impeller_public_config") { defines += [ "IMPELLER_DEBUG=1" ] } - print("THERE!!!") - print(impeller_supports_rendering) if (impeller_supports_rendering) { defines += [ "IMPELLER_SUPPORTS_RENDERING=1" ] } diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index 21232380cd2b9..5bfe8cad0215f 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -54,9 +54,6 @@ config("embedder_jit_snapshot_setup") { # different flags. template("embedder_source_set") { forward_variables_from(invoker, "*") - print("HERE!!!!!!!!!!!!!!!!!!!!!") - print(impeller_supports_rendering) - print(shell_enable_gl) source_set(target_name) { sources = [ diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index e5576ff6a809b..34b874b609a85 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -64,28 +64,30 @@ extern const intptr_t kPlatformStrongDillSize; #include "rapidjson/rapidjson.h" #include "rapidjson/writer.h" -#if SHELL_ENABLE_GL +// Note: the IMPELLER_SUPPORTS_RENDERING may be defined even when the +// embedder/BUILD.gn variable impeller_supports_rendering is disabled. +#ifdef SHELL_ENABLE_GL #include "flutter/shell/platform/embedder/embedder_external_texture_gl.h" -#if IMPELLER_SUPPORTS_RENDERING -#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" -#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" -#include "impeller/core/texture.h" -#include "impeller/renderer/backend/gles/context_gles.h" -#include "impeller/renderer/backend/gles/texture_gles.h" -#include "impeller/renderer/context.h" -#include "impeller/renderer/render_target.h" +#ifdef IMPELLER_SUPPORTS_RENDERING +#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" // nogncheck +#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" // nogncheck +#include "impeller/core/texture.h" // nogncheck +#include "impeller/renderer/backend/gles/context_gles.h" // nogncheck +#include "impeller/renderer/backend/gles/texture_gles.h" // nogncheck +#include "impeller/renderer/context.h" // nogncheck +#include "impeller/renderer/render_target.h" // nogncheck #endif // IMPELLER_SUPPORTS_RENDERING #endif // SHELL_ENABLE_GL -#if SHELL_ENABLE_METAL +#ifdef SHELL_ENABLE_METAL #include "flutter/shell/platform/embedder/embedder_surface_metal.h" #include "third_party/skia/include/ports/SkCFObject.h" -#if IMPELLER_SUPPORTS_RENDERING -#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" -#include "flutter/shell/platform/embedder/embedder_surface_metal_impeller.h" -#include "impeller/core/texture.h" -#include "impeller/renderer/backend/metal/texture_wrapper_mtl.h" -#include "impeller/renderer/render_target.h" +#ifdef IMPELLER_SUPPORTS_RENDERING +#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" // nogncheck +#include "flutter/shell/platform/embedder/embedder_surface_metal_impeller.h" // nogncheck +#include "impeller/core/texture.h" // nogncheck +#include "impeller/renderer/backend/metal/texture_wrapper_mtl.h" // nogncheck +#include "impeller/renderer/render_target.h" // nogncheck #endif // IMPELLER_SUPPORTS_RENDERING #endif // SHELL_ENABLE_METAL