render_widget_compositor.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
13291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// Copyright (c) 2013 The Chromium Authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Use of this source code is governed by a BSD-style license that can be
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// found in the LICENSE file.
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "content/renderer/gpu/render_widget_compositor.h"
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <limits>
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <string>
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#if defined(OS_ANDROID)
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/android/sys_utils.h"
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/command_line.h"
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/logging.h"
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/strings/string_number_conversions.h"
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/synchronization/lock.h"
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/time/time.h"
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/values.h"
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/base/switches.h"
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/debug/layer_tree_debug_state.h"
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/debug/micro_benchmark.h"
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/layers/layer.h"
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/trees/layer_tree_host.h"
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "content/common/gpu/client/context_provider_command_buffer.h"
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "content/public/common/content_switches.h"
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "content/renderer/gpu/input_handler_manager.h"
283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "content/renderer/render_thread_impl.h"
293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "third_party/WebKit/public/platform/WebSize.h"
303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "third_party/WebKit/public/web/WebWidget.h"
313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "ui/gl/gl_switches.h"
323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "webkit/renderer/compositor_bindings/web_layer_impl.h"
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgnamespace base {
353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgclass Value;
363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgnamespace cc {
393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgclass Layer;
403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgusing WebKit::WebFloatPoint;
43using WebKit::WebSize;
44using WebKit::WebRect;
45
46namespace content {
47namespace {
48
49bool GetSwitchValueAsInt(
50    const CommandLine& command_line,
51    const std::string& switch_string,
52    int min_value,
53    int max_value,
54    int* result) {
55  std::string string_value = command_line.GetSwitchValueASCII(switch_string);
56  int int_value;
57  if (base::StringToInt(string_value, &int_value) &&
58      int_value >= min_value && int_value <= max_value) {
59    *result = int_value;
60    return true;
61  } else {
62    LOG(WARNING) << "Failed to parse switch " << switch_string  << ": " <<
63        string_value;
64    return false;
65  }
66}
67
68bool GetSwitchValueAsFloat(
69    const CommandLine& command_line,
70    const std::string& switch_string,
71    float min_value,
72    float max_value,
73    float* result) {
74  std::string string_value = command_line.GetSwitchValueASCII(switch_string);
75  double double_value;
76  if (base::StringToDouble(string_value, &double_value) &&
77      double_value >= min_value && double_value <= max_value) {
78    *result = static_cast<float>(double_value);
79    return true;
80  } else {
81    LOG(WARNING) << "Failed to parse switch " << switch_string  << ": " <<
82        string_value;
83    return false;
84  }
85}
86
87
88}  // namespace
89
90// static
91scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create(
92    RenderWidget* widget,
93    bool threaded) {
94  scoped_ptr<RenderWidgetCompositor> compositor(
95      new RenderWidgetCompositor(widget, threaded));
96
97  CommandLine* cmd = CommandLine::ForCurrentProcess();
98
99  cc::LayerTreeSettings settings;
100
101  // For web contents, layer transforms should scale up the contents of layers
102  // to keep content always crisp when possible.
103  settings.layer_transforms_should_scale_layer_contents = true;
104
105  settings.throttle_frame_production =
106      !cmd->HasSwitch(switches::kDisableGpuVsync);
107  settings.begin_frame_scheduling_enabled =
108      cmd->HasSwitch(switches::kEnableBeginFrameScheduling);
109  settings.deadline_scheduling_enabled =
110      cmd->HasSwitch(switches::kEnableDeadlineScheduling) &&
111      !cmd->HasSwitch(switches::kDisableDeadlineScheduling);
112  settings.using_synchronous_renderer_compositor =
113      widget->UsingSynchronousRendererCompositor();
114  settings.per_tile_painting_enabled =
115      cmd->HasSwitch(cc::switches::kEnablePerTilePainting);
116  settings.accelerated_animation_enabled =
117      !cmd->HasSwitch(cc::switches::kDisableThreadedAnimation);
118  settings.force_direct_layer_drawing =
119      cmd->HasSwitch(cc::switches::kForceDirectLayerDrawing);
120  settings.touch_hit_testing =
121      !cmd->HasSwitch(cc::switches::kDisableCompositorTouchHitTesting);
122
123  int default_tile_width = settings.default_tile_size.width();
124  if (cmd->HasSwitch(switches::kDefaultTileWidth)) {
125    GetSwitchValueAsInt(*cmd, switches::kDefaultTileWidth, 1,
126                        std::numeric_limits<int>::max(), &default_tile_width);
127  }
128  int default_tile_height = settings.default_tile_size.height();
129  if (cmd->HasSwitch(switches::kDefaultTileHeight)) {
130    GetSwitchValueAsInt(*cmd, switches::kDefaultTileHeight, 1,
131                        std::numeric_limits<int>::max(), &default_tile_height);
132  }
133  settings.default_tile_size = gfx::Size(default_tile_width,
134                                         default_tile_height);
135
136  int max_untiled_layer_width = settings.max_untiled_layer_size.width();
137  if (cmd->HasSwitch(switches::kMaxUntiledLayerWidth)) {
138    GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerWidth, 1,
139                        std::numeric_limits<int>::max(),
140                        &max_untiled_layer_width);
141  }
142  int max_untiled_layer_height = settings.max_untiled_layer_size.height();
143  if (cmd->HasSwitch(switches::kMaxUntiledLayerHeight)) {
144    GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerHeight, 1,
145                        std::numeric_limits<int>::max(),
146                        &max_untiled_layer_height);
147  }
148
149  settings.max_untiled_layer_size = gfx::Size(max_untiled_layer_width,
150                                           max_untiled_layer_height);
151
152  settings.impl_side_painting = cc::switches::IsImplSidePaintingEnabled();
153
154  settings.calculate_top_controls_position =
155      cmd->HasSwitch(cc::switches::kEnableTopControlsPositionCalculation);
156  if (cmd->HasSwitch(cc::switches::kTopControlsHeight)) {
157    std::string controls_height_str =
158        cmd->GetSwitchValueASCII(cc::switches::kTopControlsHeight);
159    double controls_height;
160    if (base::StringToDouble(controls_height_str, &controls_height) &&
161        controls_height > 0)
162      settings.top_controls_height = controls_height;
163  }
164
165  if (settings.calculate_top_controls_position &&
166      settings.top_controls_height <= 0) {
167    DCHECK(false)
168        << "Top controls repositioning enabled without valid height set.";
169    settings.calculate_top_controls_position = false;
170  }
171
172  if (cmd->HasSwitch(cc::switches::kTopControlsShowThreshold)) {
173      std::string top_threshold_str =
174          cmd->GetSwitchValueASCII(cc::switches::kTopControlsShowThreshold);
175      double show_threshold;
176      if (base::StringToDouble(top_threshold_str, &show_threshold) &&
177          show_threshold >= 0.f && show_threshold <= 1.f)
178        settings.top_controls_show_threshold = show_threshold;
179  }
180
181  if (cmd->HasSwitch(cc::switches::kTopControlsHideThreshold)) {
182      std::string top_threshold_str =
183          cmd->GetSwitchValueASCII(cc::switches::kTopControlsHideThreshold);
184      double hide_threshold;
185      if (base::StringToDouble(top_threshold_str, &hide_threshold) &&
186          hide_threshold >= 0.f && hide_threshold <= 1.f)
187        settings.top_controls_hide_threshold = hide_threshold;
188  }
189
190  settings.partial_swap_enabled = widget->AllowPartialSwap() &&
191      cmd->HasSwitch(cc::switches::kEnablePartialSwap);
192  settings.background_color_instead_of_checkerboard =
193      cmd->HasSwitch(cc::switches::kBackgroundColorInsteadOfCheckerboard);
194  settings.show_overdraw_in_tracing =
195      cmd->HasSwitch(cc::switches::kTraceOverdraw);
196  settings.can_use_lcd_text = cc::switches::IsLCDTextEnabled();
197  settings.use_pinch_virtual_viewport =
198      cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport);
199  settings.allow_antialiasing &=
200      !cmd->HasSwitch(cc::switches::kDisableCompositedAntialiasing);
201
202  // These flags should be mirrored by UI versions in ui/compositor/.
203  settings.initial_debug_state.show_debug_borders =
204      cmd->HasSwitch(cc::switches::kShowCompositedLayerBorders);
205  settings.initial_debug_state.show_fps_counter =
206      cmd->HasSwitch(cc::switches::kShowFPSCounter);
207  settings.initial_debug_state.show_paint_rects =
208      cmd->HasSwitch(switches::kShowPaintRects);
209  settings.initial_debug_state.show_property_changed_rects =
210      cmd->HasSwitch(cc::switches::kShowPropertyChangedRects);
211  settings.initial_debug_state.show_surface_damage_rects =
212      cmd->HasSwitch(cc::switches::kShowSurfaceDamageRects);
213  settings.initial_debug_state.show_screen_space_rects =
214      cmd->HasSwitch(cc::switches::kShowScreenSpaceRects);
215  settings.initial_debug_state.show_replica_screen_space_rects =
216      cmd->HasSwitch(cc::switches::kShowReplicaScreenSpaceRects);
217  settings.initial_debug_state.show_occluding_rects =
218      cmd->HasSwitch(cc::switches::kShowOccludingRects);
219  settings.initial_debug_state.show_non_occluding_rects =
220      cmd->HasSwitch(cc::switches::kShowNonOccludingRects);
221
222  settings.initial_debug_state.SetRecordRenderingStats(
223      cmd->HasSwitch(switches::kEnableGpuBenchmarking));
224
225  if (cmd->HasSwitch(cc::switches::kSlowDownRasterScaleFactor)) {
226    const int kMinSlowDownScaleFactor = 0;
227    const int kMaxSlowDownScaleFactor = INT_MAX;
228    GetSwitchValueAsInt(
229        *cmd,
230        cc::switches::kSlowDownRasterScaleFactor,
231        kMinSlowDownScaleFactor,
232        kMaxSlowDownScaleFactor,
233        &settings.initial_debug_state.slow_down_raster_scale_factor);
234  }
235
236  if (cmd->HasSwitch(cc::switches::kNumRasterThreads)) {
237    const int kMinRasterThreads = 1;
238    const int kMaxRasterThreads = 64;
239    int num_raster_threads;
240    if (GetSwitchValueAsInt(*cmd, cc::switches::kNumRasterThreads,
241                            kMinRasterThreads, kMaxRasterThreads,
242                            &num_raster_threads))
243      settings.num_raster_threads = num_raster_threads;
244  }
245
246  if (cmd->HasSwitch(cc::switches::kLowResolutionContentsScaleFactor)) {
247    const int kMinScaleFactor = settings.minimum_contents_scale;
248    const int kMaxScaleFactor = 1;
249    GetSwitchValueAsFloat(*cmd,
250                          cc::switches::kLowResolutionContentsScaleFactor,
251                          kMinScaleFactor, kMaxScaleFactor,
252                          &settings.low_res_contents_scale_factor);
253  }
254
255  if (cmd->HasSwitch(cc::switches::kMaxTilesForInterestArea)) {
256    int max_tiles_for_interest_area;
257    if (GetSwitchValueAsInt(*cmd,
258                            cc::switches::kMaxTilesForInterestArea,
259                            1, std::numeric_limits<int>::max(),
260                            &max_tiles_for_interest_area))
261      settings.max_tiles_for_interest_area = max_tiles_for_interest_area;
262  }
263
264  if (cmd->HasSwitch(cc::switches::kMaxUnusedResourceMemoryUsagePercentage)) {
265    int max_unused_resource_memory_percentage;
266    if (GetSwitchValueAsInt(
267            *cmd,
268            cc::switches::kMaxUnusedResourceMemoryUsagePercentage,
269            0, 100,
270            &max_unused_resource_memory_percentage)) {
271      settings.max_unused_resource_memory_percentage =
272          max_unused_resource_memory_percentage;
273    }
274  }
275
276  settings.strict_layer_property_change_checking =
277      cmd->HasSwitch(cc::switches::kStrictLayerPropertyChangeChecking);
278
279  settings.use_map_image = cc::switches::IsMapImageEnabled();
280
281#if defined(OS_ANDROID)
282  // TODO(danakj): Move these to the android code.
283  settings.max_partial_texture_updates = 0;
284  settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
285  settings.solid_color_scrollbars = true;
286  settings.solid_color_scrollbar_color =
287      cmd->HasSwitch(switches::kHideScrollbars)
288          ? SK_ColorTRANSPARENT
289          : SkColorSetARGB(128, 128, 128, 128);
290  settings.highp_threshold_min = 2048;
291  // Android WebView handles root layer flings itself.
292  settings.ignore_root_layer_flings =
293      widget->UsingSynchronousRendererCompositor();
294  settings.always_overscroll = widget->UsingSynchronousRendererCompositor();
295  // RGBA_4444 textures are only enabled for low end devices
296  // and are disabled for Android WebView as it doesn't support the format.
297  settings.use_rgba_4444_textures =
298      base::android::SysUtils::IsLowEndDevice() &&
299      !widget->UsingSynchronousRendererCompositor() &&
300      !cmd->HasSwitch(cc::switches::kDisable4444Textures);
301#elif !defined(OS_MACOSX)
302  if (cmd->HasSwitch(switches::kEnableOverlayScrollbars)) {
303    settings.scrollbar_animator = cc::LayerTreeSettings::Thinning;
304    settings.solid_color_scrollbars = true;
305  }
306  if (cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport) ||
307      cmd->HasSwitch(switches::kEnableOverlayScrollbars)) {
308    settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
309  }
310#endif
311
312  if (!compositor->initialize(settings))
313    return scoped_ptr<RenderWidgetCompositor>();
314
315  return compositor.Pass();
316}
317
318RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget,
319                                               bool threaded)
320    : threaded_(threaded),
321      suppress_schedule_composite_(false),
322      widget_(widget) {
323}
324
325RenderWidgetCompositor::~RenderWidgetCompositor() {}
326
327const base::WeakPtr<cc::InputHandler>&
328RenderWidgetCompositor::GetInputHandler() {
329  return layer_tree_host_->GetInputHandler();
330}
331
332void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) {
333  if (suppress_schedule_composite_ == suppress)
334    return;
335
336  if (suppress)
337    TRACE_EVENT_ASYNC_BEGIN0("gpu",
338        "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
339  else
340    TRACE_EVENT_ASYNC_END0("gpu",
341        "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
342  suppress_schedule_composite_ = suppress;
343}
344
345void RenderWidgetCompositor::Animate(base::TimeTicks time) {
346  layer_tree_host_->UpdateClientAnimations(time);
347}
348
349void RenderWidgetCompositor::Composite(base::TimeTicks frame_begin_time) {
350  layer_tree_host_->Composite(frame_begin_time);
351}
352
353void RenderWidgetCompositor::SetNeedsDisplayOnAllLayers() {
354  layer_tree_host_->SetNeedsDisplayOnAllLayers();
355}
356
357void RenderWidgetCompositor::SetRasterizeOnlyVisibleContent() {
358  cc::LayerTreeDebugState current = layer_tree_host_->debug_state();
359  current.rasterize_only_visible_content = true;
360  layer_tree_host_->SetDebugState(current);
361}
362
363void RenderWidgetCompositor::GetRenderingStats(cc::RenderingStats* stats) {
364  layer_tree_host_->CollectRenderingStats(stats);
365}
366
367void RenderWidgetCompositor::UpdateTopControlsState(
368    cc::TopControlsState constraints,
369    cc::TopControlsState current,
370    bool animate) {
371  layer_tree_host_->UpdateTopControlsState(constraints,
372                                           current,
373                                           animate);
374}
375
376void RenderWidgetCompositor::SetOverdrawBottomHeight(
377    float overdraw_bottom_height) {
378  layer_tree_host_->SetOverdrawBottomHeight(overdraw_bottom_height);
379}
380
381void RenderWidgetCompositor::SetNeedsRedrawRect(gfx::Rect damage_rect) {
382  layer_tree_host_->SetNeedsRedrawRect(damage_rect);
383}
384
385void RenderWidgetCompositor::SetNeedsForcedRedraw() {
386  layer_tree_host_->SetNextCommitForcesRedraw();
387  setNeedsRedraw();
388}
389
390void RenderWidgetCompositor::SetLatencyInfo(
391    const ui::LatencyInfo& latency_info) {
392  layer_tree_host_->SetLatencyInfo(latency_info);
393}
394
395int RenderWidgetCompositor::GetLayerTreeId() const {
396  return layer_tree_host_->id();
397}
398
399void RenderWidgetCompositor::NotifyInputThrottledUntilCommit() {
400  layer_tree_host_->NotifyInputThrottledUntilCommit();
401}
402
403const cc::Layer* RenderWidgetCompositor::GetRootLayer() const {
404  return layer_tree_host_->root_layer();
405}
406
407bool RenderWidgetCompositor::ScheduleMicroBenchmark(
408    const std::string& name,
409    const base::Callback<void(scoped_ptr<base::Value>)>& callback) {
410  return layer_tree_host_->ScheduleMicroBenchmark(name, callback);
411}
412
413bool RenderWidgetCompositor::initialize(cc::LayerTreeSettings settings) {
414  scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy =
415      RenderThreadImpl::current()->compositor_message_loop_proxy();
416  layer_tree_host_ = cc::LayerTreeHost::Create(this,
417                                               settings,
418                                               compositor_message_loop_proxy);
419  return layer_tree_host_;
420}
421
422void RenderWidgetCompositor::setSurfaceReady() {
423  layer_tree_host_->SetLayerTreeHostClientReady();
424}
425
426void RenderWidgetCompositor::setRootLayer(const WebKit::WebLayer& layer) {
427  layer_tree_host_->SetRootLayer(
428      static_cast<const webkit::WebLayerImpl*>(&layer)->layer());
429}
430
431void RenderWidgetCompositor::clearRootLayer() {
432  layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>());
433}
434
435void RenderWidgetCompositor::setViewportSize(
436    const WebSize&,
437    const WebSize& device_viewport_size) {
438  layer_tree_host_->SetViewportSize(device_viewport_size);
439}
440
441WebSize RenderWidgetCompositor::layoutViewportSize() const {
442  return layer_tree_host_->device_viewport_size();
443}
444
445WebSize RenderWidgetCompositor::deviceViewportSize() const {
446  return layer_tree_host_->device_viewport_size();
447}
448
449WebFloatPoint RenderWidgetCompositor::adjustEventPointForPinchZoom(
450    const WebFloatPoint& point) const {
451  return point;
452}
453
454void RenderWidgetCompositor::setDeviceScaleFactor(float device_scale) {
455  layer_tree_host_->SetDeviceScaleFactor(device_scale);
456}
457
458float RenderWidgetCompositor::deviceScaleFactor() const {
459  return layer_tree_host_->device_scale_factor();
460}
461
462void RenderWidgetCompositor::setBackgroundColor(WebKit::WebColor color) {
463  layer_tree_host_->set_background_color(color);
464}
465
466void RenderWidgetCompositor::setHasTransparentBackground(bool transparent) {
467  layer_tree_host_->set_has_transparent_background(transparent);
468}
469
470void RenderWidgetCompositor::setOverhangBitmap(const SkBitmap& bitmap) {
471  layer_tree_host_->SetOverhangBitmap(bitmap);
472}
473
474void RenderWidgetCompositor::setVisible(bool visible) {
475  layer_tree_host_->SetVisible(visible);
476}
477
478void RenderWidgetCompositor::setPageScaleFactorAndLimits(
479    float page_scale_factor, float minimum, float maximum) {
480  layer_tree_host_->SetPageScaleFactorAndLimits(
481      page_scale_factor, minimum, maximum);
482}
483
484void RenderWidgetCompositor::startPageScaleAnimation(
485    const WebKit::WebPoint& destination,
486    bool use_anchor,
487    float new_page_scale,
488    double duration_sec) {
489  base::TimeDelta duration = base::TimeDelta::FromMicroseconds(
490      duration_sec * base::Time::kMicrosecondsPerSecond);
491  layer_tree_host_->StartPageScaleAnimation(
492      gfx::Vector2d(destination.x, destination.y),
493      use_anchor,
494      new_page_scale,
495      duration);
496}
497
498void RenderWidgetCompositor::setNeedsAnimate() {
499  layer_tree_host_->SetNeedsAnimate();
500}
501
502void RenderWidgetCompositor::setNeedsRedraw() {
503  if (threaded_)
504    layer_tree_host_->SetNeedsAnimate();
505  else
506    widget_->scheduleAnimation();
507}
508
509bool RenderWidgetCompositor::commitRequested() const {
510  return layer_tree_host_->CommitRequested();
511}
512
513void RenderWidgetCompositor::didStopFlinging() {
514  layer_tree_host_->DidStopFlinging();
515}
516
517void RenderWidgetCompositor::registerForAnimations(WebKit::WebLayer* layer) {
518  cc::Layer* cc_layer = static_cast<webkit::WebLayerImpl*>(layer)->layer();
519  cc_layer->layer_animation_controller()->SetAnimationRegistrar(
520      layer_tree_host_->animation_registrar());
521}
522
523void RenderWidgetCompositor::registerViewportLayers(
524    const WebKit::WebLayer* pageScaleLayer,
525    const WebKit::WebLayer* innerViewportScrollLayer,
526    const WebKit::WebLayer* outerViewportScrollLayer) {
527  layer_tree_host_->RegisterViewportLayers(
528      static_cast<const webkit::WebLayerImpl*>(pageScaleLayer)->layer(),
529      static_cast<const webkit::WebLayerImpl*>(innerViewportScrollLayer)
530          ->layer(),
531      // The outer viewport layer will only exist when using pinch virtual
532      // viewports.
533      outerViewportScrollLayer ? static_cast<const webkit::WebLayerImpl*>(
534                                     outerViewportScrollLayer)->layer()
535                               : NULL);
536}
537
538void RenderWidgetCompositor::clearViewportLayers() {
539  layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(),
540                                           scoped_refptr<cc::Layer>(),
541                                           scoped_refptr<cc::Layer>());
542}
543
544bool RenderWidgetCompositor::compositeAndReadback(
545    void *pixels, const WebRect& rect_in_device_viewport) {
546  return layer_tree_host_->CompositeAndReadback(pixels,
547                                                rect_in_device_viewport);
548}
549
550void RenderWidgetCompositor::finishAllRendering() {
551  layer_tree_host_->FinishAllRendering();
552}
553
554void RenderWidgetCompositor::setDeferCommits(bool defer_commits) {
555  layer_tree_host_->SetDeferCommits(defer_commits);
556}
557
558void RenderWidgetCompositor::setShowFPSCounter(bool show) {
559  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
560  debug_state.show_fps_counter = show;
561  layer_tree_host_->SetDebugState(debug_state);
562}
563
564void RenderWidgetCompositor::setShowPaintRects(bool show) {
565  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
566  debug_state.show_paint_rects = show;
567  layer_tree_host_->SetDebugState(debug_state);
568}
569
570void RenderWidgetCompositor::setShowDebugBorders(bool show) {
571  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
572  debug_state.show_debug_borders = show;
573  layer_tree_host_->SetDebugState(debug_state);
574}
575
576void RenderWidgetCompositor::setContinuousPaintingEnabled(bool enabled) {
577  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
578  debug_state.continuous_painting = enabled;
579  layer_tree_host_->SetDebugState(debug_state);
580}
581
582void RenderWidgetCompositor::setShowScrollBottleneckRects(bool show) {
583  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
584  debug_state.show_touch_event_handler_rects = show;
585  debug_state.show_wheel_event_handler_rects = show;
586  debug_state.show_non_fast_scrollable_rects = show;
587  layer_tree_host_->SetDebugState(debug_state);
588}
589
590void RenderWidgetCompositor::WillBeginFrame() {
591  widget_->InstrumentWillBeginFrame();
592  widget_->willBeginCompositorFrame();
593}
594
595void RenderWidgetCompositor::DidBeginFrame() {
596  widget_->InstrumentDidBeginFrame();
597}
598
599void RenderWidgetCompositor::Animate(double frame_begin_time) {
600  widget_->webwidget()->animate(frame_begin_time);
601}
602
603void RenderWidgetCompositor::Layout() {
604  widget_->webwidget()->layout();
605}
606
607void RenderWidgetCompositor::ApplyScrollAndScale(gfx::Vector2d scroll_delta,
608                                                 float page_scale) {
609  widget_->webwidget()->applyScrollAndScale(scroll_delta, page_scale);
610}
611
612scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::CreateOutputSurface(
613    bool fallback) {
614  return widget_->CreateOutputSurface(fallback);
615}
616
617void RenderWidgetCompositor::DidInitializeOutputSurface(bool success) {
618  if (!success)
619    widget_->webwidget()->didExitCompositingMode();
620}
621
622void RenderWidgetCompositor::WillCommit() {
623  widget_->InstrumentWillComposite();
624}
625
626void RenderWidgetCompositor::DidCommit() {
627  widget_->DidCommitCompositorFrame();
628  widget_->didBecomeReadyForAdditionalInput();
629}
630
631void RenderWidgetCompositor::DidCommitAndDrawFrame() {
632  widget_->didCommitAndDrawCompositorFrame();
633}
634
635void RenderWidgetCompositor::DidCompleteSwapBuffers() {
636  widget_->didCompleteSwapBuffers();
637}
638
639void RenderWidgetCompositor::ScheduleComposite() {
640  if (!suppress_schedule_composite_)
641    widget_->scheduleComposite();
642}
643
644scoped_refptr<cc::ContextProvider>
645RenderWidgetCompositor::OffscreenContextProvider() {
646  return RenderThreadImpl::current()->OffscreenCompositorContextProvider();
647}
648
649}  // namespace content
650