render_widget_compositor.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/gpu/render_widget_compositor.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <limits>
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_ANDROID)
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/android/sys_utils.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/values.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/base/latency_info_swap_promise.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/base/latency_info_swap_promise_monitor.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/switches.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/layer_tree_debug_state.h"
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/debug/micro_benchmark.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/child/child_shared_bitmap_manager.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/content_switches_internal.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/gpu/client/context_provider_command_buffer.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/input/input_handler_manager.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/render_thread_impl.h"
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_interface.h"
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h"
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebWidget.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_switches.h"
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/native_theme/native_theme_switches.h"
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/renderer/compositor_bindings/web_layer_impl.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace base {
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class Value;
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Layer;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFloatPoint;
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSize;
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRect;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetSwitchValueAsInt(
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CommandLine& command_line,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& switch_string,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int min_value,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int max_value,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int* result) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string string_value = command_line.GetSwitchValueASCII(switch_string);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int int_value;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::StringToInt(string_value, &int_value) &&
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int_value >= min_value && int_value <= max_value) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *result = int_value;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(WARNING) << "Failed to parse switch " << switch_string  << ": " <<
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        string_value;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create(
78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    RenderWidget* widget,
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    bool threaded) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RenderWidgetCompositor> compositor(
81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      new RenderWidgetCompositor(widget, threaded));
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine* cmd = CommandLine::ForCurrentProcess();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::LayerTreeSettings settings;
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // For web contents, layer transforms should scale up the contents of layers
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // to keep content always crisp when possible.
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  settings.layer_transforms_should_scale_layer_contents = true;
90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  settings.throttle_frame_production =
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      !cmd->HasSwitch(switches::kDisableGpuVsync);
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  settings.begin_impl_frame_scheduling_enabled =
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cmd->HasSwitch(switches::kEnableBeginFrameScheduling);
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.main_frame_before_activation_enabled =
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cmd->HasSwitch(cc::switches::kEnableMainFrameBeforeActivation) &&
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !cmd->HasSwitch(cc::switches::kDisableMainFrameBeforeActivation);
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.main_frame_before_draw_enabled =
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !cmd->HasSwitch(cc::switches::kDisableMainFrameBeforeDraw);
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  settings.using_synchronous_renderer_compositor =
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      widget->UsingSynchronousRendererCompositor();
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.accelerated_animation_enabled =
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !cmd->HasSwitch(cc::switches::kDisableThreadedAnimation);
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  settings.touch_hit_testing =
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !cmd->HasSwitch(cc::switches::kDisableCompositorTouchHitTesting) &&
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !cmd->HasSwitch(switches::kEnableBleedingEdgeRenderingFastPaths);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int default_tile_width = settings.default_tile_size.width();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cmd->HasSwitch(switches::kDefaultTileWidth)) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetSwitchValueAsInt(*cmd, switches::kDefaultTileWidth, 1,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        std::numeric_limits<int>::max(), &default_tile_width);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int default_tile_height = settings.default_tile_size.height();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cmd->HasSwitch(switches::kDefaultTileHeight)) {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetSwitchValueAsInt(*cmd, switches::kDefaultTileHeight, 1,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        std::numeric_limits<int>::max(), &default_tile_height);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.default_tile_size = gfx::Size(default_tile_width,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         default_tile_height);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_untiled_layer_width = settings.max_untiled_layer_size.width();
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cmd->HasSwitch(switches::kMaxUntiledLayerWidth)) {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerWidth, 1,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        std::numeric_limits<int>::max(),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        &max_untiled_layer_width);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_untiled_layer_height = settings.max_untiled_layer_size.height();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cmd->HasSwitch(switches::kMaxUntiledLayerHeight)) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerHeight, 1,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        std::numeric_limits<int>::max(),
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        &max_untiled_layer_height);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.max_untiled_layer_size = gfx::Size(max_untiled_layer_width,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           max_untiled_layer_height);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.impl_side_painting =
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      RenderThreadImpl::current()->is_impl_side_painting_enabled();
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (RenderThreadImpl::current()->is_gpu_rasterization_forced())
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings.rasterization_site = cc::LayerTreeSettings::GpuRasterization;
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  else if (RenderThreadImpl::current()->is_gpu_rasterization_enabled())
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings.rasterization_site = cc::LayerTreeSettings::HybridRasterization;
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  else
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    settings.rasterization_site = cc::LayerTreeSettings::CpuRasterization;
14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  settings.create_low_res_tiling =
14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      RenderThreadImpl::current()->is_low_res_tiling_enabled();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.calculate_top_controls_position =
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kEnableTopControlsPositionCalculation);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cmd->HasSwitch(cc::switches::kTopControlsHeight)) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string controls_height_str =
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        cmd->GetSwitchValueASCII(cc::switches::kTopControlsHeight);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double controls_height;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (base::StringToDouble(controls_height_str, &controls_height) &&
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        controls_height > 0)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      settings.top_controls_height = controls_height;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (settings.calculate_top_controls_position &&
1605e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      settings.top_controls_height <= 0) {
1615e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    DCHECK(false)
1625e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)        << "Top controls repositioning enabled without valid height set.";
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.calculate_top_controls_position = false;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cmd->HasSwitch(cc::switches::kTopControlsShowThreshold)) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string top_threshold_str =
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          cmd->GetSwitchValueASCII(cc::switches::kTopControlsShowThreshold);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      double show_threshold;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (base::StringToDouble(top_threshold_str, &show_threshold) &&
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          show_threshold >= 0.f && show_threshold <= 1.f)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.top_controls_show_threshold = show_threshold;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cmd->HasSwitch(cc::switches::kTopControlsHideThreshold)) {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string top_threshold_str =
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          cmd->GetSwitchValueASCII(cc::switches::kTopControlsHideThreshold);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      double hide_threshold;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (base::StringToDouble(top_threshold_str, &hide_threshold) &&
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          hide_threshold >= 0.f && hide_threshold <= 1.f)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.top_controls_hide_threshold = hide_threshold;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.can_use_lcd_text =
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      RenderThreadImpl::current()->is_lcd_text_enabled();
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  settings.use_pinch_virtual_viewport =
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport);
188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  settings.allow_antialiasing &=
189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      !cmd->HasSwitch(cc::switches::kDisableCompositedAntialiasing);
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These flags should be mirrored by UI versions in ui/compositor/.
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_debug_borders =
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowCompositedLayerBorders);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_fps_counter =
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowFPSCounter);
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  settings.initial_debug_state.show_layer_animation_bounds_rects =
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowLayerAnimationBounds);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_paint_rects =
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(switches::kShowPaintRects);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_property_changed_rects =
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowPropertyChangedRects);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_surface_damage_rects =
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowSurfaceDamageRects);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_screen_space_rects =
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowScreenSpaceRects);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_replica_screen_space_rects =
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowReplicaScreenSpaceRects);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_occluding_rects =
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowOccludingRects);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_non_occluding_rects =
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kShowNonOccludingRects);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.SetRecordRenderingStats(
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cmd->HasSwitch(cc::switches::kEnableGpuBenchmarking));
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cmd->HasSwitch(cc::switches::kSlowDownRasterScaleFactor)) {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int kMinSlowDownScaleFactor = 0;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int kMaxSlowDownScaleFactor = INT_MAX;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetSwitchValueAsInt(
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *cmd,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        cc::switches::kSlowDownRasterScaleFactor,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kMinSlowDownScaleFactor,
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kMaxSlowDownScaleFactor,
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &settings.initial_debug_state.slow_down_raster_scale_factor);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cmd->HasSwitch(cc::switches::kMaxTilesForInterestArea)) {
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int max_tiles_for_interest_area;
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (GetSwitchValueAsInt(*cmd,
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            cc::switches::kMaxTilesForInterestArea,
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            1, std::numeric_limits<int>::max(),
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            &max_tiles_for_interest_area))
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      settings.max_tiles_for_interest_area = max_tiles_for_interest_area;
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (cmd->HasSwitch(cc::switches::kMaxUnusedResourceMemoryUsagePercentage)) {
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int max_unused_resource_memory_percentage;
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (GetSwitchValueAsInt(
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            *cmd,
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            cc::switches::kMaxUnusedResourceMemoryUsagePercentage,
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            0, 100,
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &max_unused_resource_memory_percentage)) {
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      settings.max_unused_resource_memory_percentage =
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          max_unused_resource_memory_percentage;
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.strict_layer_property_change_checking =
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cmd->HasSwitch(cc::switches::kStrictLayerPropertyChangeChecking);
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.use_map_image = RenderThreadImpl::current()->is_map_image_enabled();
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.max_partial_texture_updates = 0;
255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  settings.solid_color_scrollbar_color =
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      (widget->UsingSynchronousRendererCompositor())  // It is Android Webview.
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          ? SK_ColorTRANSPARENT
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          : SkColorSetARGB(128, 128, 128, 128);
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  settings.highp_threshold_min = 2048;
261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Android WebView handles root layer flings itself.
262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  settings.ignore_root_layer_flings =
263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      widget->UsingSynchronousRendererCompositor();
264d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // RGBA_4444 textures are only enabled for low end devices
265d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // and are disabled for Android WebView as it doesn't support the format.
266d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  settings.use_rgba_4444_textures =
267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::android::SysUtils::IsLowEndDevice() &&
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !widget->UsingSynchronousRendererCompositor();
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (widget->UsingSynchronousRendererCompositor()) {
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(boliu): Set this ratio for Webview.
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (base::android::SysUtils::IsLowEndDevice()) {
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // On low-end we want to be very carefull about killing other
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // apps. So initially we use 50% more memory to avoid flickering
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // or raster-on-demand.
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    settings.max_memory_for_prepaint_percentage = 67;
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // On other devices we have increased memory excessively to avoid
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // raster-on-demand already, so now we reserve 50% _only_ to avoid
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // raster-on-demand, and use 50% of the memory otherwise.
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    settings.max_memory_for_prepaint_percentage = 50;
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
283c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#elif !defined(OS_MACOSX)
28423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (ui::IsOverlayScrollbarEnabled()) {
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    settings.scrollbar_animator = cc::LayerTreeSettings::Thinning;
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport)) {
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
289c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
290c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  }
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  compositor->Initialize(settings);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return compositor.Pass();
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochRenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget,
299ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                               bool threaded)
300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : threaded_(threaded),
301ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      suppress_schedule_composite_(false),
302ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      widget_(widget) {
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetCompositor::~RenderWidgetCompositor() {}
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const base::WeakPtr<cc::InputHandler>&
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RenderWidgetCompositor::GetInputHandler() {
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return layer_tree_host_->GetInputHandler();
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (suppress_schedule_composite_ == suppress)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (suppress)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0("gpu",
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_ASYNC_END0("gpu",
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suppress_schedule_composite_ = suppress;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool RenderWidgetCompositor::BeginMainFrameRequested() const {
3261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return layer_tree_host_->BeginMainFrameRequested();
3271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetCompositor::UpdateAnimations(base::TimeTicks time) {
330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layer_tree_host_->UpdateClientAnimations(time);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::Composite(base::TimeTicks frame_begin_time) {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->Composite(frame_begin_time);
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetCompositor::SetNeedsDisplayOnAllLayers() {
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_tree_host_->SetNeedsDisplayOnAllLayers();
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetCompositor::SetRasterizeOnlyVisibleContent() {
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cc::LayerTreeDebugState current = layer_tree_host_->debug_state();
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  current.rasterize_only_visible_content = true;
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  layer_tree_host_->SetDebugState(current);
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetCompositor::UpdateTopControlsState(
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    cc::TopControlsState constraints,
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    cc::TopControlsState current,
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool animate) {
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  layer_tree_host_->UpdateTopControlsState(constraints,
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                           current,
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           animate);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::SetOverdrawBottomHeight(
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float overdraw_bottom_height) {
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetOverdrawBottomHeight(overdraw_bottom_height);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderWidgetCompositor::SetNeedsRedrawRect(gfx::Rect damage_rect) {
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_tree_host_->SetNeedsRedrawRect(damage_rect);
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderWidgetCompositor::SetNeedsForcedRedraw() {
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  layer_tree_host_->SetNextCommitForcesRedraw();
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  setNeedsAnimate();
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_ptr<cc::SwapPromiseMonitor>
371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderWidgetCompositor::CreateLatencyInfoSwapPromiseMonitor(
372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::LatencyInfo* latency) {
373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return scoped_ptr<cc::SwapPromiseMonitor>(
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new cc::LatencyInfoSwapPromiseMonitor(
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          latency, layer_tree_host_.get(), NULL));
376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
377b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
378a3f7b4e666c476898878fa745f637129375cd889Ben Murdochint RenderWidgetCompositor::GetLayerTreeId() const {
379a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return layer_tree_host_->id();
380a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
381a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void RenderWidgetCompositor::NotifyInputThrottledUntilCommit() {
383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  layer_tree_host_->NotifyInputThrottledUntilCommit();
384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const cc::Layer* RenderWidgetCompositor::GetRootLayer() const {
3873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return layer_tree_host_->root_layer();
3883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool RenderWidgetCompositor::ScheduleMicroBenchmark(
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& name,
3928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_ptr<base::Value> value,
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const base::Callback<void(scoped_ptr<base::Value>)>& callback) {
3948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return layer_tree_host_->ScheduleMicroBenchmark(name, value.Pass(), callback);
3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetCompositor::Initialize(cc::LayerTreeSettings settings) {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy =
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderThreadImpl::current()->compositor_message_loop_proxy();
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (compositor_message_loop_proxy.get()) {
401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    layer_tree_host_ = cc::LayerTreeHost::CreateThreaded(
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        this,
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ChildThread::current()->shared_bitmap_manager(),
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        settings,
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        compositor_message_loop_proxy);
406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded(
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        this, this, ChildThread::current()->shared_bitmap_manager(), settings);
409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(layer_tree_host_);
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setSurfaceReady() {
414b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layer_tree_host_->SetLayerTreeHostClientReady();
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetCompositor::setRootLayer(const blink::WebLayer& layer) {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetRootLayer(
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<const webkit::WebLayerImpl*>(&layer)->layer());
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::clearRootLayer() {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>());
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setViewportSize(
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const WebSize&,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebSize& device_viewport_size) {
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_tree_host_->SetViewportSize(device_viewport_size);
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebSize RenderWidgetCompositor::layoutViewportSize() const {
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return layer_tree_host_->device_viewport_size();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebSize RenderWidgetCompositor::deviceViewportSize() const {
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_->device_viewport_size();
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebFloatPoint RenderWidgetCompositor::adjustEventPointForPinchZoom(
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebFloatPoint& point) const {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return point;
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setDeviceScaleFactor(float device_scale) {
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetDeviceScaleFactor(device_scale);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float RenderWidgetCompositor::deviceScaleFactor() const {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_->device_scale_factor();
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetCompositor::setBackgroundColor(blink::WebColor color) {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->set_background_color(color);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setHasTransparentBackground(bool transparent) {
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->set_has_transparent_background(transparent);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RenderWidgetCompositor::setOverhangBitmap(const SkBitmap& bitmap) {
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  layer_tree_host_->SetOverhangBitmap(bitmap);
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setVisible(bool visible) {
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetVisible(visible);
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setPageScaleFactorAndLimits(
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page_scale_factor, float minimum, float maximum) {
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetPageScaleFactorAndLimits(
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor, minimum, maximum);
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::startPageScaleAnimation(
476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebPoint& destination,
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool use_anchor,
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float new_page_scale,
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double duration_sec) {
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta duration = base::TimeDelta::FromMicroseconds(
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      duration_sec * base::Time::kMicrosecondsPerSecond);
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->StartPageScaleAnimation(
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Vector2d(destination.x, destination.y),
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      use_anchor,
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_page_scale,
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      duration);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setNeedsAnimate() {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetNeedsAnimate();
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetCompositor::commitRequested() const {
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_->CommitRequested();
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::didStopFlinging() {
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->DidStopFlinging();
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetCompositor::registerForAnimations(blink::WebLayer* layer) {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::Layer* cc_layer = static_cast<webkit::WebLayerImpl*>(layer)->layer();
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc_layer->layer_animation_controller()->SetAnimationRegistrar(
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_tree_host_->animation_registrar());
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
507d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RenderWidgetCompositor::registerViewportLayers(
508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebLayer* pageScaleLayer,
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebLayer* innerViewportScrollLayer,
510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebLayer* outerViewportScrollLayer) {
511d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  layer_tree_host_->RegisterViewportLayers(
512d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      static_cast<const webkit::WebLayerImpl*>(pageScaleLayer)->layer(),
513d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      static_cast<const webkit::WebLayerImpl*>(innerViewportScrollLayer)
514d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          ->layer(),
515d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // The outer viewport layer will only exist when using pinch virtual
516d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // viewports.
517d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      outerViewportScrollLayer ? static_cast<const webkit::WebLayerImpl*>(
518d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                     outerViewportScrollLayer)->layer()
519d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                               : NULL);
520d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
521d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
522d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RenderWidgetCompositor::clearViewportLayers() {
523d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(),
524d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                           scoped_refptr<cc::Layer>(),
525d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                           scoped_refptr<cc::Layer>());
526d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
527d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderWidgetCompositor::compositeAndReadback(
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void *pixels, const WebRect& rect_in_device_viewport) {
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_tree_host_->CompositeAndReadback(pixels,
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                rect_in_device_viewport);
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::finishAllRendering() {
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->FinishAllRendering();
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setDeferCommits(bool defer_commits) {
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetDeferCommits(defer_commits);
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setShowFPSCounter(bool show) {
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  debug_state.show_fps_counter = show;
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetDebugState(debug_state);
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setShowPaintRects(bool show) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  debug_state.show_paint_rects = show;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetDebugState(debug_state);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setShowDebugBorders(bool show) {
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  debug_state.show_debug_borders = show;
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetDebugState(debug_state);
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::setContinuousPaintingEnabled(bool enabled) {
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  debug_state.continuous_painting = enabled;
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetDebugState(debug_state);
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderWidgetCompositor::setShowScrollBottleneckRects(bool show) {
5677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
5687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  debug_state.show_touch_event_handler_rects = show;
5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  debug_state.show_wheel_event_handler_rects = show;
5707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  debug_state.show_non_fast_scrollable_rects = show;
5717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  layer_tree_host_->SetDebugState(debug_state);
5727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetCompositor::WillBeginMainFrame(int frame_id) {
575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  widget_->InstrumentWillBeginFrame(frame_id);
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->willBeginCompositorFrame();
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RenderWidgetCompositor::DidBeginMainFrame() {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->InstrumentDidBeginFrame();
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetCompositor::Animate(base::TimeTicks frame_begin_time) {
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  widget_->webwidget()->animate(
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (frame_begin_time - base::TimeTicks()).InSecondsF());
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::Layout() {
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->webwidget()->layout();
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderWidgetCompositor::ApplyScrollAndScale(
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Vector2d& scroll_delta,
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    float page_scale) {
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->webwidget()->applyScrollAndScale(scroll_delta, page_scale);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
598a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::CreateOutputSurface(
599a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool fallback) {
600a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return widget_->CreateOutputSurface(fallback);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
603b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void RenderWidgetCompositor::DidInitializeOutputSurface(bool success) {
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!success)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->webwidget()->didExitCompositingMode();
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::WillCommit() {
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->InstrumentWillComposite();
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::DidCommit() {
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->DidCommitCompositorFrame();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->didBecomeReadyForAdditionalInput();
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::DidCommitAndDrawFrame() {
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->didCommitAndDrawCompositorFrame();
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::DidCompleteSwapBuffers() {
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget_->didCompleteSwapBuffers();
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!threaded_)
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    widget_->OnSwapBuffersComplete();
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_refptr<cc::ContextProvider>
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderWidgetCompositor::OffscreenContextProvider() {
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return RenderThreadImpl::current()->OffscreenCompositorContextProvider();
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetCompositor::ScheduleComposite() {
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!suppress_schedule_composite_)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->scheduleComposite();
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetCompositor::ScheduleAnimation() {
638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  widget_->scheduleAnimation();
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetCompositor::DidPostSwapBuffers() {
642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  widget_->OnSwapBuffersPosted();
643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetCompositor::DidAbortSwapBuffers() {
646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  widget_->OnSwapBuffersAborted();
647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetCompositor::RateLimitSharedMainThreadContext() {
650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  cc::ContextProvider* provider =
651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      RenderThreadImpl::current()->SharedMainThreadContextProvider().get();
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  provider->ContextGL()->RateLimitOffscreenContextCHROMIUM();
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
656