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