From f8754257dabc24808dac4e4436579c01fe7901bf Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 22 Apr 2021 15:13:55 -0700 Subject: [PATCH] Refactor Android PlatformView constructors (flutter/engine#25632) --- .../platform/android/android_shell_holder.cc | 23 ++--- .../platform/android/platform_view_android.cc | 93 ++++++++----------- .../platform/android/platform_view_android.h | 17 +--- 3 files changed, 50 insertions(+), 83 deletions(-) diff --git a/engine/src/flutter/shell/platform/android/android_shell_holder.cc b/engine/src/flutter/shell/platform/android/android_shell_holder.cc index 6e17072a6ed..60cb633e2f2 100644 --- a/engine/src/flutter/shell/platform/android/android_shell_holder.cc +++ b/engine/src/flutter/shell/platform/android/android_shell_holder.cc @@ -55,21 +55,14 @@ AndroidShellHolder::AndroidShellHolder( Shell::CreateCallback on_create_platform_view = [is_background_view, &jni_facade, &weak_platform_view](Shell& shell) { std::unique_ptr platform_view_android; - if (is_background_view) { - platform_view_android = std::make_unique( - shell, // delegate - shell.GetTaskRunners(), // task runners - jni_facade // JNI interop - ); - } else { - platform_view_android = std::make_unique( - shell, // delegate - shell.GetTaskRunners(), // task runners - jni_facade, // JNI interop - shell.GetSettings() - .enable_software_rendering // use software rendering - ); - } + platform_view_android = std::make_unique( + shell, // delegate + shell.GetTaskRunners(), // task runners + jni_facade, // JNI interop + shell.GetSettings() + .enable_software_rendering, // use software rendering + !is_background_view // create onscreen surface + ); weak_platform_view = platform_view_android->GetWeakPtr(); auto display = Display(jni_facade->GetDisplayRefreshRate()); shell.OnDisplayUpdates(DisplayUpdateType::kStartup, {display}); diff --git a/engine/src/flutter/shell/platform/android/platform_view_android.cc b/engine/src/flutter/shell/platform/android/platform_view_android.cc index 1e9e4763774..9669fd54818 100644 --- a/engine/src/flutter/shell/platform/android/platform_view_android.cc +++ b/engine/src/flutter/shell/platform/android/platform_view_android.cc @@ -48,35 +48,40 @@ std::unique_ptr AndroidSurfaceFactoryImpl::CreateSurface() { jni_facade_); #endif // SHELL_ENABLE_VULKAN default: + FML_DCHECK(false); return nullptr; } - return nullptr; +} + +static std::shared_ptr CreateAndroidContext( + bool use_software_rendering, + bool create_onscreen_surface) { + if (!create_onscreen_surface) { + return nullptr; + } + if (use_software_rendering) { + return std::make_shared(AndroidRenderingAPI::kSoftware); + } +#if SHELL_ENABLE_VULKAN + return std::make_shared(AndroidRenderingAPI::kVulkan); +#else // SHELL_ENABLE_VULKAN + return std::make_unique( + AndroidRenderingAPI::kOpenGLES, + fml::MakeRefCounted()); +#endif // SHELL_ENABLE_VULKAN } PlatformViewAndroid::PlatformViewAndroid( PlatformView::Delegate& delegate, flutter::TaskRunners task_runners, std::shared_ptr jni_facade, - bool use_software_rendering) - : PlatformView(delegate, std::move(task_runners)), - jni_facade_(jni_facade), - platform_view_android_delegate_(jni_facade) { - if (use_software_rendering) { - android_context_ = - std::make_shared(AndroidRenderingAPI::kSoftware); - } else { -#if SHELL_ENABLE_VULKAN - android_context_ = - std::make_shared(AndroidRenderingAPI::kVulkan); -#else // SHELL_ENABLE_VULKAN - android_context_ = std::make_unique( - AndroidRenderingAPI::kOpenGLES, - fml::MakeRefCounted()); -#endif // SHELL_ENABLE_VULKAN - } - surface_factory_ = MakeSurfaceFactory(android_context_, *jni_facade_); - android_surface_ = MakeSurface(surface_factory_); -} + bool use_software_rendering, + bool create_onscreen_surface) + : PlatformViewAndroid(delegate, + std::move(task_runners), + std::move(jni_facade), + CreateAndroidContext(use_software_rendering, + create_onscreen_surface)) {} PlatformViewAndroid::PlatformViewAndroid( PlatformView::Delegate& delegate, @@ -85,43 +90,25 @@ PlatformViewAndroid::PlatformViewAndroid( const std::shared_ptr& android_context) : PlatformView(delegate, std::move(task_runners)), jni_facade_(jni_facade), - android_context_(android_context), + android_context_(std::move(android_context)), platform_view_android_delegate_(jni_facade) { - surface_factory_ = MakeSurfaceFactory(android_context_, *jni_facade_); - android_surface_ = MakeSurface(surface_factory_); -} + // TODO(dnfield): always create a pbuffer surface for background use to + // resolve https://github.com/flutter/flutter/issues/73675 + if (android_context) { + FML_CHECK(android_context->IsValid()) + << "Could not create surface from invalid Android context."; + surface_factory_ = std::make_shared( + android_context, jni_facade_); + android_surface_ = surface_factory_->CreateSurface(); -PlatformViewAndroid::PlatformViewAndroid( - PlatformView::Delegate& delegate, - flutter::TaskRunners task_runners, - std::shared_ptr jni_facade) - : PlatformView(delegate, std::move(task_runners)), - jni_facade_(jni_facade), - platform_view_android_delegate_(jni_facade) {} + FML_CHECK(android_surface_ && android_surface_->IsValid()) + << "Could not create an OpenGL, Vulkan or Software surface to set up " + "rendering."; + } +} PlatformViewAndroid::~PlatformViewAndroid() = default; -std::shared_ptr -PlatformViewAndroid::MakeSurfaceFactory( - const std::shared_ptr& android_context, - const PlatformViewAndroidJNI& jni_facade) { - FML_CHECK(android_context->IsValid()) - << "Could not create surface from invalid Android context."; - - return std::make_shared(android_context, - jni_facade_); -} - -std::unique_ptr PlatformViewAndroid::MakeSurface( - const std::shared_ptr& surface_factory) { - auto surface = surface_factory->CreateSurface(); - - FML_CHECK(surface && surface->IsValid()) - << "Could not create an OpenGL, Vulkan or Software surface to set up " - "rendering."; - return surface; -} - void PlatformViewAndroid::NotifyCreated( fml::RefPtr native_window) { if (android_surface_) { diff --git a/engine/src/flutter/shell/platform/android/platform_view_android.h b/engine/src/flutter/shell/platform/android/platform_view_android.h index 83f4e0494ed..61d92c76318 100644 --- a/engine/src/flutter/shell/platform/android/platform_view_android.h +++ b/engine/src/flutter/shell/platform/android/platform_view_android.h @@ -41,17 +41,11 @@ class PlatformViewAndroid final : public PlatformView { public: static bool Register(JNIEnv* env); - // Creates a PlatformViewAndroid with no rendering surface for use with - // background execution. - PlatformViewAndroid(PlatformView::Delegate& delegate, - flutter::TaskRunners task_runners, - std::shared_ptr jni_facade); - - // Creates a PlatformViewAndroid with a rendering surface. PlatformViewAndroid(PlatformView::Delegate& delegate, flutter::TaskRunners task_runners, std::shared_ptr jni_facade, - bool use_software_rendering); + bool use_software_rendering, + bool create_onscreen_surface); //---------------------------------------------------------------------------- /// @brief Creates a new PlatformViewAndroid but using an existing @@ -170,13 +164,6 @@ class PlatformViewAndroid final : public PlatformView { // |PlatformView| void RequestDartDeferredLibrary(intptr_t loading_unit_id) override; - std::shared_ptr MakeSurfaceFactory( - const std::shared_ptr& android_context, - const PlatformViewAndroidJNI& jni_facade); - - std::unique_ptr MakeSurface( - const std::shared_ptr& surface_factory); - void InstallFirstFrameCallback(); void FireFirstFrameCallback();