diff options
author | powei@chromium.org <powei@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-24 05:22:58 +0000 |
---|---|---|
committer | powei@chromium.org <powei@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-24 05:22:58 +0000 |
commit | df792f11766f5e680044eea48da04a774f177c5b (patch) | |
tree | 671270b1a33f120acad6a1e98ba7bbc202b79208 | |
parent | 798c6c50c2b70b11576060f22499061f4e154bc8 (diff) | |
download | chromium_src-df792f11766f5e680044eea48da04a774f177c5b.zip chromium_src-df792f11766f5e680044eea48da04a774f177c5b.tar.gz chromium_src-df792f11766f5e680044eea48da04a774f177c5b.tar.bz2 |
Merge 258167 "android: Readback using delegated rendering layer"
> android: Readback using delegated rendering layer
>
> Using a separate delegated rendering layer for readback allows us to keep the
> readback layer from being displayed. This in turn allows us to clip the content
> layer associated with RWHVAndroid when necessary.
>
> android= https://chrome-internal-review.googlesource.com/157016
> BUG=344720
>
> Review URL: https://codereview.chromium.org/197913002
TBR=powei@chromium.org
BUG=344720
Review URL: https://codereview.chromium.org/208653007
git-svn-id: svn://svn.chromium.org/chrome/branches/1847/src@258878 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/browser/renderer_host/compositor_impl_android.cc | 8 | ||||
-rw-r--r-- | content/browser/renderer_host/compositor_impl_android.h | 7 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_android.cc | 99 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_android.h | 3 | ||||
-rw-r--r-- | ui/base/android/window_android.cc | 11 | ||||
-rw-r--r-- | ui/base/android/window_android.h | 6 | ||||
-rw-r--r-- | ui/base/android/window_android_compositor.h | 26 | ||||
-rw-r--r-- | ui/ui.gyp | 1 |
8 files changed, 105 insertions, 56 deletions
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc index aabebfb..44838c1 100644 --- a/content/browser/renderer_host/compositor_impl_android.cc +++ b/content/browser/renderer_host/compositor_impl_android.cc @@ -183,7 +183,7 @@ CompositorImpl::CompositorImpl(CompositorClient* client, DCHECK(client); DCHECK(root_window); ImageTransportFactoryAndroid::AddObserver(this); - root_window->AttachCompositor(); + root_window->AttachCompositor(this); } CompositorImpl::~CompositorImpl() { @@ -461,4 +461,8 @@ void CompositorImpl::DidCommit() { root_window_->OnCompositingDidCommit(); } -} // namespace content +void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) { + root_layer_->AddChild(layer); +} + +} // namespace content diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h index 93014f1..15a16b3 100644 --- a/content/browser/renderer_host/compositor_impl_android.h +++ b/content/browser/renderer_host/compositor_impl_android.h @@ -16,6 +16,7 @@ #include "content/common/content_export.h" #include "content/public/browser/android/compositor.h" #include "third_party/khronos/GLES2/gl2.h" +#include "ui/base/android/window_android_compositor.h" class SkBitmap; struct ANativeWindow; @@ -37,7 +38,8 @@ class CONTENT_EXPORT CompositorImpl : public Compositor, public cc::LayerTreeHostClient, public cc::LayerTreeHostSingleThreadClient, - public ImageTransportFactoryAndroidObserver { + public ImageTransportFactoryAndroidObserver, + public ui::WindowAndroidCompositor { public: CompositorImpl(CompositorClient* client, gfx::NativeWindow root_window); virtual ~CompositorImpl(); @@ -92,6 +94,9 @@ class CONTENT_EXPORT CompositorImpl // ImageTransportFactoryAndroidObserver implementation. virtual void OnLostResources() OVERRIDE; + // WindowAndroidCompositor implementation. + virtual void AttachLayerForReadback(scoped_refptr<cc::Layer> layer) OVERRIDE; + private: cc::UIResourceId GenerateUIResourceFromUIResourceBitmap( const cc::UIResourceBitmap& bitmap, diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 7cb924e..6da31f3 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -54,6 +54,7 @@ #include "third_party/khronos/GLES2/gl2ext.h" #include "third_party/skia/include/core/SkCanvas.h" #include "ui/base/android/window_android.h" +#include "ui/base/android/window_android_compositor.h" #include "ui/gfx/android/device_display_info.h" #include "ui/gfx/android/java_bitmap.h" #include "ui/gfx/display.h" @@ -635,25 +636,45 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( base::TimeTicks::Now() - start_time); return; } + scoped_ptr<cc::CopyOutputRequest> request; - if ((src_subrect_in_pixel.size() == dst_size_in_pixel) && - (bitmap_config == SkBitmap::kARGB_8888_Config)) { - request = cc::CopyOutputRequest::CreateBitmapRequest(base::Bind( - &RenderWidgetHostViewAndroid::PrepareBitmapCopyOutputResult, - dst_size_in_pixel, - bitmap_config, - start_time, - callback)); + scoped_refptr<cc::Layer> readback_layer; + if (using_delegated_renderer_) { + DCHECK(content_view_core_); + DCHECK(content_view_core_->GetWindowAndroid()); + ui::WindowAndroidCompositor* compositor = + content_view_core_->GetWindowAndroid()->GetCompositor(); + DCHECK(compositor); + DCHECK(frame_provider_); + scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = + cc::DelegatedRendererLayer::Create(frame_provider_); + delegated_layer->SetDisplaySize(texture_size_in_layer_); + delegated_layer->SetBounds(content_size_in_layer_); + delegated_layer->SetHideLayerAndSubtree(true); + delegated_layer->SetIsDrawable(true); + delegated_layer->SetContentsOpaque(true); + compositor->AttachLayerForReadback(delegated_layer); + + readback_layer = delegated_layer; + request = cc::CopyOutputRequest::CreateRequest( + base::Bind(&RenderWidgetHostViewAndroid:: + PrepareTextureCopyOutputResultForDelegatedReadback, + dst_size_in_pixel, + bitmap_config, + start_time, + readback_layer, + callback)); } else { - request = cc::CopyOutputRequest::CreateRequest(base::Bind( - &RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult, - dst_size_in_pixel, - bitmap_config, - start_time, - callback)); + readback_layer = layer_; + request = cc::CopyOutputRequest::CreateRequest( + base::Bind(&RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult, + dst_size_in_pixel, + bitmap_config, + start_time, + callback)); } request->set_area(src_subrect_in_pixel); - layer_->RequestCopyOfOutput(request.Pass()); + readback_layer->RequestCopyOfOutput(request.Pass()); } void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( @@ -1360,6 +1381,20 @@ void RenderWidgetHostViewAndroid::OnLostResources() { } // static +void +RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback( + const gfx::Size& dst_size_in_pixel, + const SkBitmap::Config config, + const base::TimeTicks& start_time, + scoped_refptr<cc::Layer> readback_layer, + const base::Callback<void(bool, const SkBitmap&)>& callback, + scoped_ptr<cc::CopyOutputResult> result) { + readback_layer->RemoveFromParent(); + PrepareTextureCopyOutputResult( + dst_size_in_pixel, config, start_time, callback, result.Pass()); +} + +// static void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( const gfx::Size& dst_size_in_pixel, const SkBitmap::Config bitmap_config, @@ -1416,40 +1451,6 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( } // static -void RenderWidgetHostViewAndroid::PrepareBitmapCopyOutputResult( - const gfx::Size& dst_size_in_pixel, - const SkBitmap::Config config, - const base::TimeTicks& start_time, - const base::Callback<void(bool, const SkBitmap&)>& callback, - scoped_ptr<cc::CopyOutputResult> result) { - if (config != SkBitmap::kARGB_8888_Config) { - NOTIMPLEMENTED(); - callback.Run(false, SkBitmap()); - return; - } - DCHECK(result->HasBitmap()); - base::ScopedClosureRunner scoped_callback_runner( - base::Bind(callback, false, SkBitmap())); - - if (!result->HasBitmap() || result->IsEmpty() || result->size().IsEmpty()) - return; - - scoped_ptr<SkBitmap> source = result->TakeBitmap(); - DCHECK(source); - if (!source) - return; - - DCHECK_EQ(source->width(), dst_size_in_pixel.width()); - DCHECK_EQ(source->height(), dst_size_in_pixel.height()); - - ignore_result(scoped_callback_runner.Release()); - UMA_HISTOGRAM_TIMES(kAsyncReadBackString, - base::TimeTicks::Now() - start_time); - - callback.Run(true, *source); -} - -// static void RenderWidgetHostViewPort::GetDefaultScreenInfo( blink::WebScreenInfo* results) { const gfx::Display& display = diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index 8a83989..1b9ba5e 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h @@ -281,10 +281,11 @@ class RenderWidgetHostViewAndroid const base::TimeTicks& start_time, const base::Callback<void(bool, const SkBitmap&)>& callback, scoped_ptr<cc::CopyOutputResult> result); - static void PrepareBitmapCopyOutputResult( + static void PrepareTextureCopyOutputResultForDelegatedReadback( const gfx::Size& dst_size_in_pixel, const SkBitmap::Config config, const base::TimeTicks& start_time, + scoped_refptr<cc::Layer> readback_layer, const base::Callback<void(bool, const SkBitmap&)>& callback, scoped_ptr<cc::CopyOutputResult> result); diff --git a/ui/base/android/window_android.cc b/ui/base/android/window_android.cc index bacf023..916e821 100644 --- a/ui/base/android/window_android.cc +++ b/ui/base/android/window_android.cc @@ -9,6 +9,7 @@ #include "base/android/jni_helper.h" #include "base/android/scoped_java_ref.h" #include "jni/WindowAndroid_jni.h" +#include "ui/base/android/window_android_compositor.h" #include "ui/base/android/window_android_observer.h" namespace ui { @@ -17,7 +18,8 @@ using base::android::AttachCurrentThread; using base::android::ScopedJavaLocalRef; WindowAndroid::WindowAndroid(JNIEnv* env, jobject obj) - : weak_java_window_(env, obj) { + : weak_java_window_(env, obj), + compositor_(NULL) { } void WindowAndroid::Destroy(JNIEnv* env, jobject obj) { @@ -66,13 +68,18 @@ void WindowAndroid::RemoveObserver(WindowAndroidObserver* observer) { observer_list_.RemoveObserver(observer); } -void WindowAndroid::AttachCompositor() { +void WindowAndroid::AttachCompositor(WindowAndroidCompositor* compositor) { + if (compositor_ && compositor != compositor_) + DetachCompositor(); + + compositor_ = compositor; FOR_EACH_OBSERVER(WindowAndroidObserver, observer_list_, OnAttachCompositor()); } void WindowAndroid::DetachCompositor() { + compositor_ = NULL; FOR_EACH_OBSERVER(WindowAndroidObserver, observer_list_, OnDetachCompositor()); diff --git a/ui/base/android/window_android.h b/ui/base/android/window_android.h index 5e6532e..2563679 100644 --- a/ui/base/android/window_android.h +++ b/ui/base/android/window_android.h @@ -15,6 +15,7 @@ namespace ui { +class WindowAndroidCompositor; class WindowAndroidObserver; // Android implementation of the activity window. @@ -40,17 +41,20 @@ class UI_BASE_EXPORT WindowAndroid { // Compositor callback relay. void OnCompositingDidCommit(); - void AttachCompositor(); + void AttachCompositor(WindowAndroidCompositor* compositor); void DetachCompositor(); void AddObserver(WindowAndroidObserver* observer); void RemoveObserver(WindowAndroidObserver* observer); + WindowAndroidCompositor* GetCompositor() { return compositor_; } + private: ~WindowAndroid(); JavaObjectWeakGlobalRef weak_java_window_; gfx::Vector2dF content_offset_; + WindowAndroidCompositor* compositor_; ObserverList<WindowAndroidObserver> observer_list_; diff --git a/ui/base/android/window_android_compositor.h b/ui/base/android/window_android_compositor.h new file mode 100644 index 0000000..8f219fa --- /dev/null +++ b/ui/base/android/window_android_compositor.h @@ -0,0 +1,26 @@ +// Copyright 2014 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 UI_BASE_ANDROID_WINDOW_ANDROID_COMPOSITOR_H_ +#define UI_BASE_ANDROID_WINDOW_ANDROID_COMPOSITOR_H_ + +#include "ui/base/ui_base_export.h" + +namespace cc { +class Layer; +} + +namespace ui { + +// Android interface for compositor-related tasks. +class UI_BASE_EXPORT WindowAndroidCompositor { + public: + virtual ~WindowAndroidCompositor() {} + + virtual void AttachLayerForReadback(scoped_refptr<cc::Layer> layer) = 0; +}; + +} // namespace ui + +#endif // UI_BASE_ANDROID_WINDOW_ANDROID_COMPOSITOR_H_ @@ -58,6 +58,7 @@ 'base/android/view_android.h', 'base/android/window_android.cc', 'base/android/window_android.h', + 'base/android/window_android_compositor.h', 'base/android/window_android_observer.h', 'base/base_window.cc', 'base/base_window.h', |