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_