From 9ebbab290b277b8616e1fdc26d71fd5cedf4ca70 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Thu, 5 Feb 2015 20:08:22 -0800 Subject: [PATCH] Plumb resize notifications around sky/shell This CL plumbs resize notifications from SkyView to Engine. I've taken the opportunity to reorganize how notifications generated by SkyView are plumbed to the GPU and UI threads. This approach should reduce the amount of plumbing needed for new notifications. R=eseidel@chromium.org Review URL: https://codereview.chromium.org/880443003 --- engine/src/flutter/shell/BUILD.gn | 12 ++++++--- engine/src/flutter/shell/gpu/rasterizer.cc | 5 +++- engine/src/flutter/shell/gpu/rasterizer.h | 7 +++-- engine/src/flutter/shell/gpu_delegate.cc | 14 ++++++++++ engine/src/flutter/shell/gpu_delegate.h | 25 ++++++++++++++++++ engine/src/flutter/shell/library_loader.cc | 4 +-- engine/src/flutter/shell/shell.cc | 18 ++++++------- engine/src/flutter/shell/shell.h | 10 +++----- engine/src/flutter/shell/sky_view.cc | 30 ++++++++++++---------- engine/src/flutter/shell/sky_view.h | 27 ++++++++++--------- engine/src/flutter/shell/ui/engine.cc | 8 ++++++ engine/src/flutter/shell/ui/engine.h | 8 +++++- engine/src/flutter/shell/ui_delegate.cc | 14 ++++++++++ engine/src/flutter/shell/ui_delegate.h | 25 ++++++++++++++++++ 14 files changed, 153 insertions(+), 54 deletions(-) create mode 100644 engine/src/flutter/shell/gpu_delegate.cc create mode 100644 engine/src/flutter/shell/gpu_delegate.h create mode 100644 engine/src/flutter/shell/ui_delegate.cc create mode 100644 engine/src/flutter/shell/ui_delegate.h diff --git a/engine/src/flutter/shell/BUILD.gn b/engine/src/flutter/shell/BUILD.gn index 32b1c6a582b..20ceed137fb 100644 --- a/engine/src/flutter/shell/BUILD.gn +++ b/engine/src/flutter/shell/BUILD.gn @@ -29,10 +29,8 @@ shared_library("sky_shell") { "gpu/ganesh_surface.h", "gpu/rasterizer.cc", "gpu/rasterizer.h", - "ui/engine.cc", - "ui/engine.h", - "ui/platform_impl.cc", - "ui/platform_impl.h", + "gpu_delegate.cc", + "gpu_delegate.h", "library_loader.cc", "shell.cc", "shell.h", @@ -40,6 +38,12 @@ shared_library("sky_shell") { "sky_main.h", "sky_view.cc", "sky_view.h", + "ui/engine.cc", + "ui/engine.h", + "ui/platform_impl.cc", + "ui/platform_impl.h", + "ui_delegate.cc", + "ui_delegate.h", ] deps = [ diff --git a/engine/src/flutter/shell/gpu/rasterizer.cc b/engine/src/flutter/shell/gpu/rasterizer.cc index 8e4b49282e3..70336e64df8 100644 --- a/engine/src/flutter/shell/gpu/rasterizer.cc +++ b/engine/src/flutter/shell/gpu/rasterizer.cc @@ -34,7 +34,7 @@ base::WeakPtr Rasterizer::GetWeakPtr() { return weak_factory_.GetWeakPtr(); } -void Rasterizer::Init(gfx::AcceleratedWidget widget) { +void Rasterizer::OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) { share_group_ = make_scoped_refptr(new gfx::GLShareGroup()); surface_ = gfx::GLSurface::CreateViewGLSurface(widget); CHECK(surface_) << "GLSurface required."; @@ -53,6 +53,9 @@ void Rasterizer::Draw(skia::RefPtr picture) { surface_->SwapBuffers(); } +void Rasterizer::OnOutputSurfaceDestroyed() { +} + bool Rasterizer::CreateGLContext() { context_ = gfx::GLContext::CreateGLContext(share_group_.get(), surface_.get(), gfx::PreferIntegratedGpu); diff --git a/engine/src/flutter/shell/gpu/rasterizer.h b/engine/src/flutter/shell/gpu/rasterizer.h index 302e38d9e3c..8e556418903 100644 --- a/engine/src/flutter/shell/gpu/rasterizer.h +++ b/engine/src/flutter/shell/gpu/rasterizer.h @@ -8,6 +8,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "skia/ext/refptr.h" +#include "sky/shell/gpu_delegate.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/native_widget_types.h" @@ -24,14 +25,16 @@ namespace shell { class GaneshContext; class GaneshSurface; -class Rasterizer { +class Rasterizer : public GPUDelegate { public: explicit Rasterizer(); ~Rasterizer(); base::WeakPtr GetWeakPtr(); - void Init(gfx::AcceleratedWidget widget); + void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override; + void OnOutputSurfaceDestroyed() override; + void Draw(skia::RefPtr picture); private: diff --git a/engine/src/flutter/shell/gpu_delegate.cc b/engine/src/flutter/shell/gpu_delegate.cc new file mode 100644 index 00000000000..62fe84c40bc --- /dev/null +++ b/engine/src/flutter/shell/gpu_delegate.cc @@ -0,0 +1,14 @@ +// Copyright 2015 The Chromium 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 "sky/shell/gpu_delegate.h" + +namespace sky { +namespace shell { + +GPUDelegate::~GPUDelegate() { +} + +} // namespace shell +} // namespace sky diff --git a/engine/src/flutter/shell/gpu_delegate.h b/engine/src/flutter/shell/gpu_delegate.h new file mode 100644 index 00000000000..34ab4cdf284 --- /dev/null +++ b/engine/src/flutter/shell/gpu_delegate.h @@ -0,0 +1,25 @@ +// Copyright 2015 The Chromium 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 SKY_SHELL_GPU_DELEGATE_H_ +#define SKY_SHELL_GPU_DELEGATE_H_ + +#include "ui/gfx/native_widget_types.h" + +namespace sky { +namespace shell { + +class GPUDelegate { + public: + virtual void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) = 0; + virtual void OnOutputSurfaceDestroyed() = 0; + + protected: + virtual ~GPUDelegate(); +}; + +} // namespace shell +} // namespace sky + +#endif // SKY_SHELL_GPU_DELEGATE_H_ diff --git a/engine/src/flutter/shell/library_loader.cc b/engine/src/flutter/shell/library_loader.cc index 0a283084bf1..1682167f95e 100644 --- a/engine/src/flutter/shell/library_loader.cc +++ b/engine/src/flutter/shell/library_loader.cc @@ -17,7 +17,7 @@ base::android::RegistrationMethod kSkyRegisteredMethods[] = { {"SkyView", sky::shell::SkyView::Register}, }; -bool RegisterMojoJni(JNIEnv* env) { +bool RegisterSkyJni(JNIEnv* env) { return RegisterNativeMethods(env, kSkyRegisteredMethods, arraysize(kSkyRegisteredMethods)); } @@ -35,7 +35,7 @@ JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { if (!base::android::RegisterJni(env)) return -1; - if (!RegisterMojoJni(env)) + if (!RegisterSkyJni(env)) return -1; return JNI_VERSION_1_4; diff --git a/engine/src/flutter/shell/shell.cc b/engine/src/flutter/shell/shell.cc index 3a54bb2c09f..a5ca2f38017 100644 --- a/engine/src/flutter/shell/shell.cc +++ b/engine/src/flutter/shell/shell.cc @@ -7,7 +7,9 @@ #include "base/bind.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread.h" +#include "sky/shell/gpu/rasterizer.h" #include "sky/shell/sky_view.h" +#include "sky/shell/ui/engine.h" namespace sky { namespace shell { @@ -31,17 +33,13 @@ void Shell::Init() { ui_thread_->message_loop()->PostTask( FROM_HERE, base::Bind(&Engine::Init, engine_->GetWeakPtr())); - view_.reset(new SkyView(this)); - view_->Init(); -} + SkyView::Config config; + config.gpu_task_runner = gpu_thread_->message_loop()->task_runner(); + config.gpu_delegate = rasterizer_->GetWeakPtr(); + config.ui_task_runner = ui_thread_->message_loop()->task_runner(); + config.ui_delegate = engine_->GetWeakPtr(); -void Shell::OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) { - gpu_thread_->message_loop()->PostTask( - FROM_HERE, - base::Bind(&Rasterizer::Init, rasterizer_->GetWeakPtr(), widget)); -} - -void Shell::OnDestroyed() { + view_.reset(new SkyView(config)); } } // namespace shell diff --git a/engine/src/flutter/shell/shell.h b/engine/src/flutter/shell/shell.h index bcb812e269b..6f77c2aa658 100644 --- a/engine/src/flutter/shell/shell.h +++ b/engine/src/flutter/shell/shell.h @@ -8,9 +8,6 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" -#include "sky/shell/gpu/rasterizer.h" -#include "sky/shell/sky_view.h" -#include "sky/shell/ui/engine.h" namespace base { class Thread; @@ -19,9 +16,11 @@ class SingleThreadTaskRunner; namespace sky { namespace shell { +class Engine; +class Rasterizer; class SkyView; -class Shell : public SkyView::Delegate { +class Shell { public: explicit Shell(scoped_refptr java_task_runner); ~Shell(); @@ -29,9 +28,6 @@ class Shell : public SkyView::Delegate { void Init(); private: - void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override; - void OnDestroyed() override; - scoped_refptr java_task_runner_; scoped_ptr gpu_thread_; scoped_ptr ui_thread_; diff --git a/engine/src/flutter/shell/sky_view.cc b/engine/src/flutter/shell/sky_view.cc index c7e6d2d06c7..d7b22112192 100644 --- a/engine/src/flutter/shell/sky_view.cc +++ b/engine/src/flutter/shell/sky_view.cc @@ -8,6 +8,8 @@ #include #include "base/android/jni_android.h" +#include "base/bind.h" +#include "base/location.h" #include "jni/SkyView_jni.h" namespace sky { @@ -18,10 +20,10 @@ bool SkyView::Register(JNIEnv* env) { return RegisterNativesImpl(env); } -SkyView::Delegate::~Delegate() { -} - -SkyView::SkyView(Delegate* delegate) : delegate_(delegate), window_(NULL) { +SkyView::SkyView(const Config& config) : config_(config), window_(nullptr) { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_SkyView_createForActivity(env, base::android::GetApplicationContext(), + reinterpret_cast(this)); } SkyView::~SkyView() { @@ -29,14 +31,7 @@ SkyView::~SkyView() { ReleaseWindow(); } -void SkyView::Init() { - JNIEnv* env = base::android::AttachCurrentThread(); - Java_SkyView_createForActivity(env, base::android::GetApplicationContext(), - reinterpret_cast(this)); -} - void SkyView::Destroy(JNIEnv* env, jobject obj) { - delegate_->OnDestroyed(); } void SkyView::SurfaceCreated(JNIEnv* env, jobject obj, jobject jsurface) { @@ -48,11 +43,16 @@ void SkyView::SurfaceCreated(JNIEnv* env, jobject obj, jobject jsurface) { base::android::ScopedJavaLocalFrame scoped_local_reference_frame(env); window_ = ANativeWindow_fromSurface(env, jsurface); } - delegate_->OnAcceleratedWidgetAvailable(window_); + config_.gpu_task_runner->PostTask( + FROM_HERE, base::Bind(&GPUDelegate::OnAcceleratedWidgetAvailable, + config_.gpu_delegate, window_)); } void SkyView::SurfaceDestroyed(JNIEnv* env, jobject obj) { DCHECK(window_); + config_.gpu_task_runner->PostTask( + FROM_HERE, + base::Bind(&GPUDelegate::OnOutputSurfaceDestroyed, config_.gpu_delegate)); ReleaseWindow(); } @@ -61,11 +61,15 @@ void SkyView::SurfaceSetSize(JNIEnv* env, jint width, jint height, jfloat density) { + config_.ui_task_runner->PostTask( + FROM_HERE, + base::Bind(&UIDelegate::OnViewportMetricsChanged, config_.ui_delegate, + gfx::Size(width, height), density)); } void SkyView::ReleaseWindow() { ANativeWindow_release(window_); - window_ = NULL; + window_ = nullptr; } } // namespace shell diff --git a/engine/src/flutter/shell/sky_view.h b/engine/src/flutter/shell/sky_view.h index 300d926f591..b326ea37be4 100644 --- a/engine/src/flutter/shell/sky_view.h +++ b/engine/src/flutter/shell/sky_view.h @@ -8,7 +8,10 @@ #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" -#include "ui/gfx/native_widget_types.h" +#include "base/memory/weak_ptr.h" +#include "base/single_thread_task_runner.h" +#include "sky/shell/gpu_delegate.h" +#include "sky/shell/ui_delegate.h" struct ANativeWindow; @@ -17,22 +20,18 @@ namespace shell { class SkyView { public: - static bool Register(JNIEnv* env); + struct Config { + base::WeakPtr gpu_delegate; + scoped_refptr gpu_task_runner; - class Delegate { - public: - virtual void OnAcceleratedWidgetAvailable( - gfx::AcceleratedWidget widget) = 0; - virtual void OnDestroyed() = 0; - - protected: - virtual ~Delegate(); + base::WeakPtr ui_delegate; + scoped_refptr ui_task_runner; }; - explicit SkyView(Delegate* delegate); - ~SkyView(); + static bool Register(JNIEnv* env); - void Init(); + explicit SkyView(const Config& config); + ~SkyView(); // Called from Java void Destroy(JNIEnv* env, jobject obj); @@ -47,7 +46,7 @@ class SkyView { private: void ReleaseWindow(); - Delegate* delegate_; + Config config_; ANativeWindow* window_; DISALLOW_COPY_AND_ASSIGN(SkyView); diff --git a/engine/src/flutter/shell/ui/engine.cc b/engine/src/flutter/shell/ui/engine.cc index ed1971d3677..07deb847c24 100644 --- a/engine/src/flutter/shell/ui/engine.cc +++ b/engine/src/flutter/shell/ui/engine.cc @@ -32,5 +32,13 @@ void Engine::Init() { web_view_->setMainFrame(blink::WebLocalFrame::create(this)); } +void Engine::OnViewportMetricsChanged(const gfx::Size& size, + float device_pixel_ratio) { + blink::WebSize web_size(size.width() / device_pixel_ratio, + size.height() / device_pixel_ratio); + web_view_->setDeviceScaleFactor(device_pixel_ratio); + web_view_->resize(web_size); +} + } // namespace shell } // namespace sky diff --git a/engine/src/flutter/shell/ui/engine.h b/engine/src/flutter/shell/ui/engine.h index cba0c7a7ad9..9deccd8c6b8 100644 --- a/engine/src/flutter/shell/ui/engine.h +++ b/engine/src/flutter/shell/ui/engine.h @@ -10,12 +10,15 @@ #include "base/memory/weak_ptr.h" #include "sky/engine/public/web/WebFrameClient.h" #include "sky/engine/public/web/WebViewClient.h" +#include "sky/shell/ui_delegate.h" +#include "ui/gfx/geometry/size.h" namespace sky { namespace shell { class PlatformImpl; -class Engine : public blink::WebFrameClient, +class Engine : public UIDelegate, + public blink::WebFrameClient, public blink::WebViewClient { public: Engine(); @@ -25,6 +28,9 @@ class Engine : public blink::WebFrameClient, void Init(); + void OnViewportMetricsChanged(const gfx::Size& size, + float device_pixel_ratio) override; + private: scoped_ptr platform_impl_; blink::WebView* web_view_; diff --git a/engine/src/flutter/shell/ui_delegate.cc b/engine/src/flutter/shell/ui_delegate.cc new file mode 100644 index 00000000000..e35b1924322 --- /dev/null +++ b/engine/src/flutter/shell/ui_delegate.cc @@ -0,0 +1,14 @@ +// Copyright 2015 The Chromium 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 "sky/shell/ui_delegate.h" + +namespace sky { +namespace shell { + +UIDelegate::~UIDelegate() { +} + +} // namespace shell +} // namespace sky diff --git a/engine/src/flutter/shell/ui_delegate.h b/engine/src/flutter/shell/ui_delegate.h new file mode 100644 index 00000000000..bb7e44b8c14 --- /dev/null +++ b/engine/src/flutter/shell/ui_delegate.h @@ -0,0 +1,25 @@ +// Copyright 2015 The Chromium 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 SKY_SHELL_UI_DELEGATE_H_ +#define SKY_SHELL_UI_DELEGATE_H_ + +#include "ui/gfx/geometry/size.h" + +namespace sky { +namespace shell { + +class UIDelegate { + public: + virtual void OnViewportMetricsChanged(const gfx::Size& size, + float device_pixel_ratio) = 0; + + protected: + virtual ~UIDelegate(); +}; + +} // namespace shell +} // namespace sky + +#endif // SKY_SHELL_UI_DELEGATE_H_