From 8a5928021fcd9cb365a623708e1c05d9bcdfe3e9 Mon Sep 17 00:00:00 2001 From: "boliu@chromium.org" Date: Wed, 2 Jul 2014 07:31:33 +0000 Subject: Add switch to disable recording whole document Add an android webview switch to disable the workaround to record the whole document on in each commit. The setting is plumbed through SynchronousCompositorFactory. BUG=390702 Review URL: https://codereview.chromium.org/361073002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@280970 0039d316-1c4b-4281-b951-d872f2087c98 --- android_webview/android_webview.gyp | 2 ++ android_webview/common/aw_switches.cc | 12 +++++++++ android_webview/common/aw_switches.h | 16 ++++++++++++ android_webview/lib/main/aw_main_delegate.cc | 5 ++++ cc/layers/picture_layer.cc | 2 +- cc/trees/layer_tree_settings.cc | 3 ++- cc/trees/layer_tree_settings.h | 1 + .../synchronous_compositor_factory_impl.cc | 12 ++++++++- .../synchronous_compositor_factory_impl.h | 4 +++ .../in_process/synchronous_compositor_impl.cc | 5 ++++ .../browser/android/synchronous_compositor.h | 5 ++++ .../android/synchronous_compositor_factory.h | 1 + content/renderer/gpu/render_widget_compositor.cc | 29 +++++++++++++++------- content/renderer/render_frame_impl.cc | 5 ++-- content/renderer/render_widget.cc | 8 ------ content/renderer/render_widget.h | 2 -- 16 files changed, 87 insertions(+), 25 deletions(-) create mode 100644 android_webview/common/aw_switches.cc create mode 100644 android_webview/common/aw_switches.h diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp index 9f24bfc..29a15f6 100644 --- a/android_webview/android_webview.gyp +++ b/android_webview/android_webview.gyp @@ -209,6 +209,8 @@ 'common/aw_hit_test_data.cc', 'common/aw_hit_test_data.h', 'common/aw_resource.h', + 'common/aw_switches.cc', + 'common/aw_switches.h', 'common/devtools_instrumentation.h', 'common/print_messages.cc', 'common/print_messages.h', diff --git a/android_webview/common/aw_switches.cc b/android_webview/common/aw_switches.cc new file mode 100644 index 0000000..f309623 --- /dev/null +++ b/android_webview/common/aw_switches.cc @@ -0,0 +1,12 @@ +// 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. + +#include "android_webview/common/aw_switches.h" + +namespace switches { + +const char kDisableRecordDocumentWorkaround[] = + "disable-record-document-workaround"; + +} // namespace switches diff --git a/android_webview/common/aw_switches.h b/android_webview/common/aw_switches.h new file mode 100644 index 0000000..913a262 --- /dev/null +++ b/android_webview/common/aw_switches.h @@ -0,0 +1,16 @@ +// 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 ANDROID_WEBVIEW_COMMON_AW_SWITCHES_H_ +#define ANDROID_WEBVIEW_COMMON_AW_SWITCHES_H_ + +namespace switches { + +// Disable the record whole document workaround which is used to support +// teleporting software draws. +extern const char kDisableRecordDocumentWorkaround[]; + +} // namespace switches + +#endif // ANDROID_WEBVIEW_COMMON_AW_SWITCHES_H_ diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc index 5f1069f..224292f 100644 --- a/android_webview/lib/main/aw_main_delegate.cc +++ b/android_webview/lib/main/aw_main_delegate.cc @@ -8,6 +8,7 @@ #include "android_webview/browser/browser_view_renderer.h" #include "android_webview/browser/gpu_memory_buffer_factory_impl.h" #include "android_webview/browser/scoped_allow_wait_for_legacy_web_view_api.h" +#include "android_webview/common/aw_switches.h" #include "android_webview/lib/aw_browser_dependency_factory_impl.h" #include "android_webview/native/aw_quota_manager_bridge_impl.h" #include "android_webview/native/aw_web_contents_view_delegate.h" @@ -75,6 +76,10 @@ bool AwMainDelegate::BasicStartupComplete(int* exit_code) { // WebRTC hardware decoding is not supported, internal bug 15075307 cl->AppendSwitch(switches::kDisableWebRtcHWDecoding); + + if (cl->HasSwitch(switches::kDisableRecordDocumentWorkaround)) + content::SynchronousCompositor::DisableRecordFullLayer(); + return false; } diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc index 61dce74..5d54574 100644 --- a/cc/layers/picture_layer.cc +++ b/cc/layers/picture_layer.cc @@ -116,7 +116,7 @@ bool PictureLayer::Update(ResourceUpdateQueue* queue, pending_invalidation_.Swap(&pile_invalidation_); pending_invalidation_.Clear(); - if (layer_tree_host()->settings().using_synchronous_renderer_compositor) { + if (layer_tree_host()->settings().record_full_layer) { // Workaround for http://crbug.com/235910 - to retain backwards compat // the full page content must always be provided in the picture layer. visible_layer_rect = gfx::Rect(bounds()); diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc index 4b56d7c..ec40905 100644 --- a/cc/trees/layer_tree_settings.cc +++ b/cc/trees/layer_tree_settings.cc @@ -64,7 +64,8 @@ LayerTreeSettings::LayerTreeSettings() use_rgba_4444_textures(false), touch_hit_testing(true), texture_id_allocation_chunk_size(64), - use_occlusion_for_tile_prioritization(false) { + use_occlusion_for_tile_prioritization(false), + record_full_layer(false) { } LayerTreeSettings::~LayerTreeSettings() {} diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h index 21d72c9..3624b97 100644 --- a/cc/trees/layer_tree_settings.h +++ b/cc/trees/layer_tree_settings.h @@ -80,6 +80,7 @@ class CC_EXPORT LayerTreeSettings { bool touch_hit_testing; size_t texture_id_allocation_chunk_size; bool use_occlusion_for_tile_prioritization; + bool record_full_layer; LayerTreeDebugState initial_debug_state; }; diff --git a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc index 7c5646e..4449ca1 100644 --- a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc +++ b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc @@ -123,7 +123,8 @@ class VideoContextProvider using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl; SynchronousCompositorFactoryImpl::SynchronousCompositorFactoryImpl() - : num_hardware_compositors_(0) { + : record_full_layer_(true), + num_hardware_compositors_(0) { SynchronousCompositorFactory::SetInstance(this); } @@ -134,6 +135,11 @@ SynchronousCompositorFactoryImpl::GetCompositorMessageLoop() { return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); } +bool +SynchronousCompositorFactoryImpl::RecordFullLayer() { + return record_full_layer_; +} + scoped_ptr SynchronousCompositorFactoryImpl::CreateOutputSurface(int routing_id) { scoped_ptr output_surface( @@ -240,4 +246,8 @@ void SynchronousCompositorFactoryImpl::SetDeferredGpuService( service_ = service; } +void SynchronousCompositorFactoryImpl::DisableRecordFullLayer() { + record_full_layer_ = false; +} + } // namespace content diff --git a/content/browser/android/in_process/synchronous_compositor_factory_impl.h b/content/browser/android/in_process/synchronous_compositor_factory_impl.h index 7fdc910..5565da9 100644 --- a/content/browser/android/in_process/synchronous_compositor_factory_impl.h +++ b/content/browser/android/in_process/synchronous_compositor_factory_impl.h @@ -32,6 +32,7 @@ class SynchronousCompositorFactoryImpl : public SynchronousCompositorFactory { // SynchronousCompositorFactory virtual scoped_refptr GetCompositorMessageLoop() OVERRIDE; + virtual bool RecordFullLayer() OVERRIDE; virtual scoped_ptr CreateOutputSurface(int routing_id) OVERRIDE; virtual InputHandlerManagerClient* GetInputHandlerManagerClient() OVERRIDE; @@ -49,6 +50,7 @@ class SynchronousCompositorFactoryImpl : public SynchronousCompositorFactory { void SetDeferredGpuService( scoped_refptr service); + void DisableRecordFullLayer(); void CompositorInitializedHardwareDraw(); void CompositorReleasedHardwareDraw(); @@ -71,6 +73,8 @@ class SynchronousCompositorFactoryImpl : public SynchronousCompositorFactory { scoped_refptr video_context_provider_; + bool record_full_layer_; + // |num_hardware_compositor_lock_| is updated on UI thread only but can be // read on renderer main thread. base::Lock num_hardware_compositor_lock_; diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc index d7b3eb7..7a40281 100644 --- a/content/browser/android/in_process/synchronous_compositor_impl.cc +++ b/content/browser/android/in_process/synchronous_compositor_impl.cc @@ -89,6 +89,11 @@ void SynchronousCompositor::SetGpuService( g_factory.Get().SetDeferredGpuService(service); } +// static +void SynchronousCompositor::DisableRecordFullLayer() { + g_factory.Get().DisableRecordFullLayer(); +} + bool SynchronousCompositorImpl::InitializeHwDraw() { DCHECK(CalledOnValidThread()); DCHECK(output_surface_); diff --git a/content/public/browser/android/synchronous_compositor.h b/content/public/browser/android/synchronous_compositor.h index 6aaa213..2bec50f 100644 --- a/content/public/browser/android/synchronous_compositor.h +++ b/content/public/browser/android/synchronous_compositor.h @@ -63,6 +63,11 @@ class CONTENT_EXPORT SynchronousCompositor { static void SetGpuService( scoped_refptr service); + // By default, synchronous compopsitor records the full layer, not only + // what is inside and around the view port. Call this on start up to revert + // to default behavior when synchronous compositor is not used. + static void DisableRecordFullLayer(); + // Synchronously initialize compositor for hardware draw. Can only be called // while compositor is in software only mode, either after compositor is // first created or after ReleaseHwDraw is called. It is invalid to diff --git a/content/renderer/android/synchronous_compositor_factory.h b/content/renderer/android/synchronous_compositor_factory.h index 58785bb..88908ba 100644 --- a/content/renderer/android/synchronous_compositor_factory.h +++ b/content/renderer/android/synchronous_compositor_factory.h @@ -42,6 +42,7 @@ class SynchronousCompositorFactory { virtual scoped_refptr GetCompositorMessageLoop() = 0; + virtual bool RecordFullLayer() = 0; virtual scoped_ptr CreateOutputSurface( int routing_id) = 0; diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index 67e26fa..9ad22b5 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc @@ -41,6 +41,10 @@ #include "ui/gl/gl_switches.h" #include "ui/native_theme/native_theme_switches.h" +#if defined(OS_ANDROID) +#include "content/renderer/android/synchronous_compositor_factory.h" +#endif + namespace base { class Value; } @@ -123,10 +127,7 @@ scoped_ptr RenderWidgetCompositor::Create( !cmd->HasSwitch(cc::switches::kDisableMainFrameBeforeActivation); settings.main_frame_before_draw_enabled = !cmd->HasSwitch(cc::switches::kDisableMainFrameBeforeDraw); - settings.using_synchronous_renderer_compositor = - widget->UsingSynchronousRendererCompositor(); - settings.report_overscroll_only_for_scrollable_axes = - !widget->UsingSynchronousRendererCompositor(); + settings.report_overscroll_only_for_scrollable_axes = true; settings.accelerated_animation_enabled = !cmd->HasSwitch(cc::switches::kDisableThreadedAnimation); settings.touch_hit_testing = @@ -284,8 +285,18 @@ scoped_ptr RenderWidgetCompositor::Create( cmd->HasSwitch(cc::switches::kStrictLayerPropertyChangeChecking); #if defined(OS_ANDROID) + SynchronousCompositorFactory* synchronous_compositor_factory = + SynchronousCompositorFactory::GetInstance(); + + settings.using_synchronous_renderer_compositor = + synchronous_compositor_factory; + settings.record_full_layer = + synchronous_compositor_factory && + synchronous_compositor_factory->RecordFullLayer(); + settings.report_overscroll_only_for_scrollable_axes = + !synchronous_compositor_factory; settings.max_partial_texture_updates = 0; - if (widget->UsingSynchronousRendererCompositor()) { + if (synchronous_compositor_factory) { // Android WebView uses system scrollbars, so make ours invisible. settings.scrollbar_animator = cc::LayerTreeSettings::NoAnimator; settings.solid_color_scrollbar_color = SK_ColorTRANSPARENT; @@ -298,13 +309,13 @@ scoped_ptr RenderWidgetCompositor::Create( settings.highp_threshold_min = 2048; // Android WebView handles root layer flings itself. settings.ignore_root_layer_flings = - widget->UsingSynchronousRendererCompositor(); + synchronous_compositor_factory; // RGBA_4444 textures are only enabled for low end devices // and are disabled for Android WebView as it doesn't support the format. settings.use_rgba_4444_textures = base::SysInfo::IsLowEndDevice() && - !widget->UsingSynchronousRendererCompositor(); - if (widget->UsingSynchronousRendererCompositor()) { + !synchronous_compositor_factory; + if (synchronous_compositor_factory) { // TODO(boliu): Set this ratio for Webview. } else if (base::SysInfo::IsLowEndDevice()) { // On low-end we want to be very carefull about killing other @@ -319,7 +330,7 @@ scoped_ptr RenderWidgetCompositor::Create( } // Webview does not own the surface so should not clear it. settings.should_clear_root_render_pass = - !widget->UsingSynchronousRendererCompositor(); + !synchronous_compositor_factory; #elif !defined(OS_MACOSX) if (ui::IsOverlayScrollbarEnabled()) { diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index bbe9767..cb8676c 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -3524,9 +3524,8 @@ WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer( } scoped_refptr stream_texture_factory; - if (GetRenderWidget()->UsingSynchronousRendererCompositor()) { - SynchronousCompositorFactory* factory = - SynchronousCompositorFactory::GetInstance(); + if (SynchronousCompositorFactory* factory = + SynchronousCompositorFactory::GetInstance()) { stream_texture_factory = factory->CreateStreamTextureFactory(routing_id_); } else { scoped_refptr context_provider = diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 93efaa5..d5549fb 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc @@ -505,14 +505,6 @@ void RenderWidget::SetSwappedOut(bool is_swapped_out) { RenderProcess::current()->AddRefProcess(); } -bool RenderWidget::UsingSynchronousRendererCompositor() const { -#if defined(OS_ANDROID) - return SynchronousCompositorFactory::GetInstance() != NULL; -#else - return false; -#endif -} - void RenderWidget::EnableScreenMetricsEmulation( const WebDeviceEmulationParams& params) { if (!screen_metrics_emulator_) diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index 86d70ef..d58603d 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h @@ -214,8 +214,6 @@ class CONTENT_EXPORT RenderWidget // we should not send an extra ack (see SendAckForMouseMoveFromDebugger). void IgnoreAckForMouseMoveFromDebugger(); - bool UsingSynchronousRendererCompositor() const; - // ScreenMetricsEmulator class manages screen emulation inside a render // widget. This includes resizing, placing view on the screen at desired // position, changing device scale factor, and scaling down the whole -- cgit v1.1