12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 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 "cc/trees/layer_tree_host_impl.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <limits>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/containers/hash_tables.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_writer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/scrollbar_animation_controller.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/animation/timing_function.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/base/latency_info_swap_promise_monitor.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/util.h"
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/debug/benchmark_instrumentation.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/debug_rect_history.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/debug/devtools_instrumentation.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/frame_rate_counter.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/paint_time_counter.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/rendering_stats_instrumentation.h"
27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/debug/traced_value.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/page_scale_animation.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/top_controls_manager.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/append_quads_data.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h"
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/layer_impl.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_iterator.h"
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/painted_scrollbar_layer_impl.h"
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "cc/layers/quad_sink.h"
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h"
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "cc/layers/scrollbar_layer_impl_base.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_metadata.h"
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/output/copy_output_request.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegating_renderer.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/gl_renderer.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/software_renderer.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h"
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/quads/texture_draw_quad.h"
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "cc/resources/direct_raster_worker_pool.h"
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/resources/image_copy_raster_worker_pool.h"
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "cc/resources/image_raster_worker_pool.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/memory_history.h"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture_layer_tiling.h"
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "cc/resources/pixel_buffer_raster_worker_pool.h"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h"
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "cc/resources/raster_worker_pool.h"
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "cc/resources/resource_pool.h"
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/resources/texture_mailbox_deleter.h"
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/resources/ui_resource_bitmap.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/delay_based_time_source.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/damage_tracker.h"
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_common.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "cc/trees/occlusion_tracker.h"
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/tree_synchronizer.h"
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h"
68f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu#include "ui/gfx/geometry/rect_conversions.h"
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h"
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DidVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (visible) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN1("webkit",
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "LayerTreeHostImpl::SetVisible",
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             id,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "LayerTreeHostImpl",
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             id);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::SetVisible", id);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)size_t GetMaxTransferBufferUsageBytes(cc::ContextProvider* context_provider) {
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Software compositing should not use this value in production. Just use a
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // default value when testing uploads with the software compositor.
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!context_provider)
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return std::numeric_limits<size_t>::max();
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We want to make sure the default transfer buffer size is equal to the
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // amount of data that can be uploaded by the compositor to avoid stalling
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // the pipeline.
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // For reference Chromebook Pixel can upload 1MB in about 0.5ms.
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const size_t kMaxBytesUploadedPerMs = 1024 * 1024 * 2;
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Assuming a two frame deep pipeline between CPU and GPU and we are
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // drawing 60 frames per second which would require us to draw one
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // frame in 16 milliseconds.
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const size_t kMaxTransferBufferUsageBytes = 16 * 2 * kMaxBytesUploadedPerMs;
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return std::min(
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context_provider->ContextCapabilities().max_transfer_buffer_usage_bytes,
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      kMaxTransferBufferUsageBytes);
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)unsigned GetMapImageTextureTarget(cc::ContextProvider* context_provider) {
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!context_provider)
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return GL_TEXTURE_2D;
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (context_provider->ContextCapabilities().gpu.egl_image_external)
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return GL_TEXTURE_EXTERNAL_OES;
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (context_provider->ContextCapabilities().gpu.texture_rectangle)
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return GL_TEXTURE_RECTANGLE_ARB;
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GL_TEXTURE_2D;
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> Create(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerTreeHostImpl* layer_tree_host_impl,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<DelayBasedTimeSource> time_source) {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return make_scoped_ptr(
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new LayerTreeHostImplTimeSourceAdapter(layer_tree_host_impl,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               time_source));
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~LayerTreeHostImplTimeSourceAdapter() {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    time_source_->SetClient(NULL);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    time_source_->SetActive(false);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnTimerTick() OVERRIDE {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // In single threaded mode we attempt to simulate changing the current
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // thread by maintaining a fake thread id. When we switch from one
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // thread to another, we construct DebugScopedSetXXXThread objects that
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // update the thread id. This lets DCHECKS that ensure we're on the
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // right thread to work correctly in single threaded mode. The problem
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // here is that the timer tasks are run via the message loop, and when
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // they run, we've had no chance to construct a DebugScopedSetXXXThread
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // object. The result is that we report that we're running on the main
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // thread. In multi-threaded mode, this timer is run on the compositor
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // thread, so to keep this consistent in single-threaded mode, we'll
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // construct a DebugScopedSetImplThread object. There is no need to do
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // this in multi-threaded mode since the real thread id's will be
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // correct. In fact, setting fake thread id's interferes with the real
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // thread id's and causes breakage.
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DebugScopedSetImplThread> set_impl_thread;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layer_tree_host_impl_->proxy()->HasImplThread()) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      set_impl_thread.reset(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new DebugScopedSetImplThread(layer_tree_host_impl_->proxy()));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host_impl_->Animate(
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        layer_tree_host_impl_->CurrentFrameTimeTicks());
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool start_ready_animations = true;
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host_impl_->UpdateAnimationState(start_ready_animations);
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (layer_tree_host_impl_->pending_tree()) {
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      layer_tree_host_impl_->pending_tree()->UpdateDrawProperties();
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      layer_tree_host_impl_->ManageTiles();
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame();
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetActive(bool active) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (active != time_source_->Active())
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      time_source_->SetActive(active);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool Active() const { return time_source_->Active(); }
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostImplTimeSourceAdapter(
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerTreeHostImpl* layer_tree_host_impl,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<DelayBasedTimeSource> time_source)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : layer_tree_host_impl_(layer_tree_host_impl),
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        time_source_(time_source) {
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    time_source_->SetClient(this);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostImpl* layer_tree_host_impl_;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DelayBasedTimeSource> time_source_;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LayerTreeHostImplTimeSourceAdapter);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::FrameData::FrameData()
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : contains_incomplete_tile(false), has_no_damage(false) {}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::FrameData::~FrameData() {}
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const LayerTreeSettings& settings,
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostImplClient* client,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Proxy* proxy,
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RenderingStatsInstrumentation* rendering_stats_instrumentation,
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SharedBitmapManager* manager,
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int id) {
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return make_scoped_ptr(new LayerTreeHostImpl(
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      settings, client, proxy, rendering_stats_instrumentation, manager, id));
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::LayerTreeHostImpl(
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const LayerTreeSettings& settings,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostImplClient* client,
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Proxy* proxy,
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RenderingStatsInstrumentation* rendering_stats_instrumentation,
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SharedBitmapManager* manager,
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int id)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : client_(client),
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      proxy_(proxy),
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      use_gpu_rasterization_(false),
220bee9932bab44713b74b422b4b759b49f5a222977Bo Liu      on_demand_task_graph_runner_(NULL),
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      input_handler_client_(NULL),
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      did_lock_scrolling_layer_(false),
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_bubble_scrolls_(false),
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      wheel_scrolling_(false),
225e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      scroll_affects_scroll_handler_(false),
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scroll_layer_id_when_mouse_over_scrollbar_(0),
227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      tile_priorities_dirty_(false),
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_layer_scroll_offset_delegate_(NULL),
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      settings_(settings),
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      visible_(true),
231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cached_managed_memory_policy_(
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          PrioritizedResourceManager::DefaultMemoryAllocationLimit(),
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING,
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          ManagedMemoryPolicy::kDefaultNumResourcesLimit),
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pinch_gesture_active_(false),
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      pinch_gesture_end_should_clear_scrolling_layer_(false),
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())),
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      paint_time_counter_(PaintTimeCounter::Create()),
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      memory_history_(MemoryHistory::Create()),
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      debug_rect_history_(DebugRectHistory::Create()),
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      texture_mailbox_deleter_(new TextureMailboxDeleter(
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  : proxy_->MainThreadTaskRunner())),
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      max_memory_needed_bytes_(0),
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      zero_budget_(false),
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      device_scale_factor_(1.f),
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      overhang_ui_resource_id_(0),
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      overdraw_bottom_height_(0.f),
24988109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org      resourceless_software_draw_(false),
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()),
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      animation_registrar_(AnimationRegistrar::Create()),
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rendering_stats_instrumentation_(rendering_stats_instrumentation),
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      micro_benchmark_controller_(this),
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      need_to_update_visible_tiles_before_draw_(false),
25523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      did_lose_called_(false),
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      shared_bitmap_manager_(manager),
2595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      id_(id),
2605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      transfer_buffer_memory_limit_(0u) {
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(proxy_->IsImplThread());
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DidVisibilityChange(this, visible_);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDebugState(settings.initial_debug_state);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (settings.calculate_top_controls_position) {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    top_controls_manager_ =
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TopControlsManager::Create(this,
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   settings.top_controls_height,
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   settings.top_controls_show_threshold,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   settings.top_controls_hide_threshold);
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDebugState(settings.initial_debug_state);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // LTHI always has an active tree.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  active_tree_ = LayerTreeImpl::create(this);
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TRACE_EVENT_OBJECT_CREATED_WITH_ID(
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::~LayerTreeHostImpl() {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(proxy_->IsImplThread());
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()");
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TRACE_EVENT_OBJECT_DELETED_WITH_ID(
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_);
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (input_handler_client_) {
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    input_handler_client_->WillShutdown();
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    input_handler_client_ = NULL;
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The layer trees must be destroyed before the layer tree host. We've
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // made a contract with our animation controllers that the registrar
295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // will outlive them, and we must make good.
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (recycle_tree_)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    recycle_tree_->Shutdown();
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (pending_tree_)
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pending_tree_->Shutdown();
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  active_tree_->Shutdown();
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  recycle_tree_.reset();
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pending_tree_.reset();
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  active_tree_.reset();
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DestroyTileManager();
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) {
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If the begin frame data was handled, then scroll and scale set was applied
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // by the main thread, so the active tree needs to be updated as if these sent
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // values were applied and committed.
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (did_handle) {
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit();
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    active_tree_->ResetContentsTexturesPurged();
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LayerTreeHostImpl::BeginCommit() {
318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::BeginCommit");
319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (settings_.impl_side_painting)
321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    CreatePendingTree();
322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::CommitComplete() {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete");
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (settings_.impl_side_painting) {
3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Impl-side painting needs an update immediately post-commit to have the
3293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // opportunity to create tilings.  Other paths can call UpdateDrawProperties
3303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // more lazily when needed prior to drawing.
3311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    pending_tree()->ApplyScrollDeltasSinceBeginMainFrame();
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pending_tree_->set_needs_update_draw_properties();
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pending_tree_->UpdateDrawProperties();
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Start working on newly created tiles immediately if needed.
335d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (!tile_manager_ || !tile_priorities_dirty_)
336424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      NotifyReadyToActivate();
337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    else
338424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ManageTiles();
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // If we're not in impl-side painting, the tree is immediately considered
341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // active.
342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    active_tree_->ProcessUIResourceRequestQueue();
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    active_tree_->DidBecomeActive();
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ActivateAnimations();
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    active_tree_->set_needs_update_draw_properties();
348424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (time_source_client_adapter_ && time_source_client_adapter_->Active())
349424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      DCHECK(active_tree_->root_layer());
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  micro_benchmark_controller_.DidCompleteCommit();
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
355fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochbool LayerTreeHostImpl::CanDraw() const {
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note: If you are changing this function or any other function that might
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // affect the result of CanDraw, make sure to call
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // client_->OnCanDrawStateChanged in the proper places and update the
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NotifyIfCanDrawChanged test.
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
361fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  if (!renderer_) {
362fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no renderer",
363fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                         TRACE_EVENT_SCOPE_THREAD);
364fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    return false;
365fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  }
366fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
367fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Must have an OutputSurface if |renderer_| is not NULL.
368fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(output_surface_);
369fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
370fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // TODO(boliu): Make draws without root_layer work and move this below
371fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967.
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!active_tree_->root_layer()) {
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer",
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         TRACE_EVENT_SCOPE_THREAD);
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
377fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
378fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
379fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    return true;
380fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (DrawViewportSize().IsEmpty()) {
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport",
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         TRACE_EVENT_SCOPE_THREAD);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (active_tree_->ViewportSizeInvalid()) {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_INSTANT0(
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed",
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TRACE_EVENT_SCOPE_THREAD);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (active_tree_->ContentsTexturesPurged()) {
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_INSTANT0(
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "cc", "LayerTreeHostImpl::CanDraw contents textures purged",
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TRACE_EVENT_SCOPE_THREAD);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (EvictedUIResourcesExist()) {
39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TRACE_EVENT_INSTANT0(
40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        "cc", "LayerTreeHostImpl::CanDraw UI resources evicted not recreated",
40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        TRACE_EVENT_SCOPE_THREAD);
40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) {
40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (input_handler_client_)
40990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    input_handler_client_->Animate(monotonic_time);
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnimatePageScale(monotonic_time);
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AnimateLayers(monotonic_time);
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnimateScrollbars(monotonic_time);
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnimateTopControls(monotonic_time);
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ManageTiles() {
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!tile_manager_)
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
419d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!tile_priorities_dirty_)
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  tile_priorities_dirty_ = false;
42368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  tile_manager_->ManageTiles(global_tile_state_);
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  client_->DidManageTiles();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeHostImpl::StartPageScaleAnimation(
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Vector2d& target_offset,
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool anchor_point,
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    float page_scale,
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::TimeDelta duration) {
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!InnerViewportScrollLayer())
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset();
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize();
43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::SizeF viewport_size = UnscaledScrollableViewportSize();
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Easing constants experimentally determined.
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<TimingFunction> timing_function =
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>();
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  page_scale_animation_ =
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PageScaleAnimation::Create(scroll_total,
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 active_tree_->total_page_scale_factor(),
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 viewport_size,
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 scaled_scrollable_size,
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 timing_function.Pass());
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (anchor_point) {
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Vector2dF anchor(target_offset);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page_scale_animation_->ZoomWithAnchor(anchor,
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          page_scale,
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          duration.InSecondsF());
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Vector2dF scaled_target_offset = target_offset;
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page_scale_animation_->ZoomTo(scaled_target_offset,
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  page_scale,
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  duration.InSecondsF());
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetNeedsAnimate();
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetNeedsCommitOnImplThread();
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->RenewTreePriority();
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt(
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const gfx::Point& viewport_point,
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    InputHandler::ScrollInputType type) {
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!CurrentlyScrollingLayer())
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return false;
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::PointF device_viewport_point =
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      gfx::ScalePoint(viewport_point, device_scale_factor_);
476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LayerImpl* layer_impl =
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      active_tree_->FindLayerThatIsHitByPoint(device_viewport_point);
479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool scroll_on_main_thread = false;
481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LayerImpl* scrolling_layer_impl = FindScrollLayerForDeviceViewportPoint(
482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      device_viewport_point, type, layer_impl, &scroll_on_main_thread, NULL);
483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return CurrentlyScrollingLayer() == scrolling_layer_impl;
484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool LayerTreeHostImpl::HaveTouchEventHandlersAt(
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const gfx::Point& viewport_point) {
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!settings_.touch_hit_testing)
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return true;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF device_viewport_point =
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScalePoint(viewport_point, device_scale_factor_);
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  LayerImpl* layer_impl =
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      active_tree_->FindLayerThatIsHitByPointInTouchHandlerRegion(
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          device_viewport_point);
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return layer_impl != NULL;
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_ptr<SwapPromiseMonitor>
502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)LayerTreeHostImpl::CreateLatencyInfoSwapPromiseMonitor(
503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::LatencyInfo* latency) {
504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return scoped_ptr<SwapPromiseMonitor>(
505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new LatencyInfoSwapPromiseMonitor(latency, NULL, this));
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::TrackDamageForAllSurfaces(
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_draw_layer,
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const LayerImplList& render_surface_layer_list) {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For now, we use damage tracking to compute a global scissor. To do this, we
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // must compute all damage tracking before drawing anything, so that we know
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the root damage rect. The root damage rect is then used to scissor each
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // surface.
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int surface_index = render_surface_layer_list.size() - 1;
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       surface_index >= 0;
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       --surface_index) {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* render_surface_layer = render_surface_layer_list[surface_index];
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderSurfaceImpl* render_surface = render_surface_layer->render_surface();
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(render_surface);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->damage_tracker()->UpdateDamageTrackingState(
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_surface->layer_list(),
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_surface_layer->id(),
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_surface->SurfacePropertyChangedOnlyFromDescendant(),
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_surface->content_rect(),
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_surface_layer->mask_layer(),
52868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        render_surface_layer->filters());
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_ptr<base::Value> LayerTreeHostImpl::FrameData::AsValue() const {
533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue());
534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  value->SetBoolean("contains_incomplete_tile", contains_incomplete_tile);
535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  value->SetBoolean("has_no_damage", has_no_damage);
536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Quad data can be quite large, so only dump render passes if we select
538ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // cc.debug.quads.
539ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool quads_enabled;
540ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TRACE_EVENT_CATEGORY_GROUP_ENABLED(
541ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), &quads_enabled);
542ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (quads_enabled) {
543ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<base::ListValue> render_pass_list(new base::ListValue());
544ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < render_passes.size(); ++i)
545ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      render_pass_list->Append(render_passes[i]->AsValue().release());
546ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    value->Set("render_passes", render_pass_list.release());
547ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
548ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return value.PassAs<base::Value>();
549ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
550ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::FrameData::AppendRenderPass(
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<RenderPass> render_pass) {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_passes_by_id[render_pass->id] = render_pass.get();
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_passes.push_back(render_pass.Pass());
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
55788109bffdff235e691fea3aefa461782a195ed10boliu@chromium.orgDrawMode LayerTreeHostImpl::GetDrawMode() const {
55888109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org  if (resourceless_software_draw_) {
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return DRAW_MODE_RESOURCELESS_SOFTWARE;
56088109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org  } else if (output_surface_->context_provider()) {
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return DRAW_MODE_HARDWARE;
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else {
56388109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org    DCHECK_EQ(!output_surface_->software_device(),
56488109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org              output_surface_->capabilities().delegated_rendering &&
56588109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org                  !output_surface_->capabilities().deferred_gl_initialization)
56688109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org        << output_surface_->capabilities().delegated_rendering << " "
56788109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org        << output_surface_->capabilities().deferred_gl_initialization;
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return DRAW_MODE_SOFTWARE;
569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static void AppendQuadsForLayer(
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RenderPass* target_render_pass,
574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LayerImpl* layer,
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const OcclusionTracker<LayerImpl>& occlusion_tracker,
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendQuadsData* append_quads_data) {
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuadSink quad_culler(target_render_pass, &occlusion_tracker);
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->AppendQuads(&quad_culler, append_quads_data);
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AppendQuadsForRenderSurfaceLayer(
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderPass* target_render_pass,
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* layer,
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* contributing_render_pass,
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const OcclusionTracker<LayerImpl>& occlusion_tracker,
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData* append_quads_data) {
587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuadSink quad_culler(target_render_pass, &occlusion_tracker);
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_replica = false;
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->render_surface()->AppendQuads(&quad_culler,
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       append_quads_data,
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       is_replica,
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       contributing_render_pass->id);
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add replica after the surface so that it appears below the surface.
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->has_replica()) {
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_replica = true;
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->render_surface()->AppendQuads(&quad_culler,
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         append_quads_data,
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         is_replica,
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         contributing_render_pass->id);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AppendQuadsToFillScreen(
606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ResourceProvider::ResourceId overhang_resource_id,
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::SizeF& overhang_resource_scaled_size,
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& root_scroll_layer_rect,
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderPass* target_render_pass,
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_layer,
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkColor screen_background_color,
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const OcclusionTracker<LayerImpl>& occlusion_tracker) {
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!root_layer || !SkColorGetA(screen_background_color))
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen();
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (fill_region.IsEmpty())
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Divide the fill region into the part to be filled with the overhang
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // resource and the part to be filled with the background color.
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Region screen_background_color_region = fill_region;
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Region overhang_region;
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (overhang_resource_id) {
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    overhang_region = fill_region;
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    overhang_region.Subtract(root_scroll_layer_rect);
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    screen_background_color_region.Intersect(root_scroll_layer_rect);
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuadSink quad_culler(target_render_pass, &occlusion_tracker);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Manually create the quad state for the gutter quads, as the root layer
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // doesn't have any bounds and so can't generate this itself.
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(danakj): Make the gutter quads generated by the solid color layer
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (make it smarter about generating quads to fill unoccluded areas).
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect root_target_rect = root_layer->render_surface()->content_rect();
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float opacity = 1.f;
6396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  int sorting_context_id = 0;
640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_quad_state = quad_culler.CreateSharedQuadState();
641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  shared_quad_state->SetAll(gfx::Transform(),
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            root_target_rect.size(),
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            root_target_rect,
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            root_target_rect,
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            false,
646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            opacity,
6476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            SkXfermode::kSrcOver_Mode,
6486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            sorting_context_id);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (Region::Iterator fill_rects(screen_background_color_region);
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       fill_rects.has_rect();
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       fill_rects.next()) {
653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect screen_space_rect = fill_rects.rect();
654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect visible_screen_space_rect = screen_space_rect;
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Skip the quad culler and just append the quads directly to avoid
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // occlusion checks.
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    quad->SetNew(shared_quad_state,
659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 screen_space_rect,
660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 visible_screen_space_rect,
661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 screen_background_color,
662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 false);
6630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    quad_culler.Append(quad.PassAs<DrawQuad>());
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (Region::Iterator fill_rects(overhang_region);
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       fill_rects.has_rect();
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       fill_rects.next()) {
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK(overhang_resource_id);
669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect screen_space_rect = fill_rects.rect();
670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect opaque_screen_space_rect = screen_space_rect;
671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect visible_screen_space_rect = screen_space_rect;
672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<TextureDrawQuad> tex_quad = TextureDrawQuad::Create();
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f};
674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    tex_quad->SetNew(
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        shared_quad_state,
676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        screen_space_rect,
677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        opaque_screen_space_rect,
678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        visible_screen_space_rect,
679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        overhang_resource_id,
680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        false,
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        gfx::PointF(
682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            screen_space_rect.x() / overhang_resource_scaled_size.width(),
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            screen_space_rect.y() / overhang_resource_scaled_size.height()),
684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        gfx::PointF(
685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            screen_space_rect.right() / overhang_resource_scaled_size.width(),
686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            screen_space_rect.bottom() /
687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                overhang_resource_scaled_size.height()),
688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        screen_background_color,
689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        vertex_opacity,
690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        false);
6910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    quad_culler.Append(tex_quad.PassAs<DrawQuad>());
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DrawResult LayerTreeHostImpl::CalculateRenderPasses(
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FrameData* frame) {
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(frame->render_passes.empty());
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(CanDraw());
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(active_tree_->root_layer());
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrackDamageForAllSurfaces(active_tree_->root_layer(),
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            *frame->render_surface_layer_list);
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the root render surface has no visible damage, then don't generate a
705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // frame at all.
706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderSurfaceImpl* root_surface =
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      active_tree_->root_layer()->render_surface();
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool root_surface_has_no_visible_damage =
709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !root_surface->damage_tracker()->current_damage_rect().Intersects(
710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          root_surface->content_rect());
711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool root_surface_has_contributing_layers =
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !root_surface->layer_list().empty();
713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool hud_wants_to_draw_ = active_tree_->hud_layer() &&
714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            active_tree_->hud_layer()->IsAnimatingHUDContents();
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (root_surface_has_contributing_layers &&
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      root_surface_has_no_visible_damage &&
717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      active_tree_->LayersWithCopyOutputRequest().empty() &&
718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !hud_wants_to_draw_) {
719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT0("cc",
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect");
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    frame->has_no_damage = true;
722fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    DCHECK(!output_surface_->capabilities()
723fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch               .draw_and_swap_full_viewport_every_frame);
724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return DRAW_SUCCESS;
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT1("cc",
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               "LayerTreeHostImpl::CalculateRenderPasses",
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               "render_surface_layer_list.size()",
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               static_cast<uint64>(frame->render_surface_layer_list->size()));
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create the render passes in dependency order.
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int surface_index = frame->render_surface_layer_list->size() - 1;
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       surface_index >= 0;
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       --surface_index) {
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* render_surface_layer =
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (*frame->render_surface_layer_list)[surface_index];
7387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    RenderSurfaceImpl* render_surface = render_surface_layer->render_surface();
7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool should_draw_into_render_pass =
7417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        render_surface_layer->parent() == NULL ||
7427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        render_surface->contributes_to_drawn_surface() ||
7437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        render_surface_layer->HasCopyRequest();
7447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (should_draw_into_render_pass)
7457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      render_surface_layer->render_surface()->AppendRenderPasses(frame);
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // When we are displaying the HUD, change the root damage rect to cover the
749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // entire root surface. This will disable partial-swap/scissor optimizations
750a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // that would prevent the HUD from updating, since the HUD does not cause
751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // damage itself, to prevent it from messing with damage visualizations. Since
752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // damage visualizations are done off the LayerImpls and RenderSurfaceImpls,
753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // changing the RenderPass does not affect them.
754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (active_tree_->hud_layer()) {
755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RenderPass* root_pass = frame->render_passes.back();
756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    root_pass->damage_rect = root_pass->output_rect;
757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OcclusionTracker<LayerImpl> occlusion_tracker(
760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      active_tree_->root_layer()->render_surface()->content_rect());
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  occlusion_tracker.set_minimum_tracking_size(
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      settings_.minimum_occlusion_tracking_size);
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (debug_state_.show_occluding_rects) {
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    occlusion_tracker.set_occluding_screen_space_rects_container(
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &frame->occluding_screen_space_rects);
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (debug_state_.show_non_occluding_rects) {
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    occlusion_tracker.set_non_occluding_screen_space_rects_container(
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &frame->non_occluding_screen_space_rects);
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Add quads to the Render passes in front-to-back order to allow for testing
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // occlusion and performing culling during the tree walk.
7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef LayerIterator<LayerImpl> LayerIteratorType;
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Typically when we are missing a texture and use a checkerboard quad, we
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // still draw the frame. However when the layer being checkerboarded is moving
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // due to an impl-animation, we drop the frame to avoid flashing due to the
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // texture suddenly appearing in the future.
781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DrawResult draw_result = DRAW_SUCCESS;
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When we have a copy request for a layer, we need to draw no matter
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // what, as the layer may disappear after this frame.
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool have_copy_request = false;
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int layers_drawn = 0;
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
78888109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org  const DrawMode draw_mode = GetDrawMode();
789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerIteratorType end =
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerIteratorType::End(frame->render_surface_layer_list);
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (LayerIteratorType it =
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           LayerIteratorType::Begin(frame->render_surface_layer_list);
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != end;
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++it) {
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderPass::Id target_render_pass_id =
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        it.target_render_surface_layer()->render_surface()->RenderPassId();
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderPass* target_render_pass =
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame->render_passes_by_id[target_render_pass_id];
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    occlusion_tracker.EnterLayer(it);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    AppendQuadsData append_quads_data(target_render_pass_id);
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (it.represents_target_render_surface()) {
80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (it->HasCopyRequest()) {
807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        have_copy_request = true;
808eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        it->TakeCopyRequestsAndTransformToTarget(
809eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            &target_render_pass->copy_requests);
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else if (it.represents_contributing_render_surface() &&
8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               it->render_surface()->contributes_to_drawn_surface()) {
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderPass::Id contributing_render_pass_id =
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          it->render_surface()->RenderPassId();
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderPass* contributing_render_pass =
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          frame->render_passes_by_id[contributing_render_pass_id];
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AppendQuadsForRenderSurfaceLayer(target_render_pass,
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       *it,
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       contributing_render_pass,
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       occlusion_tracker,
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       &append_quads_data);
822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    } else if (it.represents_itself() &&
823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               !it->visible_content_rect().IsEmpty()) {
824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      bool occluded = occlusion_tracker.Occluded(it->render_target(),
825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 it->visible_content_rect(),
826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 it->draw_transform());
8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) {
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DCHECK_EQ(active_tree_, it->layer_tree_impl());
829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame->will_draw_layers.push_back(*it);
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (it->HasContributingDelegatedRenderPasses()) {
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          RenderPass::Id contributing_render_pass_id =
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              it->FirstContributingRenderPassId();
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          while (frame->render_passes_by_id.find(contributing_render_pass_id) !=
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 frame->render_passes_by_id.end()) {
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            RenderPass* render_pass =
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                frame->render_passes_by_id[contributing_render_pass_id];
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            AppendQuadsData append_quads_data(render_pass->id);
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            AppendQuadsForLayer(render_pass,
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                *it,
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                occlusion_tracker,
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                &append_quads_data);
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            contributing_render_pass_id =
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                it->NextContributingRenderPassId(contributing_render_pass_id);
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AppendQuadsForLayer(target_render_pass,
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            *it,
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            occlusion_tracker,
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            &append_quads_data);
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++layers_drawn;
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    rendering_stats_instrumentation_->AddVisibleContentArea(
8615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        append_quads_data.visible_content_area);
8625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    rendering_stats_instrumentation_->AddApproximatedVisibleContentArea(
8635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        append_quads_data.approximated_visible_content_area);
8645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (append_quads_data.num_missing_tiles) {
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool layer_has_animating_transform =
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          it->screen_space_transform_is_animating() ||
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          it->draw_transform_is_animating();
869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (layer_has_animating_transform)
870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (append_quads_data.had_incomplete_tile) {
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      frame->contains_incomplete_tile = true;
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (active_tree()->RequiresHighResToDraw())
876cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    occlusion_tracker.LeaveLayer(it);
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  if (have_copy_request ||
883fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
884cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    draw_result = DRAW_SUCCESS;
885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < frame->render_passes.size(); ++i) {
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j)
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state);
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id)
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           != frame->render_passes_by_id.end());
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin());
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!active_tree_->has_transparent_background()) {
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_passes.back()->has_transparent_background = false;
898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AppendQuadsToFillScreen(
899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ResourceIdForUIResource(overhang_ui_resource_id_),
900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        gfx::ScaleSize(overhang_ui_resource_size_, device_scale_factor_),
901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        active_tree_->RootScrollLayerDeviceViewportBounds(),
902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        frame->render_passes.back(),
903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        active_tree_->root_layer(),
904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        active_tree_->background_color(),
905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        occlusion_tracker);
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame);
9094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes);
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Any copy requests left in the tree are not going to get serviced, and
9127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // should be aborted.
9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedPtrVector<CopyOutputRequest> requests_to_abort;
9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (!active_tree_->LayersWithCopyOutputRequest().empty()) {
9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back();
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    layer->TakeCopyRequestsAndTransformToTarget(&requests_to_abort);
9177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < requests_to_abort.size(); ++i)
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    requests_to_abort[i]->SendEmptyResult();
9207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If we're making a frame to draw, it better have at least one render pass.
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!frame->render_passes.empty());
9234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Should only have one render pass in resourceless software mode.
92588109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org  DCHECK(draw_mode != DRAW_MODE_RESOURCELESS_SOFTWARE ||
92688109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org         frame->render_passes.size() == 1u)
92788109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org      << frame->render_passes.size();
9284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return draw_result;
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::MainThreadHasStoppedFlinging() {
93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (input_handler_client_)
93490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    input_handler_client_->MainThreadHasStoppedFlinging();
93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
93690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateBackgroundAnimateTicking(
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool should_background_tick) {
939eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(proxy_->IsImplThread());
940424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (should_background_tick)
941424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK(active_tree_->root_layer());
942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
943effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool enabled = should_background_tick && needs_animate_layers();
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Lazily create the time_source adapter so that we can vary the interval for
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // testing.
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!time_source_client_adapter_) {
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    time_source_client_adapter_ = LayerTreeHostImplTimeSourceAdapter::Create(
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this,
950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        DelayBasedTimeSource::Create(
951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            LowFrequencyAnimationInterval(),
952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    : proxy_->MainThreadTaskRunner()));
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  time_source_client_adapter_->SetActive(enabled);
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeHostImpl::DidAnimateScrollOffset() {
960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  client_->SetNeedsCommitOnImplThread();
961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  client_->RenewTreePriority();
962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeHostImpl::SetViewportDamage(const gfx::Rect& damage_rect) {
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  viewport_damage_rect_.Union(damage_rect);
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline RenderPass* FindRenderPassById(
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderPass::Id render_pass_id,
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const LayerTreeHostImpl::FrameData& frame) {
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPassIdHashMap::const_iterator it =
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      frame.render_passes_by_id.find(render_pass_id);
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return it != frame.render_passes_by_id.end() ? it->second : NULL;
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void RemoveRenderPassesRecursive(RenderPass::Id remove_render_pass_id,
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        LayerTreeHostImpl::FrameData* frame) {
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass* remove_render_pass =
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FindRenderPassById(remove_render_pass_id, *frame);
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The pass was already removed by another quad - probably the original, and
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we are the replica.
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!remove_render_pass)
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPassList& render_passes = frame->render_passes;
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPassList::iterator to_remove = std::find(render_passes.begin(),
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 render_passes.end(),
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 remove_render_pass);
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(to_remove != render_passes.end());
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RenderPass> removed_pass = render_passes.take(to_remove);
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame->render_passes.erase(to_remove);
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame->render_passes_by_id.erase(remove_render_pass_id);
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now follow up for all RenderPass quads and remove their RenderPasses
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // recursively.
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuadList& quad_list = removed_pass->quad_list;
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuadList::ConstBackToFrontIterator quad_list_iterator =
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      quad_list.BackToFrontBegin();
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (; quad_list_iterator != quad_list.BackToFrontEnd();
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++quad_list_iterator) {
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DrawQuad* current_quad = (*quad_list_iterator);
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (current_quad->material != DrawQuad::RENDER_PASS)
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderPass::Id next_remove_render_pass_id =
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id;
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RemoveRenderPassesRecursive(next_remove_render_pass_id, frame);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::ShouldRemoveRenderPass(
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPassDrawQuad& quad, const FrameData& frame) const {
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const RenderPass* render_pass =
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FindRenderPassById(quad.render_pass_id, frame);
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_pass)
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If any quad or RenderPass draws into this RenderPass, then keep it.
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuadList& quad_list = render_pass->quad_list;
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (QuadList::ConstBackToFrontIterator quad_list_iterator =
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           quad_list.BackToFrontBegin();
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       quad_list_iterator != quad_list.BackToFrontEnd();
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++quad_list_iterator) {
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DrawQuad* current_quad = *quad_list_iterator;
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (current_quad->material != DrawQuad::RENDER_PASS)
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* contributing_pass = FindRenderPassById(
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id, frame);
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (contributing_pass)
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Defined for linking tests.
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template CC_EXPORT void LayerTreeHostImpl::RemoveRenderPasses<
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostImpl::CullRenderPassesWithNoQuads>(
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CullRenderPassesWithNoQuads culler, FrameData*);
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename RenderPassCuller>
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::RemoveRenderPasses(RenderPassCuller culler,
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           FrameData* frame) {
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t it = culler.RenderPassListBegin(frame->render_passes);
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != culler.RenderPassListEnd(frame->render_passes);
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it = culler.RenderPassListNext(it)) {
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* current_pass = frame->render_passes[it];
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const QuadList& quad_list = current_pass->quad_list;
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuadList::ConstBackToFrontIterator quad_list_iterator =
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        quad_list.BackToFrontBegin();
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (; quad_list_iterator != quad_list.BackToFrontEnd();
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ++quad_list_iterator) {
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DrawQuad* current_quad = *quad_list_iterator;
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (current_quad->material != DrawQuad::RENDER_PASS)
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        continue;
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const RenderPassDrawQuad* render_pass_quad =
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          RenderPassDrawQuad::MaterialCast(current_quad);
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!culler.ShouldRemoveRenderPass(*render_pass_quad, *frame))
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        continue;
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // We are changing the vector in the middle of iteration. Because we
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // delete render passes that draw into the current pass, we are
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // guaranteed that any data from the iterator to the end will not
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // change. So, capture the iterator position from the end of the
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // list, and restore it after the change.
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      size_t position_from_end = frame->render_passes.size() - it;
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame);
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      it = frame->render_passes.size() - position_from_end;
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK_GE(frame->render_passes.size(), position_from_end);
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) {
10817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  TRACE_EVENT1("cc",
10827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               "LayerTreeHostImpl::PrepareToDraw",
10837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               "SourceFrameNumber",
10847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               active_tree_->source_frame_number());
10857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
108668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (need_to_update_visible_tiles_before_draw_ &&
108768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      tile_manager_ && tile_manager_->UpdateVisibleTiles()) {
108868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    DidInitializeVisibleTile();
10897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
109068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  need_to_update_visible_tiles_before_draw_ = true;
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool ok = active_tree_->UpdateDrawProperties();
1093f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(ok) << "UpdateDrawProperties failed during draw";
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame->render_passes.clear();
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame->render_passes_by_id.clear();
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame->will_draw_layers.clear();
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  frame->contains_incomplete_tile = false;
1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  frame->has_no_damage = false;
1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (active_tree_->root_layer()) {
1103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Rect device_viewport_damage_rect = viewport_damage_rect_;
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    viewport_damage_rect_ = gfx::Rect();
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    active_tree_->root_layer()->render_surface()->damage_tracker()->
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AddDamageNextUpdate(device_viewport_damage_rect);
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DrawResult draw_result = CalculateRenderPasses(frame);
1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (draw_result != DRAW_SUCCESS) {
1112fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    DCHECK(!output_surface_->capabilities()
1113fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch               .draw_and_swap_full_viewport_every_frame);
11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
1115fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  }
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before
11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // this function is called again.
11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return draw_result;
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LayerTreeHostImpl::EvictTexturesForTesting() {
1123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0));
1124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) {
1127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  NOTREACHED();
1128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
113068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void LayerTreeHostImpl::DidInitializeVisibleTileForTesting() {
11315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Add arbitrary damage, to trigger prepare-to-draws.
11325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Here, setting damage as viewport size, used only for testing.
11335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetFullRootLayerDamage();
113468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DidInitializeVisibleTile();
113568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
113668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LayerTreeHostImpl::ResetTreesForTesting() {
1138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (active_tree_)
1139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    active_tree_->DetachLayerTree();
1140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  active_tree_ = LayerTreeImpl::create(this);
1141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (pending_tree_)
1142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_tree_->DetachLayerTree();
1143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  pending_tree_.reset();
1144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (recycle_tree_)
1145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    recycle_tree_->DetachLayerTree();
1146c2bc7c74934f64e7d2125415f27a3803a4879085vmpstr  recycle_tree_.reset();
1147c2bc7c74934f64e7d2125415f27a3803a4879085vmpstr}
1148c2bc7c74934f64e7d2125415f27a3803a4879085vmpstr
1149c2bc7c74934f64e7d2125415f27a3803a4879085vmpstrvoid LayerTreeHostImpl::ResetRecycleTreeForTesting() {
1150c2bc7c74934f64e7d2125415f27a3803a4879085vmpstr  if (recycle_tree_)
1151c2bc7c74934f64e7d2125415f27a3803a4879085vmpstr    recycle_tree_->DetachLayerTree();
1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recycle_tree_.reset();
1153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::EnforceManagedMemoryPolicy(
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ManagedMemoryPolicy& policy) {
115790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool evicted_resources = client_->ReduceContentsTextureMemoryOnImplThread(
11590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      visible_ ? policy.bytes_limit_when_visible : 0,
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ManagedMemoryPolicy::PriorityCutoffToValue(
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          visible_ ? policy.priority_cutoff_when_visible
11620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   : gpu::MemoryAllocation::CUTOFF_ALLOW_NOTHING));
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (evicted_resources) {
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    active_tree_->SetContentsTexturesPurged();
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (pending_tree_)
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pending_tree_->SetContentsTexturesPurged();
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->SetNeedsCommitOnImplThread();
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->OnCanDrawStateChanged(CanDraw());
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->RenewTreePriority();
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateTileManagerMemoryPolicy(policy);
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy(
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ManagedMemoryPolicy& policy) {
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!tile_manager_)
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  global_tile_state_.hard_memory_limit_in_bytes = 0;
11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  global_tile_state_.soft_memory_limit_in_bytes = 0;
11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (visible_ && policy.bytes_limit_when_visible > 0) {
11835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    global_tile_state_.hard_memory_limit_in_bytes =
11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        policy.bytes_limit_when_visible;
11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    global_tile_state_.soft_memory_limit_in_bytes =
1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        (static_cast<int64>(global_tile_state_.hard_memory_limit_in_bytes) *
1187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         settings_.max_memory_for_prepaint_percentage) /
1188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        100;
11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
119068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  global_tile_state_.memory_limit_policy =
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy(
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          visible_ ?
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          policy.priority_cutoff_when_visible :
11940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          gpu::MemoryAllocation::CUTOFF_ALLOW_NOTHING);
119568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  global_tile_state_.num_resources_limit = policy.num_resources_limit;
1196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
11975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TODO(reveman): We should avoid keeping around unused resources if
11985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // possible. crbug.com/224475
11995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Unused limit is calculated from soft-limit, as hard-limit may
12005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // be very high and shouldn't typically be exceeded.
12015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  size_t unused_memory_limit_in_bytes = static_cast<size_t>(
12025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      (static_cast<int64>(global_tile_state_.soft_memory_limit_in_bytes) *
12035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       settings_.max_unused_resource_memory_percentage) /
12045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      100);
12055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(resource_pool_);
1207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  resource_pool_->CheckBusyResources();
1208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Soft limit is used for resource pool such that memory returns to soft
1209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // limit after going over.
1210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  resource_pool_->SetResourceUsageLimits(
1211a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      global_tile_state_.soft_memory_limit_in_bytes,
12125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      unused_memory_limit_in_bytes,
1213a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      global_tile_state_.num_resources_limit);
1214a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
12155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Staging pool resources are used as transfer buffers so we use
12165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // |transfer_buffer_memory_limit_| as the memory limit for this resource pool.
12175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (staging_resource_pool_) {
12185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    staging_resource_pool_->CheckBusyResources();
12195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    staging_resource_pool_->SetResourceUsageLimits(
12205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        visible_ ? transfer_buffer_memory_limit_ : 0,
12215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        transfer_buffer_memory_limit_,
12225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        std::numeric_limits<size_t>::max());
12235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
12245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DidModifyTilePriorities();
1226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeHostImpl::DidModifyTilePriorities() {
1229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(settings_.impl_side_painting);
1230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Mark priorities as dirty and schedule a ManageTiles().
1231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  tile_priorities_dirty_ = true;
1232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  client_->SetNeedsManageTilesOnImplThread();
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidInitializeVisibleTile() {
123668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (client_ && !client_->IsInsideDraw())
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->DidInitializeVisibleTileOnImplThread();
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const std::vector<PictureLayerImpl*>& LayerTreeHostImpl::GetPictureLayers() {
1241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return picture_layers_;
1242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
12447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void LayerTreeHostImpl::NotifyReadyToActivate() {
1245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  client_->NotifyReadyToActivate();
12467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
12477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LayerTreeHostImpl::NotifyTileStateChanged(const Tile* tile) {
1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::NotifyTileStateChanged");
12505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
12515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (active_tree_) {
12525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    LayerImpl* layer_impl =
12535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        active_tree_->FindActiveTreeLayerById(tile->layer_id());
12545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (layer_impl)
1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      layer_impl->NotifyTileStateChanged(tile);
12565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
12575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
12585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (pending_tree_) {
12595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    LayerImpl* layer_impl =
12605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        pending_tree_->FindPendingTreeLayerById(tile->layer_id());
12615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (layer_impl)
1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      layer_impl->NotifyTileStateChanged(tile);
12635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
12645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
12655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) {
1267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SetManagedMemoryPolicy(policy, zero_budget_);
1268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid LayerTreeHostImpl::SetTreeActivationCallback(
1271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const base::Closure& callback) {
1272ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DCHECK(proxy_->IsImplThread());
1273ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DCHECK(settings_.impl_side_painting || callback.is_null());
1274a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  tree_activation_callback_ = callback;
1275ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1276ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetManagedMemoryPolicy(
1278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const ManagedMemoryPolicy& policy, bool zero_budget) {
1279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (cached_managed_memory_policy_ == policy && zero_budget_ == zero_budget)
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ManagedMemoryPolicy old_policy = ActualManagedMemoryPolicy();
1283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cached_managed_memory_policy_ = policy;
1285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  zero_budget_ = zero_budget;
1286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ManagedMemoryPolicy actual_policy = ActualManagedMemoryPolicy();
1287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (old_policy == actual_policy)
1289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!proxy_->HasImplThread()) {
1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // In single-thread mode, this can be called on the main thread by
1293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // GLRenderer::OnMemoryAllocationChanged.
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DebugScopedSetImplThread impl_thread(proxy_);
1295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EnforceManagedMemoryPolicy(actual_policy);
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(proxy_->IsImplThread());
1298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EnforceManagedMemoryPolicy(actual_policy);
1299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // If there is already enough memory to draw everything imaginable and the
1302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // new memory limit does not change this, then do not re-commit. Don't bother
1303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // skipping commits if this is not visible (commits don't happen when not
1304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // visible, there will almost always be a commit when this becomes visible).
1305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool needs_commit = true;
1306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (visible() &&
1307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      actual_policy.bytes_limit_when_visible >= max_memory_needed_bytes_ &&
1308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      old_policy.bytes_limit_when_visible >= max_memory_needed_bytes_ &&
1309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      actual_policy.priority_cutoff_when_visible ==
1310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          old_policy.priority_cutoff_when_visible) {
1311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    needs_commit = false;
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (needs_commit)
1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_->SetNeedsCommitOnImplThread();
1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LayerTreeHostImpl::SetExternalDrawConstraints(
1319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const gfx::Transform& transform,
13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& viewport,
13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& clip,
1322f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu    const gfx::Rect& viewport_rect_for_tile_priority,
1323f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu    const gfx::Transform& transform_for_tile_priority,
132488109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org    bool resourceless_software_draw) {
1325f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu  gfx::Rect viewport_rect_for_tile_priority_in_view_space;
1326f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu  if (!resourceless_software_draw) {
1327f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu    gfx::Transform screen_to_view(gfx::Transform::kSkipInitialization);
1328f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu    if (transform_for_tile_priority.GetInverse(&screen_to_view)) {
1329f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu      // Convert from screen space to view space.
1330f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu      viewport_rect_for_tile_priority_in_view_space =
1331f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu          gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
1332f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu              screen_to_view, viewport_rect_for_tile_priority));
1333f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu    }
1334f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu  }
1335f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu
133688109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org  if (external_transform_ != transform || external_viewport_ != viewport ||
1337f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu      resourceless_software_draw_ != resourceless_software_draw ||
1338f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu      viewport_rect_for_tile_priority_ !=
1339f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu          viewport_rect_for_tile_priority_in_view_space) {
13402f22f038970e0d1927c41b04bbf5589bd12c5316Torne (Richard Coles)    active_tree_->set_needs_update_draw_properties();
13412f22f038970e0d1927c41b04bbf5589bd12c5316Torne (Richard Coles)  }
13422f22f038970e0d1927c41b04bbf5589bd12c5316Torne (Richard Coles)
1343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  external_transform_ = transform;
1344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  external_viewport_ = viewport;
134558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  external_clip_ = clip;
1346f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu  viewport_rect_for_tile_priority_ =
1347f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu      viewport_rect_for_tile_priority_in_view_space;
134888109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org  resourceless_software_draw_ = resourceless_software_draw;
1349fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
1350fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) {
1352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (damage_rect.IsEmpty())
1353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
1354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NotifySwapPromiseMonitorsOfSetNeedsRedraw();
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  client_->SetNeedsRedrawRectOnImplThread(damage_rect);
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1358a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid LayerTreeHostImpl::BeginFrame(const BeginFrameArgs& args) {
1359a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  client_->BeginFrame(args);
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeHostImpl::DidSwapBuffers() {
1363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  client_->DidSwapBuffersOnImplThread();
1364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid LayerTreeHostImpl::DidSwapBuffersComplete() {
13670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  client_->DidSwapBuffersCompleteOnImplThread();
1368d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1369d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1370d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LayerTreeHostImpl::ReclaimResources(const CompositorFrameAck* ack) {
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(piman): We may need to do some validation on this ack before
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // processing it.
1373d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (renderer_)
13745e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    renderer_->ReceiveSwapBuffersAck(*ack);
1375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // In OOM, we now might be able to release more resources that were held
1377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // because they were exported.
1378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (tile_manager_) {
1379a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DCHECK(resource_pool_);
1380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    resource_pool_->CheckBusyResources();
1382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    resource_pool_->ReduceResourceUsage();
1383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // If we're not visible, we likely released resources, so we want to
1385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // aggressively flush here to make sure those DeleteTextures make it to the
1386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // GPU process to free up the memory.
1387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (resource_provider_ && !visible_)
1388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    resource_provider_->ShallowFlushIfSupported();
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::OnCanDrawStateChangedForTree() {
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->OnCanDrawStateChanged(CanDraw());
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CompositorFrameMetadata LayerTreeHostImpl::MakeCompositorFrameMetadata() const {
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CompositorFrameMetadata metadata;
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  metadata.device_scale_factor = device_scale_factor_;
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  metadata.page_scale_factor = active_tree_->total_page_scale_factor();
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  metadata.viewport_size = active_tree_->ScrollableViewportSize();
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  metadata.root_layer_size = active_tree_->ScrollableSize();
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  metadata.min_page_scale_factor = active_tree_->min_page_scale_factor();
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  metadata.max_page_scale_factor = active_tree_->max_page_scale_factor();
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (top_controls_manager_) {
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    metadata.location_bar_offset =
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Vector2dF(0.f, top_controls_manager_->controls_top_offset());
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    metadata.location_bar_content_translation =
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Vector2dF(0.f, top_controls_manager_->content_top_offset());
1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    metadata.overdraw_bottom_height = overdraw_bottom_height_;
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!InnerViewportScrollLayer())
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return metadata;
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  metadata.root_scroll_offset = active_tree_->TotalScrollOffset();
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return metadata;
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) {
1420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layer->DidBeginTracing();
1421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DrawLayers(FrameData* frame,
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   base::TimeTicks frame_begin_time) {
1425424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers");
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CanDraw());
1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1428558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (frame->has_no_damage) {
14295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD);
1430fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    DCHECK(!output_surface_->capabilities()
1431fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch               .draw_and_swap_full_viewport_every_frame);
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1433558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!frame->render_passes.empty());
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1437424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  fps_counter_->SaveTimeStamp(frame_begin_time,
1438424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                              !output_surface_->context_provider());
1439424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool on_main_thread = false;
14404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  rendering_stats_instrumentation_->IncrementFrameCount(
1441424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      1, on_main_thread);
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tile_manager_) {
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    memory_history_->SaveEntry(
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tile_manager_->memory_stats_from_last_assign());
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (debug_state_.ShowHudRects()) {
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    debug_rect_history_->SaveDebugRectsForCurrentFrame(
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        active_tree_->root_layer(),
1451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        active_tree_->hud_layer(),
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *frame->render_surface_layer_list,
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame->occluding_screen_space_rects,
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame->non_occluding_screen_space_rects,
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        debug_state_);
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!settings_.impl_side_painting && debug_state_.continuous_painting) {
1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const RenderingStats& stats =
1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        rendering_stats_instrumentation_->GetRenderingStats();
14613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    paint_time_counter_->SavePaintTime(stats.main_stats.paint_time);
1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_new_trace;
1465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
1466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (is_new_trace) {
1467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (pending_tree_) {
1468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      LayerTreeHostCommon::CallFunctionForSubtree(
1469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          pending_tree_->root_layer(),
1470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          base::Bind(&LayerTreeHostImplDidBeginTracingCallback));
1471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LayerTreeHostCommon::CallFunctionForSubtree(
1473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        active_tree_->root_layer(),
1474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(&LayerTreeHostImplDidBeginTracingCallback));
1475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
147790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
1478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      TRACE_DISABLED_BY_DEFAULT("cc.debug") ","
1479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      TRACE_DISABLED_BY_DEFAULT("cc.debug.quads") ","
1480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      TRACE_DISABLED_BY_DEFAULT("devtools.timeline.layers"),
1481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "cc::LayerTreeHostImpl",
1482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      id_,
1483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      TracedValue::FromValue(AsValueWithFrame(frame).release()));
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
148588109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org  const DrawMode draw_mode = GetDrawMode();
148688109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Because the contents of the HUD depend on everything else in the frame, the
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // contents of its texture are updated as the last thing before the frame is
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // drawn.
14904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (active_tree_->hud_layer()) {
14914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture");
149288109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org    active_tree_->hud_layer()->UpdateHudTexture(draw_mode,
149388109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org                                                resource_provider_.get());
14944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
149688109bffdff235e691fea3aefa461782a195ed10boliu@chromium.org  if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) {
14974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool disable_picture_quad_image_filtering =
14984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        IsCurrentlyScrolling() || needs_animate_layers();
149958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1500b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scoped_ptr<SoftwareRenderer> temp_software_renderer =
150158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        SoftwareRenderer::Create(this, &settings_, output_surface_.get(), NULL);
1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    temp_software_renderer->DrawFrame(&frame->render_passes,
1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      device_scale_factor_,
1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      DeviceViewport(),
1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      DeviceClip(),
1506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      disable_picture_quad_image_filtering);
1507b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
1508424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    renderer_->DrawFrame(&frame->render_passes,
150958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         device_scale_factor_,
1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         DeviceViewport(),
1511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         DeviceClip(),
15124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         false);
1513b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The render passes should be consumed by the renderer.
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(frame->render_passes.empty());
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame->render_passes_by_id.clear();
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The next frame should start by assuming nothing has changed, and changes
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are noted as they occur.
152058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(boliu): If we did a temporary software renderer frame, propogate the
152158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // damage forward to the next frame.
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) {
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()->
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DidDrawDamagedArea();
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  active_tree_->root_layer()->ResetAllChangeTrackingForSubtree();
1527424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
15285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  devtools_instrumentation::DidDrawFrame(id_);
15294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BenchmarkInstrumentation::IssueImplThreadRenderingStatsEvent(
15304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      rendering_stats_instrumentation_->impl_thread_rendering_stats());
15313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats();
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidDrawAllLayers(const FrameData& frame) {
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < frame.will_draw_layers.size(); ++i)
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame.will_draw_layers[i]->DidDraw(resource_provider_.get());
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Once all layers have been drawn, pending texture uploads should no
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // longer block future uploads.
1540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  resource_provider_->MarkPendingUploadsAsNonBlocking();
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::FinishAllRendering() {
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (renderer_)
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    renderer_->Finish();
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::IsContextLost() {
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(proxy_->IsImplThread());
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return renderer_ && renderer_->IsContextLost();
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LayerTreeHostImpl::SetUseGpuRasterization(bool use_gpu) {
1554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (use_gpu == use_gpu_rasterization_)
1555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  use_gpu_rasterization_ = use_gpu;
1558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ReleaseTreeResources();
1559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Replace existing tile manager with another one that uses appropriate
1561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // rasterizer.
1562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (tile_manager_) {
1563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DestroyTileManager();
1564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CreateAndSetTileManager();
1565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We have released tilings for both active and pending tree.
1568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We would not have any content to draw until the pending tree is activated.
1569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Prevent the active tree from drawing until activation.
1570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  active_tree_->SetRequiresHighResToDraw();
1571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const RendererCapabilitiesImpl&
15745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LayerTreeHostImpl::GetRendererCapabilities() const {
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return renderer_->Capabilities();
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) {
15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  active_tree()->ResetRequiresHighResToDraw();
1580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (frame.has_no_damage) {
1581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS);
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
1583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CompositorFrameMetadata metadata = MakeCompositorFrameMetadata();
1585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  active_tree()->FinishSwapPromises(&metadata);
1586e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (size_t i = 0; i < metadata.latency_info.size(); i++) {
1587e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    TRACE_EVENT_FLOW_STEP0(
1588e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        "input",
1589e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        "LatencyInfo.Flow",
1590e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        TRACE_ID_DONT_MANGLE(metadata.latency_info[i].trace_id),
1591e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        "SwapBuffers");
1592e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
1593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  renderer_->SwapBuffers(metadata);
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1597a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) {
1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (output_surface_)
1599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    output_surface_->SetNeedsBeginFrame(enable);
16005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  else
16015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK(!enable);
1602a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1603a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1604a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) {
1605a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Sample the frame time now. This time will be used for updating animations
1606a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // when we draw.
1607a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UpdateCurrentFrameTime();
1608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Cache the begin impl frame interval
1609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  begin_impl_frame_interval_ = args.interval;
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::SizeF LayerTreeHostImpl::ComputeInnerViewportContainerSize() const {
1613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::SizeF dip_size =
1614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gfx::ScaleSize(device_viewport_size_, 1.f / device_scale_factor());
1615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  float top_offset =
1617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f;
1618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return gfx::SizeF(dip_size.width(),
1620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    dip_size.height() - top_offset - overdraw_bottom_height_);
1621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void LayerTreeHostImpl::UpdateInnerViewportContainerSize() {
1624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerImpl* container_layer = active_tree_->InnerViewportContainerLayer();
1625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!container_layer)
1626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
1627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // We pass the value returned from UnscaledScrollableViewportSize() here as
1629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // it accounts for scrollbar dimensions when
1630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // container_layer->masks_to_bounds() is set.
1631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  container_layer->SetTemporaryImplBounds(UnscaledScrollableViewportSize());
1632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
163458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::SizeF LayerTreeHostImpl::UnscaledScrollableViewportSize() const {
16358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Use the root container layer bounds if it clips to them, otherwise, the
16368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // true viewport size should be used.
1637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerImpl* container_layer = active_tree_->InnerViewportContainerLayer();
16388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (container_layer && container_layer->masks_to_bounds()) {
1639a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DCHECK(!top_controls_manager_);
1640a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DCHECK_EQ(0, overdraw_bottom_height_);
1641a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return container_layer->bounds();
1642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return ComputeInnerViewportContainerSize();
1645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)float LayerTreeHostImpl::VerticalAdjust() const {
1648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!active_tree_->InnerViewportContainerLayer())
1649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return 0;
1650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return active_tree_->InnerViewportContainerLayer()->BoundsDelta().y();
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidLoseOutputSurface() {
1655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (resource_provider_)
1656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    resource_provider_->DidLoseOutputSurface();
1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(jamesr): The renderer_ check is needed to make some of the
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // LayerTreeHostContextTest tests pass, but shouldn't be necessary (or
1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // important) in production. We should adjust the test to not need this.
1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (renderer_)
1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client_->DidLoseOutputSurfaceOnImplThread();
166223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
1663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  did_lose_called_ = true;
1664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::HaveRootScrollLayer() const {
16685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return !!InnerViewportScrollLayer();
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::RootLayer() const {
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return active_tree_->root_layer();
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LayerImpl* LayerTreeHostImpl::InnerViewportScrollLayer() const {
16765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return active_tree_->InnerViewportScrollLayer();
16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
16785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LayerImpl* LayerTreeHostImpl::OuterViewportScrollLayer() const {
16805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return active_tree_->OuterViewportScrollLayer();
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const {
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return active_tree_->CurrentlyScrollingLayer();
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool LayerTreeHostImpl::IsCurrentlyScrolling() const {
16884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return CurrentlyScrollingLayer() ||
16895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         (InnerViewportScrollLayer() &&
16905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          InnerViewportScrollLayer()->IsExternalFlingActive()) ||
16915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         (OuterViewportScrollLayer() &&
16925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          OuterViewportScrollLayer()->IsExternalFlingActive());
16934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
16944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Content layers can be either directly scrollable or contained in an outer
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scrolling layer which applies the scroll transform. Given a content layer,
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this function returns the associated scroll layer if any.
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static LayerImpl* FindScrollLayerForContentLayer(LayerImpl* layer_impl) {
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer_impl)
170068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return NULL;
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_impl->scrollable())
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return layer_impl;
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_impl->DrawsContent() &&
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_impl->parent() &&
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_impl->parent()->scrollable())
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return layer_impl->parent();
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
171068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return NULL;
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::CreatePendingTree() {
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(!pending_tree_);
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (recycle_tree_)
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    recycle_tree_.swap(pending_tree_);
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pending_tree_ = LayerTreeImpl::create(this);
1719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Update the delta from the active tree, which may have
1721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // adjusted its delta prior to the pending tree being created.
1722f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK_EQ(1.f, pending_tree_->sent_page_scale_delta());
1723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pending_tree_->SetPageScaleDelta(active_tree_->page_scale_delta() /
1724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                   active_tree_->sent_page_scale_delta());
1725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->OnCanDrawStateChanged(CanDraw());
17271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree:waiting", pending_tree_.get());
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1730ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid LayerTreeHostImpl::UpdateVisibleTiles() {
1731ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (tile_manager_ && tile_manager_->UpdateVisibleTiles())
1732ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    DidInitializeVisibleTile();
1733ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  need_to_update_visible_tiles_before_draw_ = false;
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ActivatePendingTree() {
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(pending_tree_);
17381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TRACE_EVENT_ASYNC_END0("cc", "PendingTree:waiting", pending_tree_.get());
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1740424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  need_to_update_visible_tiles_before_draw_ = true;
1741424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  active_tree_->SetRootLayerScrollOffsetDelegate(NULL);
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  active_tree_->PushPersistedState(pending_tree_.get());
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (pending_tree_->needs_full_tree_sync()) {
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    active_tree_->SetRootLayer(
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TreeSynchronizer::SynchronizeTrees(pending_tree_->root_layer(),
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           active_tree_->DetachLayerTree(),
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           active_tree_.get()));
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TreeSynchronizer::PushProperties(pending_tree_->root_layer(),
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   active_tree_->root_layer());
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!recycle_tree_);
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1754a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Process any requests in the UI resource queue.  The request queue is given
1755a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // in LayerTreeHost::FinishCommitOnImplThread.  This must take place before
1756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the swap.
1757a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  pending_tree_->ProcessUIResourceRequestQueue();
1758a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_tree_->PushPropertiesTo(active_tree_.get());
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now that we've synced everything from the pending tree to the active
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tree, rename the pending tree the recycle tree so we can reuse it on the
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // next sync.
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_tree_.swap(recycle_tree_);
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  active_tree_->DidBecomeActive();
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  active_tree_->SetRootLayerScrollOffsetDelegate(
1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_layer_scroll_offset_delegate_);
17695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ActivateAnimations();
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->OnCanDrawStateChanged(CanDraw());
1772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetNeedsRedraw();
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->RenewTreePriority();
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (debug_state_.continuous_painting) {
1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const RenderingStats& stats =
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        rendering_stats_instrumentation_->GetRenderingStats();
17784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    paint_time_counter_->SavePaintTime(stats.main_stats.paint_time +
17794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                       stats.main_stats.record_time +
17804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                       stats.impl_stats.rasterize_time);
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1782a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UpdateInnerViewportContainerSize();
1784a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  client_->DidActivatePendingTree();
1785a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (!tree_activation_callback_.is_null())
1786a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    tree_activation_callback_.Run();
1787424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1788424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (time_source_client_adapter_ && time_source_client_adapter_->Active())
1789424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK(active_tree_->root_layer());
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetVisible(bool visible) {
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(proxy_->IsImplThread());
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (visible_ == visible)
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  visible_ = visible;
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DidVisibilityChange(this, visible_);
179990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy());
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1801cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If we just became visible, we have to ensure that we draw high res tiles,
1802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to prevent checkerboard/low res flashes.
1803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (visible_)
18045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    active_tree()->SetRequiresHighResToDraw();
1805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
180658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EvictAllUIResources();
180758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Evict tiles immediately if invisible since this tab may never get another
18093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // draw or timer tick.
18103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!visible_)
18113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ManageTiles();
18123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!renderer_)
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderer_->SetVisible(visible);
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid LayerTreeHostImpl::SetNeedsAnimate() {
18205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NotifySwapPromiseMonitorsOfSetNeedsRedraw();
18215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  client_->SetNeedsAnimateOnImplThread();
18225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
18235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeHostImpl::SetNeedsRedraw() {
1825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NotifySwapPromiseMonitorsOfSetNeedsRedraw();
1826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  client_->SetNeedsRedrawOnImplThread();
1827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
182990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ManagedMemoryPolicy LayerTreeHostImpl::ActualManagedMemoryPolicy() const {
1830a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ManagedMemoryPolicy actual = cached_managed_memory_policy_;
1831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (debug_state_.rasterize_only_visible_content) {
1832a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    actual.priority_cutoff_when_visible =
18331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        gpu::MemoryAllocation::CUTOFF_ALLOW_REQUIRED_ONLY;
1834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (use_gpu_rasterization()) {
1835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    actual.priority_cutoff_when_visible =
1836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE;
1837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (zero_budget_) {
1840a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    actual.bytes_limit_when_visible = 0;
1841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
1842a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
184390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return actual;
184490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
184590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)size_t LayerTreeHostImpl::memory_allocation_limit_bytes() const {
1847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return ActualManagedMemoryPolicy().bytes_limit_when_visible;
1848a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
185068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int LayerTreeHostImpl::memory_allocation_priority_cutoff() const {
185168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return ManagedMemoryPolicy::PriorityCutoffToValue(
185268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ActualManagedMemoryPolicy().priority_cutoff_when_visible);
185368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
185468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LayerTreeHostImpl::ReleaseTreeResources() {
1856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  active_tree_->ReleaseResources();
1857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (pending_tree_)
1858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_tree_->ReleaseResources();
1859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (recycle_tree_)
1860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    recycle_tree_->ReleaseResources();
1861a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
186258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EvictAllUIResources();
1863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1865cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LayerTreeHostImpl::CreateAndSetRenderer() {
1866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!renderer_);
1867cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(output_surface_);
1868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(resource_provider_);
1869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (output_surface_->capabilities().delegated_rendering) {
187158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    renderer_ = DelegatingRenderer::Create(
1872cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        this, &settings_, output_surface_.get(), resource_provider_.get());
1873cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (output_surface_->context_provider()) {
1874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    renderer_ = GLRenderer::Create(this,
187558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   &settings_,
1876cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   output_surface_.get(),
1877cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   resource_provider_.get(),
187858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   texture_mailbox_deleter_.get(),
1879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                   settings_.highp_threshold_min);
1880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (output_surface_->software_device()) {
188158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    renderer_ = SoftwareRenderer::Create(
1882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        this, &settings_, output_surface_.get(), resource_provider_.get());
1883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
18840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(renderer_);
1885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  renderer_->SetVisible(visible_);
18870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetFullRootLayerDamage();
1888d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
18890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // See note in LayerTreeImpl::UpdateDrawProperties.  Renderer needs to be
18900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // initialized to get max texture size.  Also, after releasing resources,
18910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // trees need another update to generate new ones.
18920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  active_tree_->set_needs_update_draw_properties();
18930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (pending_tree_)
18940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    pending_tree_->set_needs_update_draw_properties();
18950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  client_->UpdateRendererCapabilitiesOnImplThread();
1896eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1897eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LayerTreeHostImpl::CreateAndSetTileManager() {
1899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!tile_manager_);
19007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(settings_.impl_side_painting);
1901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(output_surface_);
1902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(resource_provider_);
1903a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(proxy_->ImplThreadTaskRunner());
1904c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ContextProvider* context_provider = output_surface_->context_provider();
19065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  transfer_buffer_memory_limit_ =
19075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GetMaxTransferBufferUsageBytes(context_provider);
19085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (use_gpu_rasterization_ && context_provider) {
1910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    resource_pool_ =
1911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ResourcePool::Create(resource_provider_.get(),
1912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             GL_TEXTURE_2D,
1913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             resource_provider_->best_texture_format());
1914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    raster_worker_pool_ =
1916cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        DirectRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(),
1917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       resource_provider_.get(),
1918cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       context_provider);
1919bee9932bab44713b74b422b4b759b49f5a222977Bo Liu    on_demand_task_graph_runner_ = &synchronous_task_graph_runner_;
1920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (UseZeroCopyTextureUpload()) {
19215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    resource_pool_ =
1922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ResourcePool::Create(resource_provider_.get(),
19235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                             GetMapImageTextureTarget(context_provider),
1924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             resource_provider_->best_texture_format());
1925cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1926a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    raster_worker_pool_ =
1927a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(),
1928a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                      RasterWorkerPool::GetTaskGraphRunner(),
1929cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      resource_provider_.get());
1930bee9932bab44713b74b422b4b759b49f5a222977Bo Liu    on_demand_task_graph_runner_ = RasterWorkerPool::GetTaskGraphRunner();
1931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (UseOneCopyTextureUpload()) {
19325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // We need to create a staging resource pool when using copy rasterizer.
19335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    staging_resource_pool_ =
1934cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ResourcePool::Create(resource_provider_.get(),
1935a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             GetMapImageTextureTarget(context_provider),
1936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             resource_provider_->best_texture_format());
19375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    resource_pool_ =
1938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ResourcePool::Create(resource_provider_.get(),
19395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                             GL_TEXTURE_2D,
1940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             resource_provider_->best_texture_format());
19415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
19425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    raster_worker_pool_ = ImageCopyRasterWorkerPool::Create(
19435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        proxy_->ImplThreadTaskRunner(),
19445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        RasterWorkerPool::GetTaskGraphRunner(),
1945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_provider_.get(),
19465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        staging_resource_pool_.get());
1947bee9932bab44713b74b422b4b759b49f5a222977Bo Liu    on_demand_task_graph_runner_ = RasterWorkerPool::GetTaskGraphRunner();
1948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else {
1949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    resource_pool_ = ResourcePool::Create(
1950cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_provider_.get(),
1951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        GL_TEXTURE_2D,
1952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_provider_->memory_efficient_texture_format());
1953cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1954a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
1955c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        proxy_->ImplThreadTaskRunner(),
1956a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        RasterWorkerPool::GetTaskGraphRunner(),
1957cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        resource_provider_.get(),
19585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        transfer_buffer_memory_limit_);
1959bee9932bab44713b74b422b4b759b49f5a222977Bo Liu    on_demand_task_graph_runner_ = RasterWorkerPool::GetTaskGraphRunner();
1960c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1961cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
196258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tile_manager_ =
196358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TileManager::Create(this,
1964cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          proxy_->ImplThreadTaskRunner(),
1965a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          resource_pool_.get(),
1966a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          raster_worker_pool_->AsRasterizer(),
1967c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          rendering_stats_instrumentation_);
196858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
1970ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  need_to_update_visible_tiles_before_draw_ = false;
1971bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  on_demand_task_namespace_ = on_demand_task_graph_runner_->GetNamespaceToken();
19727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
19737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1974cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LayerTreeHostImpl::DestroyTileManager() {
1975cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  tile_manager_.reset();
1976cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  resource_pool_.reset();
1977cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  staging_resource_pool_.reset();
1978cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  raster_worker_pool_.reset();
1979cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1980cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LayerTreeHostImpl::UseZeroCopyTextureUpload() const {
1982cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Note: we use zero-copy by default when the renderer is using
1983cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // shared memory resources.
1984cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return (settings_.use_zero_copy ||
1985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          GetRendererCapabilities().using_shared_memory_resources) &&
1986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         GetRendererCapabilities().using_map_image;
1987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1989cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LayerTreeHostImpl::UseOneCopyTextureUpload() const {
1990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Sync query support is required by one-copy rasterizer.
1991cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return settings_.use_one_copy && GetRendererCapabilities().using_map_image &&
1992cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         resource_provider_->use_sync_query();
1993cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1994cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1995eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) {
1996a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget);
1997eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::InitializeRenderer(
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<OutputSurface> output_surface) {
2001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer");
200223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
2003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!renderer_ || did_lose_called_);
2004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
2005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Since we will create a new resource provider, we cannot continue to use
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the old resources (i.e. render_surfaces and texture IDs). Clear them
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // before we destroy the old resource provider.
2009eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ReleaseTreeResources();
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note: order is important here.
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderer_.reset();
2013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DestroyTileManager();
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource_provider_.reset();
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output_surface_.reset();
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!output_surface->BindToClient(this))
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  output_surface_ = output_surface.Pass();
2021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  resource_provider_ =
2022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ResourceProvider::Create(output_surface_.get(),
20231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               shared_bitmap_manager_,
20241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               settings_.highp_threshold_min,
20250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                               settings_.use_rgba_4444_textures,
2026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               settings_.texture_id_allocation_chunk_size,
2027010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               settings_.use_distance_field_text);
2028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (output_surface_->capabilities().deferred_gl_initialization)
2030eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EnforceZeroBudget(true);
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateAndSetRenderer();
203390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  transfer_buffer_memory_limit_ =
2035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetMaxTransferBufferUsageBytes(output_surface_->context_provider());
20365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (settings_.impl_side_painting)
2038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CreateAndSetTileManager();
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Initialize vsync parameters to sane values.
20415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const base::TimeDelta display_refresh_interval =
20425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond /
20435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        settings_.refresh_rate);
20445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CommitVSyncParameters(base::TimeTicks(), display_refresh_interval);
20457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
20465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TODO(brianderson): Don't use a hard-coded parent draw time.
20475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::TimeDelta parent_draw_time =
2048f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (!settings_.begin_frame_scheduling_enabled &&
2049f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       output_surface_->capabilities().adjust_deadline_for_parent)
2050f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ? BeginFrameArgs::DefaultEstimatedParentDrawTime()
20515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          : base::TimeDelta();
20525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  client_->SetEstimatedParentDrawTime(parent_draw_time);
20537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int max_frames_pending = output_surface_->capabilities().max_frames_pending;
20557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (max_frames_pending <= 0)
20567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING;
20570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  client_->SetMaxSwapsPendingOnImplThread(max_frames_pending);
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->OnCanDrawStateChanged(CanDraw());
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid LayerTreeHostImpl::CommitVSyncParameters(base::TimeTicks timebase,
20645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                              base::TimeDelta interval) {
20655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  client_->CommitVSyncParameters(timebase, interval);
20665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
20675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
20685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid LayerTreeHostImpl::DeferredInitialize() {
2069868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(output_surface_->capabilities().deferred_gl_initialization);
2070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(settings_.impl_side_painting);
20713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(output_surface_->context_provider());
2072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ReleaseTreeResources();
2074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  renderer_.reset();
2075f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DestroyTileManager();
2076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
20770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  resource_provider_->InitializeGL();
2078424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateAndSetRenderer();
20805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EnforceZeroBudget(false);
2081f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CreateAndSetTileManager();
2082f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
20835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  client_->SetNeedsCommitOnImplThread();
2084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
20867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeHostImpl::ReleaseGL() {
20877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(output_surface_->capabilities().deferred_gl_initialization);
20887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(settings_.impl_side_painting);
20893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(output_surface_->context_provider());
20907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
20917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ReleaseTreeResources();
20927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  renderer_.reset();
2093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DestroyTileManager();
20947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2095f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  resource_provider_->InitializeSoftware();
2096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  output_surface_->ReleaseContextProvider();
20977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2098f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CreateAndSetRenderer();
20997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EnforceZeroBudget(true);
2100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateAndSetTileManager();
21017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
21027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  client_->SetNeedsCommitOnImplThread();
21037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
21047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
21055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) {
2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (device_viewport_size == device_viewport_size_)
21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
210958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (pending_tree_)
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    active_tree_->SetViewportSizeInvalid();
21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  device_viewport_size_ = device_viewport_size;
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UpdateInnerViewportContainerSize();
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->OnCanDrawStateChanged(CanDraw());
2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetFullRootLayerDamage();
21178f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  active_tree_->set_needs_update_draw_properties();
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) {
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (overdraw_bottom_height == overdraw_bottom_height_)
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overdraw_bottom_height_ = overdraw_bottom_height;
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UpdateInnerViewportContainerSize();
2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetFullRootLayerDamage();
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void LayerTreeHostImpl::SetOverhangUIResource(
213058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UIResourceId overhang_ui_resource_id,
21315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Size& overhang_ui_resource_size) {
213258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  overhang_ui_resource_id_ = overhang_ui_resource_id;
213358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  overhang_ui_resource_size_ = overhang_ui_resource_size;
213458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
213558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) {
21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (device_scale_factor == device_scale_factor_)
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  device_scale_factor_ = device_scale_factor;
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UpdateInnerViewportContainerSize();
2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetFullRootLayerDamage();
21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2145f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shuconst gfx::Rect LayerTreeHostImpl::ViewportRectForTilePriority() const {
2146f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu  if (viewport_rect_for_tile_priority_.IsEmpty())
2147f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu    return DeviceViewport();
2148f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu
2149f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu  return viewport_rect_for_tile_priority_;
2150f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu}
2151f4933c2d2f8300a84cd1cd69e0ecb40f3b807f06Hui Shu
215258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Size LayerTreeHostImpl::DrawViewportSize() const {
215358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return DeviceViewport().size();
215458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
215558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gfx::Rect LayerTreeHostImpl::DeviceViewport() const {
2157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (external_viewport_.IsEmpty())
2158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return gfx::Rect(device_viewport_size_);
2159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return external_viewport_;
2161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
216358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Rect LayerTreeHostImpl::DeviceClip() const {
216458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (external_clip_.IsEmpty())
216558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return DeviceViewport();
216658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
216758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return external_clip_;
216858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
216958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
217058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const gfx::Transform& LayerTreeHostImpl::DrawTransform() const {
2171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return external_transform_;
2172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::DidChangeTopControlsPosition() {
2175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UpdateInnerViewportContainerSize();
2176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetNeedsRedraw();
21775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetNeedsAnimate();
2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  active_tree_->set_needs_update_draw_properties();
2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetFullRootLayerDamage();
21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
218290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) {
218390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(input_handler_client_ == NULL);
218490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  input_handler_client_ = client;
218590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
218690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static LayerImpl* NextScrollLayer(LayerImpl* layer) {
2188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (LayerImpl* scroll_parent = layer->scroll_parent())
2189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return scroll_parent;
2190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return layer->parent();
2191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
2192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
21934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint(
21945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::PointF& device_viewport_point,
21955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputHandler::ScrollInputType type,
2196e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    LayerImpl* layer_impl,
2197e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    bool* scroll_on_main_thread,
2198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool* optional_has_ancestor_scroll_handler) const {
219968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(scroll_on_main_thread);
22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Walk up the hierarchy and look for a scrollable layer.
2202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LayerImpl* potentially_scrolling_layer_impl = NULL;
2203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (; layer_impl; layer_impl = NextScrollLayer(layer_impl)) {
22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The content layer can also block attempts to scroll outside the main
22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // thread.
22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScrollStatus status = layer_impl->TryScroll(device_viewport_point, type);
22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (status == ScrollOnMainThread) {
220868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      *scroll_on_main_thread = true;
220968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return NULL;
22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* scroll_layer_impl = FindScrollLayerForContentLayer(layer_impl);
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!scroll_layer_impl)
22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status = scroll_layer_impl->TryScroll(device_viewport_point, type);
22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If any layer wants to divert the scroll event to the main thread, abort.
22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (status == ScrollOnMainThread) {
221968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      *scroll_on_main_thread = true;
222068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return NULL;
22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (optional_has_ancestor_scroll_handler &&
2224e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        scroll_layer_impl->have_scroll_event_handlers())
2225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *optional_has_ancestor_scroll_handler = true;
2226e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (status == ScrollStarted && !potentially_scrolling_layer_impl)
22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      potentially_scrolling_layer_impl = scroll_layer_impl;
22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Falling back to the root scroll layer ensures generation of root overscroll
2232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // notifications while preventing scroll updates from being unintentionally
2233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // forwarded to the main thread.
2234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!potentially_scrolling_layer_impl)
2235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    potentially_scrolling_layer_impl = OuterViewportScrollLayer()
2236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                           ? OuterViewportScrollLayer()
2237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                           : InnerViewportScrollLayer();
2238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
223968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return potentially_scrolling_layer_impl;
224068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
224168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Similar to LayerImpl::HasAncestor, but walks up the scroll parents.
22430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic bool HasScrollAncestor(LayerImpl* child, LayerImpl* scroll_ancestor) {
22440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(scroll_ancestor);
22450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (LayerImpl* ancestor = child; ancestor;
22460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch       ancestor = NextScrollLayer(ancestor)) {
22470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (ancestor->scrollable())
22480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return ancestor == scroll_ancestor;
22490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
22500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return false;
22510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
22520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
225368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin(
2254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const gfx::Point& viewport_point,
2255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    InputHandler::ScrollInputType type) {
225668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin");
225768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
225868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (top_controls_manager_)
225968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    top_controls_manager_->ScrollBegin();
226068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
226168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(!CurrentlyScrollingLayer());
226268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ClearCurrentlyScrollingLayer();
226368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::PointF device_viewport_point = gfx::ScalePoint(viewport_point,
22654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                      device_scale_factor_);
2266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LayerImpl* layer_impl =
2267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      active_tree_->FindLayerThatIsHitByPoint(device_viewport_point);
22680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
22690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (layer_impl) {
22700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    LayerImpl* scroll_layer_impl =
2271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        active_tree_->FindFirstScrollingLayerThatIsHitByPoint(
2272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            device_viewport_point);
22730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (scroll_layer_impl && !HasScrollAncestor(layer_impl, scroll_layer_impl))
22740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return ScrollUnknown;
22750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
22760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
227768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool scroll_on_main_thread = false;
2278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LayerImpl* scrolling_layer_impl =
2279e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FindScrollLayerForDeviceViewportPoint(device_viewport_point,
2280e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                            type,
2281e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                            layer_impl,
2282e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                            &scroll_on_main_thread,
2283e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                            &scroll_affects_scroll_handler_);
228468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
228568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (scroll_on_main_thread) {
228668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true);
228768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return ScrollOnMainThread;
228868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
228968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (scrolling_layer_impl) {
2291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    active_tree_->SetCurrentlyScrollingLayer(scrolling_layer_impl);
22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    should_bubble_scrolls_ = (type != NonBubblingGesture);
22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wheel_scrolling_ = (type == Wheel);
22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->RenewTreePriority();
22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false);
22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ScrollStarted;
22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ScrollIgnored;
22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2dF LayerTreeHostImpl::ScrollLayerWithViewportSpaceDelta(
23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* layer_impl,
23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float scale_from_viewport_to_screen_space,
23045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::PointF& viewport_point,
23055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Vector2dF& viewport_delta) {
23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Layers with non-invertible screen space transforms should not have passed
23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the scroll hit test in the first place.
23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(layer_impl->screen_space_transform().IsInvertible());
23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform inverse_screen_space_transform(
23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform::kSkipInitialization);
23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool did_invert = layer_impl->screen_space_transform().GetInverse(
23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &inverse_screen_space_transform);
2313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(shawnsingh): With the advent of impl-side crolling for non-root
2314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // layers, we may need to explicitly handle uninvertible transforms here.
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(did_invert);
23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF screen_space_point =
23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScalePoint(viewport_point, scale_from_viewport_to_screen_space);
23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2dF screen_space_delta = viewport_delta;
23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  screen_space_delta.Scale(scale_from_viewport_to_screen_space);
23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First project the scroll start and end points to local layer space to find
23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the scroll delta in layer coordinates.
23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool start_clipped, end_clipped;
23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF screen_space_end_point = screen_space_point + screen_space_delta;
23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF local_start_point =
23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MathUtil::ProjectPoint(inverse_screen_space_transform,
23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             screen_space_point,
23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             &start_clipped);
23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF local_end_point =
23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MathUtil::ProjectPoint(inverse_screen_space_transform,
23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             screen_space_end_point,
23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             &end_clipped);
23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In general scroll point coordinates should not get clipped.
23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!start_clipped);
23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!end_clipped);
23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (start_clipped || end_clipped)
23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2dF();
23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // local_start_point and local_end_point are in content space but we want to
23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // move them to layer space for scrolling.
23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float width_scale = 1.f / layer_impl->contents_scale_x();
23452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float height_scale = 1.f / layer_impl->contents_scale_y();
23462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_start_point.Scale(width_scale, height_scale);
23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_end_point.Scale(width_scale, height_scale);
23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Apply the scroll delta.
2350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2dF previous_delta = layer_impl->ScrollDelta();
23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_impl->ScrollBy(local_end_point - local_start_point);
23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the end point in the layer's content space so we can apply its
23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ScreenSpaceTransform.
23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF actual_local_end_point = local_start_point +
2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       layer_impl->ScrollDelta() -
23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       previous_delta;
23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF actual_local_content_end_point =
23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScalePoint(actual_local_end_point,
23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      1.f / width_scale,
23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      1.f / height_scale);
23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate the applied scroll delta in viewport space coordinates.
23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF actual_screen_space_end_point =
23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MathUtil::MapPoint(layer_impl->screen_space_transform(),
23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         actual_local_content_end_point,
23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         &end_clipped);
23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!end_clipped);
23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (end_clipped)
23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2dF();
23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF actual_viewport_end_point =
23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScalePoint(actual_screen_space_end_point,
23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      1.f / scale_from_viewport_to_screen_space);
23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return actual_viewport_end_point - viewport_point;
23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static gfx::Vector2dF ScrollLayerWithLocalDelta(LayerImpl* layer_impl,
23785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Vector2dF& local_delta) {
2379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2dF previous_delta(layer_impl->ScrollDelta());
23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_impl->ScrollBy(local_delta);
2381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return layer_impl->ScrollDelta() - previous_delta;
23822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool LayerTreeHostImpl::ScrollBy(const gfx::Point& viewport_point,
23855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const gfx::Vector2dF& scroll_delta) {
23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy");
23872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!CurrentlyScrollingLayer())
23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2dF pending_delta = scroll_delta;
239190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Vector2dF unused_root_delta;
2392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool did_scroll_x = false;
2393ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool did_scroll_y = false;
2394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool did_scroll_top_controls = false;
23955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(wjmaclean) Should we guard against CurrentlyScrollingLayer() == 0
23965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // here?
23975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool consume_by_top_controls =
23985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      top_controls_manager_ &&
23995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (((CurrentlyScrollingLayer() == InnerViewportScrollLayer() ||
24005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         CurrentlyScrollingLayer() == OuterViewportScrollLayer()) &&
24015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        InnerViewportScrollLayer()->MaxScrollOffset().y() > 0) ||
24025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       scroll_delta.y() < 0);
24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (LayerImpl* layer_impl = CurrentlyScrollingLayer();
24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       layer_impl;
24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       layer_impl = layer_impl->parent()) {
24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layer_impl->scrollable())
24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (layer_impl == InnerViewportScrollLayer()) {
241190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Only allow bubble scrolling when the scroll is in the direction to make
241290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the top controls visible.
24135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Vector2dF applied_delta;
24145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Vector2dF excess_delta;
24155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (consume_by_top_controls) {
24165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        excess_delta = top_controls_manager_->ScrollBy(pending_delta);
24175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        applied_delta = pending_delta - excess_delta;
24185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pending_delta = excess_delta;
24195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Force updating of vertical adjust values if needed.
2420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (applied_delta.y() != 0) {
2421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          did_scroll_top_controls = true;
24225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          layer_impl->ScrollbarParametersDidChange();
2423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
242490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
242590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Track root layer deltas for reporting overscroll.
242690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      unused_root_delta = pending_delta;
24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Vector2dF applied_delta;
24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Gesture events need to be transformed from viewport coordinates to local
24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // layer coordinates so that the scrolling contents exactly follow the
24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // user's finger. In contrast, wheel events represent a fixed amount of
24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // scrolling so we can just apply them directly.
24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!wheel_scrolling_) {
24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      float scale_from_viewport_to_screen_space = device_scale_factor_;
24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      applied_delta =
24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ScrollLayerWithViewportSpaceDelta(layer_impl,
24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            scale_from_viewport_to_screen_space,
24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            viewport_point, pending_delta);
24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      applied_delta = ScrollLayerWithLocalDelta(layer_impl, pending_delta);
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const float kEpsilon = 0.1f;
2445e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (layer_impl == InnerViewportScrollLayer()) {
2446e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      unused_root_delta.Subtract(applied_delta);
2447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (std::abs(unused_root_delta.x()) < kEpsilon)
2448e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        unused_root_delta.set_x(0.0f);
2449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (std::abs(unused_root_delta.y()) < kEpsilon)
2450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        unused_root_delta.set_y(0.0f);
2451a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // Disable overscroll on axes which is impossible to scroll.
2452a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (settings_.report_overscroll_only_for_scrollable_axes) {
2453a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        if (std::abs(active_tree_->TotalMaxScrollOffset().x()) <= kEpsilon)
2454a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          unused_root_delta.set_x(0.0f);
2455a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        if (std::abs(active_tree_->TotalMaxScrollOffset().y()) <= kEpsilon)
2456a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          unused_root_delta.set_y(0.0f);
2457a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      }
2458e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
2459e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the layer wasn't able to move, try the next one in the hierarchy.
2461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool did_move_layer_x = std::abs(applied_delta.x()) > kEpsilon;
2462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool did_move_layer_y = std::abs(applied_delta.y()) > kEpsilon;
2463ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    did_scroll_x |= did_move_layer_x;
2464ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    did_scroll_y |= did_move_layer_y;
2465ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!did_move_layer_x && !did_move_layer_y) {
2466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // Scrolls should always bubble between the outer and inner viewports
2467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (should_bubble_scrolls_ || !did_lock_scrolling_layer_ ||
2468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          layer_impl == OuterViewportScrollLayer())
24694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        continue;
24705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      else
24715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
247390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_lock_scrolling_layer_ = true;
24752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!should_bubble_scrolls_) {
24762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      active_tree_->SetCurrentlyScrollingLayer(layer_impl);
24772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the applied delta is within 45 degrees of the input delta, bail out to
24812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // make it easier to scroll just one layer in one direction without
24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // affecting any of its parents.
24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float angle_threshold = 45;
24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (MathUtil::SmallestAngleBetweenVectors(
24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            applied_delta, pending_delta) < angle_threshold) {
24862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pending_delta = gfx::Vector2d();
24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
24882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
24892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Allow further movement only on an axis perpendicular to the direction in
24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which the layer moved.
24922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Vector2dF perpendicular_axis(-applied_delta.y(), applied_delta.x());
24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pending_delta = MathUtil::ProjectVector(pending_delta, perpendicular_axis);
24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
249590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (gfx::ToRoundedVector2d(pending_delta).IsZero())
24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
24972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool did_scroll_content = did_scroll_x || did_scroll_y;
2500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (did_scroll_content) {
25012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->SetNeedsCommitOnImplThread();
2502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SetNeedsRedraw();
25032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->RenewTreePriority();
250490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
250590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2506ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Scrolling along an axis resets accumulated root overscroll for that axis.
2507ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (did_scroll_x)
2508ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    accumulated_root_overscroll_.set_x(0);
2509ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (did_scroll_y)
2510ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    accumulated_root_overscroll_.set_y(0);
2511ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
251290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  accumulated_root_overscroll_ += unused_root_delta;
2513effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool did_overscroll = !unused_root_delta.IsZero();
251490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (did_overscroll && input_handler_client_) {
2515e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    input_handler_client_->DidOverscroll(accumulated_root_overscroll_,
2516e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                         unused_root_delta);
25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
251890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return did_scroll_content || did_scroll_top_controls;
25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This implements scrolling by page as described here:
25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://msdn.microsoft.com/en-us/library/windows/desktop/ms645601(v=vs.85).aspx#_win32_The_Mouse_Wheel
25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for events with WHEEL_PAGESCROLL set.
2525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool LayerTreeHostImpl::ScrollVerticallyByPage(const gfx::Point& viewport_point,
252690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               ScrollDirection direction) {
25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(wheel_scrolling_);
25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (LayerImpl* layer_impl = CurrentlyScrollingLayer();
25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       layer_impl;
25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       layer_impl = layer_impl->parent()) {
25322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layer_impl->scrollable())
25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!layer_impl->HasScrollbar(VERTICAL))
25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    float height = layer_impl->clip_height();
25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // These magical values match WebKit and are designed to scroll nearly the
25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // entire visible content height but leave a bit of overlap.
25422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page = std::max(height * 0.875f, 1.f);
254390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (direction == SCROLL_BACKWARD)
25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page = -page;
25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Vector2dF delta = gfx::Vector2dF(0.f, page);
25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Vector2dF applied_delta = ScrollLayerWithLocalDelta(layer_impl, delta);
25492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!applied_delta.IsZero()) {
25512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_->SetNeedsCommitOnImplThread();
2552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SetNeedsRedraw();
25532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_->RenewTreePriority();
25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    active_tree_->SetCurrentlyScrollingLayer(layer_impl);
25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
25612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetRootLayerScrollOffsetDelegate(
2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) {
2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  active_tree_->SetRootLayerScrollOffsetDelegate(
2567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_layer_scroll_offset_delegate_);
2568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::OnRootLayerDelegatedScrollOffsetChanged() {
2571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(root_layer_scroll_offset_delegate_ != NULL);
2572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  client_->SetNeedsCommitOnImplThread();
2573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  active_tree_->set_needs_update_draw_properties();
2574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ClearCurrentlyScrollingLayer() {
25772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  active_tree_->ClearCurrentlyScrollingLayer();
25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  did_lock_scrolling_layer_ = false;
2579e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scroll_affects_scroll_handler_ = false;
258090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  accumulated_root_overscroll_ = gfx::Vector2dF();
25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ScrollEnd() {
25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (top_controls_manager_)
25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    top_controls_manager_->ScrollEnd();
25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClearCurrentlyScrollingLayer();
2587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InputHandler::ScrollStatus LayerTreeHostImpl::FlingScrollBegin() {
2590a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!active_tree_->CurrentlyScrollingLayer())
2591a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return ScrollIgnored;
2592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (settings_.ignore_root_layer_flings &&
25945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (active_tree_->CurrentlyScrollingLayer() == InnerViewportScrollLayer() ||
25955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       active_tree_->CurrentlyScrollingLayer() == OuterViewportScrollLayer())) {
2596a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ClearCurrentlyScrollingLayer();
2597a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return ScrollIgnored;
2598a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2599a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
26005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!wheel_scrolling_) {
26015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Allow the fling to lock to the first layer that moves after the initial
26025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // fling |ScrollBy()| event.
26035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    did_lock_scrolling_layer_ = false;
26045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    should_bubble_scrolls_ = false;
26055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
26064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return ScrollStarted;
2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
261068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)float LayerTreeHostImpl::DeviceSpaceDistanceToLayer(
26115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::PointF& device_viewport_point,
261268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    LayerImpl* layer_impl) {
261368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!layer_impl)
261468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return std::numeric_limits<float>::max();
261568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
261668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Rect layer_impl_bounds(
261768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      layer_impl->content_bounds());
261868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
261968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::RectF device_viewport_layer_impl_bounds = MathUtil::MapClippedRect(
262068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      layer_impl->screen_space_transform(),
262168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      layer_impl_bounds);
262268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
262368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return device_viewport_layer_impl_bounds.ManhattanDistanceToPoint(
262468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      device_viewport_point);
262568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
262668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void LayerTreeHostImpl::MouseMoveAt(const gfx::Point& viewport_point) {
26284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::PointF device_viewport_point = gfx::ScalePoint(viewport_point,
26294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                      device_scale_factor_);
2630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LayerImpl* layer_impl =
2631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      active_tree_->FindLayerThatIsHitByPoint(device_viewport_point);
26324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (HandleMouseOverScrollbar(layer_impl, device_viewport_point))
26334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
26344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
26354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (scroll_layer_id_when_mouse_over_scrollbar_) {
26364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerImpl* scroll_layer_impl = active_tree_->LayerById(
26374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        scroll_layer_id_when_mouse_over_scrollbar_);
26384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
26395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // The check for a null scroll_layer_impl below was added to see if it will
26405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // eliminate the crashes described in http://crbug.com/326635.
26415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(wjmaclean) Add a unit test if this fixes the crashes.
26424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ScrollbarAnimationController* animation_controller =
26435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scroll_layer_impl ? scroll_layer_impl->scrollbar_animation_controller()
26445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          : NULL;
2645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (animation_controller)
2646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      animation_controller->DidMouseMoveOffScrollbar();
26474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scroll_layer_id_when_mouse_over_scrollbar_ = 0;
26484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
26494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
265068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool scroll_on_main_thread = false;
2651e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  LayerImpl* scroll_layer_impl =
2652e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FindScrollLayerForDeviceViewportPoint(device_viewport_point,
2653e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                            InputHandler::Gesture,
2654e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                            layer_impl,
2655e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                            &scroll_on_main_thread,
2656e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                            NULL);
265768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (scroll_on_main_thread || !scroll_layer_impl)
265868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
265968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
266068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ScrollbarAnimationController* animation_controller =
266168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      scroll_layer_impl->scrollbar_animation_controller();
266268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!animation_controller)
266368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
266468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(wjmaclean) Is it ok to choose distance from more than two scrollbars?
26665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  float distance_to_scrollbar = std::numeric_limits<float>::max();
26675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (LayerImpl::ScrollbarSet::iterator it =
26685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           scroll_layer_impl->scrollbars()->begin();
26695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != scroll_layer_impl->scrollbars()->end();
26705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it)
26715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    distance_to_scrollbar =
26725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        std::min(distance_to_scrollbar,
26735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 DeviceSpaceDistanceToLayer(device_viewport_point, *it));
267468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  animation_controller->DidMouseMoveNear(distance_to_scrollbar /
2676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         device_scale_factor_);
267768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
267868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool LayerTreeHostImpl::HandleMouseOverScrollbar(LayerImpl* layer_impl,
26805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::PointF& device_viewport_point) {
26814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (layer_impl && layer_impl->ToScrollbarLayer()) {
26824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int scroll_layer_id = layer_impl->ToScrollbarLayer()->ScrollLayerId();
26834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    layer_impl = active_tree_->LayerById(scroll_layer_id);
26844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (layer_impl && layer_impl->scrollbar_animation_controller()) {
26854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scroll_layer_id_when_mouse_over_scrollbar_ = scroll_layer_id;
2686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      layer_impl->scrollbar_animation_controller()->DidMouseMoveNear(0);
26874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
26884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scroll_layer_id_when_mouse_over_scrollbar_ = 0;
26894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
26904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
26914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return true;
26924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
26934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
26944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return false;
26954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
26964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
26972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureBegin() {
26982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pinch_gesture_active_ = true;
26992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  previous_pinch_anchor_ = gfx::Point();
27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->RenewTreePriority();
270168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  pinch_gesture_end_should_clear_scrolling_layer_ = !CurrentlyScrollingLayer();
27025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (active_tree_->OuterViewportScrollLayer()) {
27035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    active_tree_->SetCurrentlyScrollingLayer(
27045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        active_tree_->OuterViewportScrollLayer());
27055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
27065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    active_tree_->SetCurrentlyScrollingLayer(
27075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        active_tree_->InnerViewportScrollLayer());
27085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
27091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (top_controls_manager_)
27101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    top_controls_manager_->PinchBegin();
27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta,
2714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           const gfx::Point& anchor) {
2715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!InnerViewportScrollLayer())
2716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::PinchGestureUpdate");
27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // For a moment the scroll offset ends up being outside of the max range. This
2721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // confuses the delegate so we switch it off till after we're done processing
2722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the pinch update.
2723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  active_tree_->SetRootLayerScrollOffsetDelegate(NULL);
2724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Keep the center-of-pinch anchor specified by (x, y) in a stable
27262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // position over the course of the magnify.
27272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float page_scale_delta = active_tree_->page_scale_delta();
27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF previous_scale_anchor =
27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScalePoint(anchor, 1.f / page_scale_delta);
27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  active_tree_->SetPageScaleDelta(page_scale_delta * magnify_delta);
27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  page_scale_delta = active_tree_->page_scale_delta();
27322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF new_scale_anchor =
27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScalePoint(anchor, 1.f / page_scale_delta);
27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor;
27352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  previous_pinch_anchor_ = anchor;
27372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  move.Scale(1 / active_tree_->page_scale_factor());
27395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If clamping the inner viewport scroll offset causes a change, it should
27405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // be accounted for from the intended move.
27415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  move -= InnerViewportScrollLayer()->ClampScrollToMaxScrollOffset();
27425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
27435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We manually manage the bubbling behaviour here as it is different to that
27445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // implemented in LayerTreeHostImpl::ScrollBy(). Specifically:
27455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // 1) we want to explicit limit the bubbling to the outer/inner viewports,
27465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // 2) we don't want the directional limitations on the unused parts that
27475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //    ScrollBy() implements, and
27485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // 3) pinching should not engage the top controls manager.
27495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF unused = OuterViewportScrollLayer()
27505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              ? OuterViewportScrollLayer()->ScrollBy(move)
27515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              : move;
27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!unused.IsZero()) {
27545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InnerViewportScrollLayer()->ScrollBy(unused);
27555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InnerViewportScrollLayer()->ClampScrollToMaxScrollOffset();
27565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  active_tree_->SetRootLayerScrollOffsetDelegate(
2759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      root_layer_scroll_offset_delegate_);
2760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetNeedsCommitOnImplThread();
2762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetNeedsRedraw();
27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->RenewTreePriority();
27642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureEnd() {
27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pinch_gesture_active_ = false;
276868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (pinch_gesture_end_should_clear_scrolling_layer_) {
276968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    pinch_gesture_end_should_clear_scrolling_layer_ = false;
277068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ClearCurrentlyScrollingLayer();
277168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
27721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (top_controls_manager_)
27731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    top_controls_manager_->PinchEnd();
27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->SetNeedsCommitOnImplThread();
27752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info,
27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                LayerImpl* layer_impl) {
27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer_impl)
27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d scroll_delta =
2783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::ToFlooredVector2d(layer_impl->ScrollDelta());
27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!scroll_delta.IsZero()) {
27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostCommon::ScrollUpdateInfo scroll;
27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll.layer_id = layer_impl->id();
27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll.scroll_delta = scroll_delta;
27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_info->scrolls.push_back(scroll);
27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_impl->SetSentScrollDelta(scroll_delta);
27902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
27912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < layer_impl->children().size(); ++i)
27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CollectScrollDeltas(scroll_info, layer_impl->children()[i]);
27942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() {
27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet());
27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer());
28002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_info->page_scale_delta = active_tree_->page_scale_delta();
28012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta);
28022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scroll_info.Pass();
28042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetFullRootLayerDamage() {
280758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetViewportDamage(gfx::Rect(DrawViewportSize()));
28082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2810bee9932bab44713b74b422b4b759b49f5a222977Bo Liuvoid LayerTreeHostImpl::RunOnDemandRasterTask(Task* on_demand_raster_task) {
2811bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  DCHECK(on_demand_task_graph_runner_);
2812bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
2813bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  // Construct a task graph that contains this single raster task.
2814bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  TaskGraph graph;
2815bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  graph.nodes.push_back(
2816bee9932bab44713b74b422b4b759b49f5a222977Bo Liu      TaskGraph::Node(on_demand_raster_task,
2817bee9932bab44713b74b422b4b759b49f5a222977Bo Liu                      RasterWorkerPool::kOnDemandRasterTaskPriority,
2818bee9932bab44713b74b422b4b759b49f5a222977Bo Liu                      0u));
2819bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
2820bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  // Schedule task and wait for task graph runner to finish running it.
2821bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  on_demand_task_graph_runner_->ScheduleTasks(on_demand_task_namespace_,
2822bee9932bab44713b74b422b4b759b49f5a222977Bo Liu                                              &graph);
2823bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
2824bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  if (on_demand_task_graph_runner_ == &synchronous_task_graph_runner_)
2825bee9932bab44713b74b422b4b759b49f5a222977Bo Liu    on_demand_task_graph_runner_->RunUntilIdle();
2826bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
2827bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  on_demand_task_graph_runner_->WaitForTasksToFinishRunning(
2828bee9932bab44713b74b422b4b759b49f5a222977Bo Liu      on_demand_task_namespace_);
2829bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
2830bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  // Collect task now that it has finished running.
2831bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  Task::Vector completed_tasks;
2832bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  on_demand_task_graph_runner_->CollectCompletedTasks(on_demand_task_namespace_,
2833bee9932bab44713b74b422b4b759b49f5a222977Bo Liu                                                      &completed_tasks);
2834bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  DCHECK_EQ(1u, completed_tasks.size());
2835bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  DCHECK_EQ(completed_tasks[0], on_demand_raster_task);
2836bee9932bab44713b74b422b4b759b49f5a222977Bo Liu}
2837bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
28385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTreeHostImpl::ScrollViewportBy(gfx::Vector2dF scroll_delta) {
28395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(InnerViewportScrollLayer());
28405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerImpl* scroll_layer = OuterViewportScrollLayer()
28415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                ? OuterViewportScrollLayer()
28425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                : InnerViewportScrollLayer();
28435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta);
28455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!unused_delta.IsZero() && (scroll_layer == OuterViewportScrollLayer()))
28475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InnerViewportScrollLayer()->ScrollBy(unused_delta);
28485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
28495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2850a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) {
28515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!page_scale_animation_)
28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset();
28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!page_scale_animation_->IsAnimationStarted())
2857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    page_scale_animation_->StartAnimation(monotonic_time);
28584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  active_tree_->SetPageScaleDelta(
2860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      page_scale_animation_->PageScaleFactorAtTime(monotonic_time) /
2861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      active_tree_->page_scale_factor());
2862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Vector2dF next_scroll =
2863cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      page_scale_animation_->ScrollOffsetAtTime(monotonic_time);
28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScrollViewportBy(next_scroll - scroll_total);
2866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetNeedsRedraw();
28672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) {
28692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page_scale_animation_.reset();
28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->SetNeedsCommitOnImplThread();
28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_->RenewTreePriority();
28725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else {
28735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    SetNeedsAnimate();
28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) {
28785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!top_controls_manager_ || !top_controls_manager_->animation())
28792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2dF scroll = top_controls_manager_->Animate(time);
28815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (active_tree_->TotalScrollOffset().y() == 0.f)
2882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
28835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!scroll.IsZero()) {
28845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ScrollViewportBy(gfx::ScaleVector2d(
28855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scroll, 1.f / active_tree_->total_page_scale_factor()));
28865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    SetNeedsRedraw();
28875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
28885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetNeedsAnimate();
28892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2891a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) {
28922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!settings_.accelerated_animation_enabled ||
2893effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      !needs_animate_layers() ||
28942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !active_tree_->root_layer())
28952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers");
28982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnimationRegistrar::AnimationControllerMap copy =
28992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      animation_registrar_->active_animation_controllers();
29002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin();
29012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != copy.end();
29022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++iter)
2903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    (*iter).second->Animate(monotonic_time);
29042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetNeedsAnimate();
29062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) {
29092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!settings_.accelerated_animation_enabled ||
2910effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      !needs_animate_layers() ||
29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !active_tree_->root_layer())
29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
29132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState");
29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AnimationEventsVector> events =
29162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      make_scoped_ptr(new AnimationEventsVector);
29172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnimationRegistrar::AnimationControllerMap copy =
29182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      animation_registrar_->active_animation_controllers();
29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin();
29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != copy.end();
29212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++iter)
2922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    (*iter).second->UpdateState(start_ready_animations, events.get());
29232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!events->empty()) {
2925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass());
29262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
29275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
29285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetNeedsAnimate();
29295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
29305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
29315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid LayerTreeHostImpl::ActivateAnimations() {
29325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!settings_.accelerated_animation_enabled || !needs_animate_layers() ||
29335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      !active_tree_->root_layer())
29345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
29355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
29365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TRACE_EVENT0("cc", "LayerTreeHostImpl::ActivateAnimations");
29375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AnimationRegistrar::AnimationControllerMap copy =
29385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      animation_registrar_->active_animation_controllers();
29395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin();
29405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       iter != copy.end();
29415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       ++iter)
29425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    (*iter).second->ActivateAnimations();
29432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeDelta LayerTreeHostImpl::LowFrequencyAnimationInterval() const {
29462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::TimeDelta::FromSeconds(1);
29472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string LayerTreeHostImpl::LayerTreeAsJson() const {
29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string str;
29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (active_tree_->root_layer()) {
29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson());
29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::JSONWriter::WriteWithOptions(
29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str);
29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return str;
29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int LayerTreeHostImpl::SourceAnimationFrameNumber() const {
29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return fps_counter_->current_frame_number();
29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateScrollbars(base::TimeTicks time) {
29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnimateScrollbarsRecursive(active_tree_->root_layer(), time);
29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateScrollbarsRecursive(LayerImpl* layer,
29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   base::TimeTicks time) {
29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer)
29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
29712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollbarAnimationController* scrollbar_controller =
29732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->scrollbar_animation_controller();
2974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (scrollbar_controller)
2975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scrollbar_controller->Animate(time);
29762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < layer->children().size(); ++i)
29782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AnimateScrollbarsRecursive(layer->children()[i], time);
29792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void LayerTreeHostImpl::PostDelayedScrollbarFade(
2982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::Closure& start_fade,
2983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::TimeDelta delay) {
2984010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  client_->PostDelayedScrollbarFadeOnImplThread(start_fade, delay);
29852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void LayerTreeHostImpl::SetNeedsScrollbarAnimationFrame() {
2988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TRACE_EVENT_INSTANT0(
2989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "cc",
2990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "LayerTreeHostImpl::SetNeedsRedraw due to scrollbar fade",
2991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TRACE_EVENT_SCOPE_THREAD);
2992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetNeedsAnimate();
29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetTreePriority(TreePriority priority) {
29962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tile_manager_)
29972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
299968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (global_tile_state_.tree_priority == priority)
30002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
300168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  global_tile_state_.tree_priority = priority;
3002d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DidModifyTilePriorities();
30032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3005effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid LayerTreeHostImpl::UpdateCurrentFrameTime() {
3006effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(current_frame_timeticks_.is_null());
3007effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  current_frame_timeticks_ = gfx::FrameTime::Now();
3008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3010effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid LayerTreeHostImpl::ResetCurrentFrameTimeForNextFrame() {
3011effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  current_frame_timeticks_ = base::TimeTicks();
3012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::TimeTicks LayerTreeHostImpl::CurrentFrameTimeTicks() {
3015effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Try to use the current frame time to keep animations non-jittery.  But if
3016effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // we're not in a frame (because this is during an input event or a delayed
3017effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // task), fall back to physical time.  This should still be monotonic.
3018effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!current_frame_timeticks_.is_null())
3019effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return current_frame_timeticks_;
30201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return gfx::FrameTime::Now();
30217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
30227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3023ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_ptr<base::Value> LayerTreeHostImpl::AsValueWithFrame(
3024ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FrameData* frame) const {
30252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
3026b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (this->pending_tree_)
3027b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      state->Set("activation_state", ActivationStateAsValue().release());
3028b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  state->Set("device_viewport_size",
3029b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)             MathUtil::AsValue(device_viewport_size_).release());
3030b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr
3031b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr  std::set<const Tile*> tiles;
3032b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr  active_tree_->GetAllTilesForTracing(&tiles);
3033b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr  if (pending_tree_)
3034b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr    pending_tree_->GetAllTilesForTracing(&tiles);
3035b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr
3036b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr  scoped_ptr<base::ListValue> tile_state(new base::ListValue());
3037b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr  for (std::set<const Tile*>::const_iterator it = tiles.begin(); it != tiles.end(); ++it)
3038b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr    tile_state->Append((*it)->AsValue().release());
3039b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr
3040b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr  state->Set("active_tiles", tile_state.release());
3041b86c3127098f5d0040c6c12ced76a2591343dc47vmpstr
30423c71a2ada6364b6e0ae6346de714cbd5d87c1a16Ben Murdoch  if (tile_manager_) {
30433c71a2ada6364b6e0ae6346de714cbd5d87c1a16Ben Murdoch    state->Set("tile_manager_basic_state", tile_manager_->BasicStateAsValue().release());
30443c71a2ada6364b6e0ae6346de714cbd5d87c1a16Ben Murdoch  }
3045b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  state->Set("active_tree", active_tree_->AsValue().release());
3046b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (pending_tree_)
3047b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    state->Set("pending_tree", pending_tree_->AsValue().release());
3048ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (frame)
3049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    state->Set("frame", frame->AsValue().release());
30502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state.PassAs<base::Value>();
30512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> LayerTreeHostImpl::ActivationStateAsValue() const {
30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
3055b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  state->Set("lthi", TracedValue::CreateIDRef(this).release());
305690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (tile_manager_)
305790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    state->Set("tile_manager", tile_manager_->BasicStateAsValue().release());
30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state.PassAs<base::Value>();
30592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeHostImpl::SetDebugState(
30627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const LayerTreeDebugState& new_debug_state) {
30637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (LayerTreeDebugState::Equal(debug_state_, new_debug_state))
30647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
30657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (debug_state_.continuous_painting != new_debug_state.continuous_painting)
30662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    paint_time_counter_->ClearHistory();
30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  debug_state_ = new_debug_state;
30694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
30707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SetFullRootLayerDamage();
30712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
307368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void LayerTreeHostImpl::CreateUIResource(UIResourceId uid,
307468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                         const UIResourceBitmap& bitmap) {
3075a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK_GT(uid, 0);
307658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
307758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GLint wrap_mode = 0;
307868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switch (bitmap.GetWrapMode()) {
307958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case UIResourceBitmap::CLAMP_TO_EDGE:
308058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      wrap_mode = GL_CLAMP_TO_EDGE;
308158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
308258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case UIResourceBitmap::REPEAT:
308358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      wrap_mode = GL_REPEAT;
308458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
308558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
3086a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3087a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Allow for multiple creation requests with the same UIResourceId.  The
3088a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // previous resource is simply deleted.
3089a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResourceProvider::ResourceId id = ResourceIdForUIResource(uid);
3090a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (id)
3091a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DeleteUIResource(uid);
3092f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3093f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ResourceFormat format = resource_provider_->best_texture_format();
3094f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (bitmap.GetFormat() == UIResourceBitmap::ETC1)
3095f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    format = ETC1;
3096a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  id = resource_provider_->CreateResource(
309768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      bitmap.GetSize(),
309858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      wrap_mode,
3099d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ResourceProvider::TextureUsageAny,
3100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      format);
3101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
31024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UIResourceData data;
31034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  data.resource_id = id;
31044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  data.size = bitmap.GetSize();
31051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  data.opaque = bitmap.GetOpaque();
31064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
31074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui_resource_map_[uid] = data;
31084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
31094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AutoLockUIResourceBitmap bitmap_lock(bitmap);
3110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  resource_provider_->SetPixels(id,
31114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                bitmap_lock.GetPixels(),
311268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                gfx::Rect(bitmap.GetSize()),
311368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                gfx::Rect(bitmap.GetSize()),
3114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                gfx::Vector2d(0, 0));
311558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MarkUIResourceNotEvicted(uid);
3116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
3117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeHostImpl::DeleteUIResource(UIResourceId uid) {
3119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResourceProvider::ResourceId id = ResourceIdForUIResource(uid);
3120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (id) {
3121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    resource_provider_->DeleteResource(id);
3122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ui_resource_map_.erase(uid);
3123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
312458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MarkUIResourceNotEvicted(uid);
312558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
312658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
312758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void LayerTreeHostImpl::EvictAllUIResources() {
312858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (ui_resource_map_.empty())
312958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
313058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
313158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (UIResourceMap::const_iterator iter = ui_resource_map_.begin();
313258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      iter != ui_resource_map_.end();
313358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ++iter) {
313458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    evicted_ui_resources_.insert(iter->first);
31354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_provider_->DeleteResource(iter->second.resource_id);
313658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
313758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_resource_map_.clear();
313858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
313958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  client_->SetNeedsCommitOnImplThread();
314058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  client_->OnCanDrawStateChanged(CanDraw());
314158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  client_->RenewTreePriority();
3142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
3143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource(
3145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    UIResourceId uid) const {
3146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UIResourceMap::const_iterator iter = ui_resource_map_.find(uid);
3147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (iter != ui_resource_map_.end())
31484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return iter->second.resource_id;
3149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return 0;
3150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
3151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
31521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool LayerTreeHostImpl::IsUIResourceOpaque(UIResourceId uid) const {
31531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  UIResourceMap::const_iterator iter = ui_resource_map_.find(uid);
31541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(iter != ui_resource_map_.end());
31551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return iter->second.opaque;
31561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
31571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
315858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool LayerTreeHostImpl::EvictedUIResourcesExist() const {
315958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return !evicted_ui_resources_.empty();
316058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
316158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
316258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void LayerTreeHostImpl::MarkUIResourceNotEvicted(UIResourceId uid) {
316358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::set<UIResourceId>::iterator found_in_evicted =
316458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      evicted_ui_resources_.find(uid);
316558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (found_in_evicted == evicted_ui_resources_.end())
316658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
316758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  evicted_ui_resources_.erase(found_in_evicted);
316858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (evicted_ui_resources_.empty())
316958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    client_->OnCanDrawStateChanged(CanDraw());
317058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
317158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LayerTreeHostImpl::ScheduleMicroBenchmark(
3173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<MicroBenchmarkImpl> benchmark) {
3174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  micro_benchmark_controller_.ScheduleRun(benchmark.Pass());
3175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
3176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeHostImpl::InsertSwapPromiseMonitor(SwapPromiseMonitor* monitor) {
3178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  swap_promise_monitor_.insert(monitor);
3179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
3180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeHostImpl::RemoveSwapPromiseMonitor(SwapPromiseMonitor* monitor) {
3182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  swap_promise_monitor_.erase(monitor);
3183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
3184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() {
3186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (; it != swap_promise_monitor_.end(); it++)
3188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    (*it)->OnSetNeedsRedrawOnImpl();
3189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
3190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LayerTreeHostImpl::RegisterPictureLayerImpl(PictureLayerImpl* layer) {
3192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(std::find(picture_layers_.begin(), picture_layers_.end(), layer) ==
3193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         picture_layers_.end());
3194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  picture_layers_.push_back(layer);
3195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
3196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<PictureLayerImpl*>::iterator it =
3199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(it != picture_layers_.end());
3201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  picture_layers_.erase(it);
3202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
3203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
32042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
3205