layer_tree_host_impl.cc revision 5e3f23d412006dc4db4e659864679f29341e113f
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> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_writer.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/scrollbar_animation_controller.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/animation/timing_function.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/util.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/debug_rect_history.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/frame_rate_counter.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/overdraw_metrics.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/paint_time_counter.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/rendering_stats_instrumentation.h" 23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/debug/traced_value.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/page_scale_animation.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/top_controls_manager.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/append_quads_data.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/layer_impl.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_iterator.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer_impl.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_metadata.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegating_renderer.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/gl_renderer.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/software_renderer.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/memory_history.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture_layer_tiling.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/delay_based_time_source.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/texture_uploader.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/damage_tracker.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_common.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/quad_culler.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/tree_synchronizer.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DidVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visible) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN1("webkit", 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeHostImpl::SetVisible", 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeHostImpl", 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::SetVisible", id); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> Create( 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelayBasedTimeSource> time_source) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr( 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new LayerTreeHostImplTimeSourceAdapter(layer_tree_host_impl, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source)); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~LayerTreeHostImplTimeSourceAdapter() { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_->SetClient(NULL); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_->SetActive(false); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTimerTick() OVERRIDE { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In single threaded mode we attempt to simulate changing the current 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread by maintaining a fake thread id. When we switch from one 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread to another, we construct DebugScopedSetXXXThread objects that 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // update the thread id. This lets DCHECKS that ensure we're on the 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // right thread to work correctly in single threaded mode. The problem 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // here is that the timer tasks are run via the message loop, and when 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // they run, we've had no chance to construct a DebugScopedSetXXXThread 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // object. The result is that we report that we're running on the main 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread. In multi-threaded mode, this timer is run on the compositor 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread, so to keep this consistent in single-threaded mode, we'll 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // construct a DebugScopedSetImplThread object. There is no need to do 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this in multi-threaded mode since the real thread id's will be 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // correct. In fact, setting fake thread id's interferes with the real 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread id's and causes breakage. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DebugScopedSetImplThread> set_impl_thread; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_impl_->proxy()->HasImplThread()) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_impl_thread.reset( 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DebugScopedSetImplThread(layer_tree_host_impl_->proxy())); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_impl_->ActivatePendingTreeIfNeeded(); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->Animate( 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->CurrentFrameTimeTicks(), 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->CurrentFrameTime()); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool start_ready_animations = true; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetActive(bool active) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active != time_source_->Active()) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_->SetActive(active); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplTimeSourceAdapter( 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelayBasedTimeSource> time_source) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : layer_tree_host_impl_(layer_tree_host_impl), 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_(time_source) { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_->SetClient(this); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl_; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelayBasedTimeSource> time_source_; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LayerTreeHostImplTimeSourceAdapter); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::FrameData::FrameData() 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : contains_incomplete_tile(false), has_no_damage(false) {} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::FrameData::~FrameData() {} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create( 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* client, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation) { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr( 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new LayerTreeHostImpl(settings, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation)); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::LayerTreeHostImpl( 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* client, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : client_(client), 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_(proxy), 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_(NULL), 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_lock_scrolling_layer_(false), 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_bubble_scrolls_(false), 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wheel_scrolling_(false), 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manage_tiles_needed_(false), 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_(NULL), 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_(settings), 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible_(true), 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) managed_memory_policy_( 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrioritizedResourceManager::DefaultMemoryAllocationLimit(), 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING), 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_gesture_active_(false), 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())), 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_time_counter_(PaintTimeCounter::Create()), 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_history_(MemoryHistory::Create()), 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rect_history_(DebugRectHistory::Create()), 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) max_memory_needed_bytes_(0), 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_bytes_(0), 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_and_nearby_bytes_(0), 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_use_bytes_(0), 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) device_scale_factor_(1.f), 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) overdraw_bottom_height_(0.f), 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_(AnimationRegistrar::Create()), 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_(rendering_stats_instrumentation) { 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidVisibilityChange(this, visible_); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDebugState(settings.initial_debug_state); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (settings.calculate_top_controls_position) { 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_ = 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TopControlsManager::Create(this, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.top_controls_height, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.top_controls_show_threshold, 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.top_controls_hide_threshold); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDebugState(settings.initial_debug_state); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LTHI always has an active tree. 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_ = LayerTreeImpl::create(this); 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_EVENT_OBJECT_CREATED_WITH_ID( 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", this); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::~LayerTreeHostImpl() { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_EVENT_OBJECT_DELETED_WITH_ID( 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", this); 21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_handler_client_) { 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_->WillShutdown(); 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_ = NULL; 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->root_layer()) { 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearRenderSurfaces(); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The layer trees must be destroyed before the layer tree host. We've 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // made a contract with our animation controllers that the registrar 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will outlive them, and we must make good. 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recycle_tree_.reset(); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_.reset(); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_.reset(); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::BeginCommit() {} 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::CommitComplete() { 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete"); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Impl-side painting needs an update immediately post-commit to have the 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // opportunity to create tilings. Other paths can call UpdateDrawProperties 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // more lazily when needed prior to drawing. 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (settings_.impl_side_painting) { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_->set_needs_update_draw_properties(); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pending_tree_->UpdateDrawProperties(); 242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Start working on newly created tiles immediately if needed. 243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ManageTiles(); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->set_needs_update_draw_properties(); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SendManagedMemoryStats(); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::CanDraw() { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: If you are changing this function or any other function that might 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // affect the result of CanDraw, make sure to call 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // client_->OnCanDrawStateChanged in the proper places and update the 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NotifyIfCanDrawChanged test. 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!active_tree_->root_layer()) { 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (device_viewport_size_.IsEmpty()) { 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->ViewportSizeInvalid()) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_INSTANT0( 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!renderer_) { 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no renderer", 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->ContentsTexturesPurged()) { 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_INSTANT0( 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "cc", "LayerTreeHostImpl::CanDraw contents textures purged", 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time, 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time wall_clock_time) { 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_handler_client_) 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_->Animate(monotonic_time); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatePageScale(monotonic_time); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateLayers(monotonic_time, wall_clock_time); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateScrollbars(monotonic_time); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateTopControls(monotonic_time); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ManageTiles() { 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!tile_manager_) 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!manage_tiles_needed_) 301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manage_tiles_needed_ = false; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->ManageTiles(); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_required_bytes; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_nice_to_have_bytes; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_used_bytes; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->GetMemoryStats(&memory_required_bytes, 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &memory_nice_to_have_bytes, 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &memory_used_bytes); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendManagedMemoryStats(memory_required_bytes, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_nice_to_have_bytes, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_used_bytes); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool anchor_point, 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page_scale, 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time, 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) { 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!RootScrollLayer()) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scroll_total = 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootScrollLayer()->scroll_offset() + RootScrollLayer()->ScrollDelta(); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::SizeF viewport_size = VisibleViewportSize(); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double start_time_seconds = (start_time - base::TimeTicks()).InSecondsF(); 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Easing constants experimentally determined. 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TimingFunction> timing_function = 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_ = 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PageScaleAnimation::Create(scroll_total, 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->total_page_scale_factor(), 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size, 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_scrollable_size, 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) start_time_seconds, 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timing_function.Pass()); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (anchor_point) { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF anchor(target_offset); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_->ZoomWithAnchor(anchor, 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale, 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration.InSecondsF()); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scaled_target_offset = target_offset; 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_->ZoomTo(scaled_target_offset, 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale, 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration.InSecondsF()); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ScheduleAnimation() { 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::HaveTouchEventHandlersAt(gfx::Point viewport_point) { 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!EnsureRenderSurfaceLayerList()) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF device_viewport_point = 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(viewport_point, device_scale_factor_); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First find out which layer was hit from the saved list of visible layers 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the most recent frame. 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer_impl = LayerTreeHostCommon::FindLayerThatIsHitByPoint( 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_viewport_point, 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->RenderSurfaceLayerList()); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Walk up the hierarchy and look for a layer with a touch event handler 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // region that the given point hits. 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; layer_impl; layer_impl = layer_impl->parent()) { 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (LayerTreeHostCommon::LayerHasTouchEventHandlersAt(device_viewport_point, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl)) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LayerTreeHostImpl::SetLatencyInfoForInputEvent( 389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const ui::LatencyInfo& latency_info) { 390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_tree()->SetLatencyInfo(latency_info); 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::TrackDamageForAllSurfaces( 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_draw_layer, 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list) { 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For now, we use damage tracking to compute a global scissor. To do this, we 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // must compute all damage tracking before drawing anything, so that we know 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the root damage rect. The root damage rect is then used to scissor each 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface. 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = render_surface_layer_list.size() - 1; 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_index >= 0; 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = render_surface_layer_list[surface_index]; 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(render_surface); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->damage_tracker()->UpdateDamageTrackingState( 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->layer_list(), 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->id(), 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->SurfacePropertyChangedOnlyFromDescendant(), 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->content_rect(), 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->mask_layer(), 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->filters(), 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->filter().get()); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::FrameData::AppendRenderPass( 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> render_pass) { 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_passes_by_id[render_pass->id] = render_pass.get(); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_passes.push_back(render_pass.Pass()); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static DrawMode GetDrawMode(OutputSurface* output_surface) { 425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (output_surface->ForcedDrawToSoftwareDevice()) { 426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return DRAW_MODE_RESOURCELESS_SOFTWARE; 427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (output_surface->context3d()) { 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return DRAW_MODE_HARDWARE; 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(output_surface->software_device()); 431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return DRAW_MODE_SOFTWARE; 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AppendQuadsForLayer(RenderPass* target_render_pass, 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer, 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OcclusionTrackerImpl& occlusion_tracker, 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData* append_quads_data) { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool for_surface = false; 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadCuller quad_culler(&target_render_pass->quad_list, 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &target_render_pass->shared_quad_state_list, 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer, 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->ShowDebugBorders(), 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for_surface); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->AppendQuads(&quad_culler, append_quads_data); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AppendQuadsForRenderSurfaceLayer( 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* target_render_pass, 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer, 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* contributing_render_pass, 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OcclusionTrackerImpl& occlusion_tracker, 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData* append_quads_data) { 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool for_surface = true; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadCuller quad_culler(&target_render_pass->quad_list, 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &target_render_pass->shared_quad_state_list, 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer, 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->ShowDebugBorders(), 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for_surface); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_replica = false; 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->render_surface()->AppendQuads(&quad_culler, 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) append_quads_data, 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_replica, 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_render_pass->id); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add replica after the surface so that it appears below the surface. 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->has_replica()) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_replica = true; 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->render_surface()->AppendQuads(&quad_culler, 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) append_quads_data, 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_replica, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_render_pass->id); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AppendQuadsToFillScreen( 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* target_render_pass, 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_layer, 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor screen_background_color, 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OcclusionTrackerImpl& occlusion_tracker) { 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_layer || !SkColorGetA(screen_background_color)) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (fill_region.IsEmpty()) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool for_surface = false; 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadCuller quad_culler(&target_render_pass->quad_list, 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &target_render_pass->shared_quad_state_list, 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer, 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer->ShowDebugBorders(), 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for_surface); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Manually create the quad state for the gutter quads, as the root layer 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // doesn't have any bounds and so can't generate this itself. 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(danakj): Make the gutter quads generated by the solid color layer 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (make it smarter about generating quads to fill unoccluded areas). 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect root_target_rect = root_layer->render_surface()->content_rect(); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float opacity = 1.f; 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SharedQuadState* shared_quad_state = 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_culler.UseSharedQuadState(SharedQuadState::Create()); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shared_quad_state->SetAll(root_layer->draw_transform(), 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_target_rect.size(), 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_target_rect, 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_target_rect, 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) opacity); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData append_quads_data; 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform_to_layer_space(gfx::Transform::kSkipInitialization); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool did_invert = root_layer->screen_space_transform().GetInverse( 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &transform_to_layer_space); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(did_invert); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (Region::Iterator fill_rects(fill_region); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fill_rects.has_rect(); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fill_rects.next()) { 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The root layer transform is composed of translations and scales only, 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // no perspective, so mapping is sufficient (as opposed to projecting). 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect layer_rect = 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect(transform_to_layer_space, fill_rects.rect()); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Skip the quad culler and just append the quads directly to avoid 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // occlusion checks. 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quad->SetNew(shared_quad_state, layer_rect, screen_background_color, false); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_culler.Append(quad.PassAs<DrawQuad>(), &append_quads_data); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes.empty()); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!CanDraw() || !active_tree_->root_layer()) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackDamageForAllSurfaces(active_tree_->root_layer(), 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *frame->render_surface_layer_list); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the root render surface has no visible damage, then don't generate a 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // frame at all. 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderSurfaceImpl* root_surface = 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->root_layer()->render_surface(); 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool root_surface_has_no_visible_damage = 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !root_surface->damage_tracker()->current_damage_rect().Intersects( 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_surface->content_rect()); 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool root_surface_has_contributing_layers = 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !root_surface->layer_list().empty(); 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_surface_has_contributing_layers && 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_surface_has_no_visible_damage) { 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT0("cc", 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->has_no_damage = true; 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT1("cc", 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeHostImpl::CalculateRenderPasses", 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "render_surface_layer_list.size()", 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<uint64>(frame->render_surface_layer_list->size())); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create the render passes in dependency order. 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = frame->render_surface_layer_list->size() - 1; 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_index >= 0; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*frame->render_surface_layer_list)[surface_index]; 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->render_surface()->AppendRenderPasses(frame); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool record_metrics_for_frame = 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_.show_overdraw_in_tracing && 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::debug::TraceLog::GetInstance() && 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::debug::TraceLog::GetInstance()->IsEnabled(); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OcclusionTrackerImpl occlusion_tracker( 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer()->render_surface()->content_rect(), 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) record_metrics_for_frame); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.set_minimum_tracking_size( 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_.minimum_occlusion_tracking_size); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state_.show_occluding_rects) { 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.set_occluding_screen_space_rects_container( 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &frame->occluding_screen_space_rects); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state_.show_non_occluding_rects) { 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.set_non_occluding_screen_space_rects_container( 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &frame->non_occluding_screen_space_rects); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add quads to the Render passes in FrontToBack order to allow for testing 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // occlusion and performing culling during the tree walk. 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef LayerIterator<LayerImpl, 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList, 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorActions::FrontToBack> LayerIteratorType; 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Typically when we are missing a texture and use a checkerboard quad, we 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // still draw the frame. However when the layer being checkerboarded is moving 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // due to an impl-animation, we drop the frame to avoid flashing due to the 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // texture suddenly appearing in the future. 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool draw_frame = true; 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When we have a copy request for a layer, we need to draw no matter 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // what, as the layer may disappear after this frame. 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool have_copy_request = false; 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int layers_drawn = 0; 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DrawMode draw_mode = GetDrawMode(output_surface_.get()); 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType end = 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType::End(frame->render_surface_layer_list); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerIteratorType it = 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType::Begin(frame->render_surface_layer_list); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != end; 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it) { 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id target_render_pass_id = 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it.target_render_surface_layer()->render_surface()->RenderPassId(); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* target_render_pass = 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id[target_render_pass_id]; 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool prevent_occlusion = it.target_render_surface_layer()->HasCopyRequest(); 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) occlusion_tracker.EnterLayer(it, prevent_occlusion); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData append_quads_data(target_render_pass->id); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (it.represents_target_render_surface()) { 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (it->HasCopyRequest()) { 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) have_copy_request = true; 63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it->TakeCopyRequests(&target_render_pass->copy_requests); 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (it.represents_contributing_render_surface()) { 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id contributing_render_pass_id = 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->render_surface()->RenderPassId(); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* contributing_render_pass = 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id[contributing_render_pass_id]; 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsForRenderSurfaceLayer(target_render_pass, 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *it, 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_render_pass, 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &append_quads_data); 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (it.represents_itself() && 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !it->visible_content_rect().IsEmpty()) { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_occlusion_from_outside_target_surface; 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool impl_draw_transform_is_unknown = false; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (occlusion_tracker.Occluded( 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->render_target(), 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->visible_content_rect(), 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->draw_transform(), 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_draw_transform_is_unknown, 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->is_clipped(), 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->clip_rect(), 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &has_occlusion_from_outside_target_surface)) { 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) append_quads_data.had_occlusion_from_outside_target_surface |= 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_occlusion_from_outside_target_surface; 660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (it->WillDraw(draw_mode, resource_provider_.get())) { 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(active_tree_, it->layer_tree_impl()); 662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->will_draw_layers.push_back(*it); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->HasContributingDelegatedRenderPasses()) { 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id contributing_render_pass_id = 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->FirstContributingRenderPassId(); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (frame->render_passes_by_id.find(contributing_render_pass_id) != 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.end()) { 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* render_pass = 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id[contributing_render_pass_id]; 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData append_quads_data(render_pass->id); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsForLayer(render_pass, 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *it, 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &append_quads_data); 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_render_pass_id = 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->NextContributingRenderPassId(contributing_render_pass_id); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsForLayer(target_render_pass, 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *it, 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &append_quads_data); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++layers_drawn; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (append_quads_data.had_occlusion_from_outside_target_surface) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_render_pass->has_occlusion_from_outside_target_surface = true; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (append_quads_data.num_missing_tiles) { 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->AddMissingTiles( 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) append_quads_data.num_missing_tiles); 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool layer_has_animating_transform = 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->screen_space_transform_is_animating() || 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->draw_transform_is_animating(); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_has_animating_transform) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_frame = false; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (append_quads_data.had_incomplete_tile) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->contains_incomplete_tile = true; 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.LeaveLayer(it); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (have_copy_request) 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) draw_frame = true; 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->AddLayersDrawn(layers_drawn); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NDEBUG 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < frame->render_passes.size(); ++i) { 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) != frame->render_passes_by_id.end()); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!active_tree_->has_transparent_background()) { 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes.back()->has_transparent_background = false; 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsToFillScreen(frame->render_passes.back(), 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer(), 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->background_color(), 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (draw_frame) 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->RecordMetrics(this); 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!have_copy_request); 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); 741b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!output_surface_->ForcedDrawToSoftwareDevice()) 742b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); 74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (renderer_) { 74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveRenderPasses(CullRenderPassesWithCachedTextures(renderer_.get()), 74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) frame); 74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we're making a frame to draw, it better have at least one render pass. 749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!frame->render_passes.empty()); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return draw_frame; 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { 75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_handler_client_) 75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_->MainThreadHasStoppedFlinging(); 75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 75790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool should_background_tick) { 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool enabled = should_background_tick && 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !animation_registrar_->active_animation_controllers().empty(); 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lazily create the time_source adapter so that we can vary the interval for 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // testing. 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!time_source_client_adapter_) { 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_client_adapter_ = LayerTreeHostImplTimeSourceAdapter::Create( 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DelayBasedTimeSource::Create(LowFrequencyAnimationInterval(), 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_->CurrentThread())); 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_client_adapter_->SetActive(enabled); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetViewportDamage(gfx::Rect damage_rect) { 776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) viewport_damage_rect_.Union(damage_rect); 777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline RenderPass* FindRenderPassById( 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id render_pass_id, 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeHostImpl::FrameData& frame) { 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassIdHashMap::const_iterator it = 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame.render_passes_by_id.find(render_pass_id); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return it != frame.render_passes_by_id.end() ? it->second : NULL; 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void RemoveRenderPassesRecursive(RenderPass::Id remove_render_pass_id, 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame) { 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* remove_render_pass = 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindRenderPassById(remove_render_pass_id, *frame); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The pass was already removed by another quad - probably the original, and 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we are the replica. 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!remove_render_pass) 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassList& render_passes = frame->render_passes; 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassList::iterator to_remove = std::find(render_passes.begin(), 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_passes.end(), 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remove_render_pass); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(to_remove != render_passes.end()); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> removed_pass = render_passes.take(to_remove); 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes.erase(to_remove); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.erase(remove_render_pass_id); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now follow up for all RenderPass quads and remove their RenderPasses 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // recursively. 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const QuadList& quad_list = removed_pass->quad_list; 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadList::ConstBackToFrontIterator quad_list_iterator = 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_list.BackToFrontBegin(); 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; quad_list_iterator != quad_list.BackToFrontEnd(); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++quad_list_iterator) { 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DrawQuad* current_quad = (*quad_list_iterator); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_quad->material != DrawQuad::RENDER_PASS) 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id next_remove_render_pass_id = 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveRenderPassesRecursive(next_remove_render_pass_id, frame); 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures:: 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldRemoveRenderPass(const RenderPassDrawQuad& quad, 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FrameData& frame) const { 82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(renderer_); 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool quad_has_damage = !quad.contents_changed_since_last_frame.IsEmpty(); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool quad_has_cached_resource = 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) renderer_->HaveCachedResourcesForRenderPassId(quad.render_pass_id); 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (quad_has_damage) { 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures have damage"); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (!quad_has_cached_resource) { 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures have no texture"); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures dropped!"); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::ShouldRemoveRenderPass( 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPassDrawQuad& quad, const FrameData& frame) const { 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* render_pass = 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindRenderPassById(quad.render_pass_id, frame); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!render_pass) 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any quad or RenderPass draws into this RenderPass, then keep it. 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const QuadList& quad_list = render_pass->quad_list; 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (QuadList::ConstBackToFrontIterator quad_list_iterator = 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_list.BackToFrontBegin(); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_list_iterator != quad_list.BackToFrontEnd(); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++quad_list_iterator) { 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DrawQuad* current_quad = *quad_list_iterator; 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_quad->material != DrawQuad::RENDER_PASS) 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* contributing_pass = FindRenderPassById( 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id, frame); 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contributing_pass) 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Defined for linking tests. 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template CC_EXPORT void LayerTreeHostImpl::RemoveRenderPasses< 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::CullRenderPassesWithCachedTextures>( 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CullRenderPassesWithCachedTextures culler, FrameData* frame); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template CC_EXPORT void LayerTreeHostImpl::RemoveRenderPasses< 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::CullRenderPassesWithNoQuads>( 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CullRenderPassesWithNoQuads culler, FrameData*); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename RenderPassCuller> 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::RemoveRenderPasses(RenderPassCuller culler, 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FrameData* frame) { 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t it = culler.RenderPassListBegin(frame->render_passes); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != culler.RenderPassListEnd(frame->render_passes); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = culler.RenderPassListNext(it)) { 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* current_pass = frame->render_passes[it]; 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const QuadList& quad_list = current_pass->quad_list; 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadList::ConstBackToFrontIterator quad_list_iterator = 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_list.BackToFrontBegin(); 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; quad_list_iterator != quad_list.BackToFrontEnd(); 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++quad_list_iterator) { 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DrawQuad* current_quad = *quad_list_iterator; 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_quad->material != DrawQuad::RENDER_PASS) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPassDrawQuad* render_pass_quad = 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassDrawQuad::MaterialCast(current_quad); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!culler.ShouldRemoveRenderPass(*render_pass_quad, *frame)) 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We are changing the vector in the middle of iteration. Because we 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // delete render passes that draw into the current pass, we are 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // guaranteed that any data from the iterator to the end will not 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // change. So, capture the iterator position from the end of the 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // list, and restore it after the change. 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t position_from_end = frame->render_passes.size() - it; 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = frame->render_passes.size() - position_from_end; 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(frame->render_passes.size(), position_from_end); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::PrepareToDraw(FrameData* frame, 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect device_viewport_damage_rect) { 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::PrepareToDraw"); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->UpdateDrawProperties(); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes.clear(); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.clear(); 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->will_draw_layers.clear(); 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->contains_incomplete_tile = false; 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->has_no_damage = false; 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (active_tree_->root_layer()) { 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) device_viewport_damage_rect.Union(viewport_damage_rect_); 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) viewport_damage_rect_ = gfx::Rect(); 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->root_layer()->render_surface()->damage_tracker()-> 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddDamageNextUpdate(device_viewport_damage_rect); 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!CalculateRenderPasses(frame)) 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we return true, then we expect DrawLayers() to be called before this 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // function is called again. 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::EnforceManagedMemoryPolicy( 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ManagedMemoryPolicy& policy) { 94390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool evicted_resources = client_->ReduceContentsTextureMemoryOnImplThread( 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible_ ? policy.bytes_limit_when_visible 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : policy.bytes_limit_when_not_visible, 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedMemoryPolicy::PriorityCutoffToValue( 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible_ ? policy.priority_cutoff_when_visible 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : policy.priority_cutoff_when_not_visible)); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (evicted_resources) { 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetContentsTexturesPurged(); 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_) 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_->SetContentsTexturesPurged(); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SendManagedMemoryStats(); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateTileManagerMemoryPolicy(policy); 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy( 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ManagedMemoryPolicy& policy) { 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!tile_manager_) 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GlobalStateThatImpactsTilePriority new_state(tile_manager_->GlobalState()); 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_state.memory_limit_in_bytes = visible_ ? 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.bytes_limit_when_visible : 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.bytes_limit_when_not_visible; 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(reveman): We should avoid keeping around unused resources if 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // possible. crbug.com/224475 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_state.unused_memory_limit_in_bytes = static_cast<size_t>( 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (static_cast<int64>(new_state.memory_limit_in_bytes) * 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings_.max_unused_resource_memory_percentage) / 100); 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_state.memory_limit_policy = 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy( 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) visible_ ? 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.priority_cutoff_when_visible : 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.priority_cutoff_when_not_visible); 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tile_manager_->SetGlobalState(new_state); 983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manage_tiles_needed_ = true; 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::HasImplThread() const { 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return proxy_->HasImplThread(); 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidInitializeVisibleTile() { 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(reveman): Determine tiles that changed and only damage 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // what's necessary. 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetFullRootLayerDamage(); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (client_) 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->DidInitializeVisibleTileOnImplThread(); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool LayerTreeHostImpl:: 99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShouldForceTileUploadsRequiredForActivationToComplete() const { 100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // During shutdown of TileManager, it will attempt to flush its job queue, 100190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // which can call this function while this is NULL. 100290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!tile_manager_) 100390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 100490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TreePriority tree_priority = tile_manager_->GlobalState().tree_priority; 100690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return tree_priority != SMOOTHNESS_TAKES_PRIORITY && 100790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) animation_registrar_->active_animation_controllers().empty(); 100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 100990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::ShouldClearRootRenderPass() const { 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return settings_.should_clear_root_render_pass; 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetManagedMemoryPolicy( 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ManagedMemoryPolicy& policy) { 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (managed_memory_policy_ == policy) 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there is already enough memory to draw everything imaginable and the 1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // new memory limit does not change this, then do not re-commit. Don't bother 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // skipping commits if this is not visible (commits don't happen when not 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // visible, there will almost always be a commit when this becomes visible). 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool needs_commit = true; 1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (visible() && 1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.bytes_limit_when_visible >= 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) max_memory_needed_bytes_ && 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) managed_memory_policy_.bytes_limit_when_visible >= 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) max_memory_needed_bytes_ && 1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.priority_cutoff_when_visible == 1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) managed_memory_policy_.priority_cutoff_when_visible) { 1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) needs_commit = false; 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) managed_memory_policy_ = policy; 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!proxy_->HasImplThread()) { 1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // In single-thread mode, this can be called on the main thread by 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // GLRenderer::OnMemoryAllocationChanged. 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugScopedSetImplThread impl_thread(proxy_); 103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (needs_commit) 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LayerTreeHostImpl::SetExternalDrawConstraints( 1050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Transform& transform, 1051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::Rect viewport) { 1052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) external_transform_ = transform; 1053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) external_viewport_ = viewport; 1054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetNeedsRedrawRect(gfx::Rect damage_rect) { 1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_->SetNeedsRedrawRectOnImplThread(damage_rect); 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::OnVSyncParametersChanged(base::TimeTicks timebase, 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta interval) { 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnVSyncParametersChanged(timebase, interval); 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::BeginFrame(base::TimeTicks frame_time) { 106690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) client_->BeginFrameOnImplThread(frame_time); 1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10695e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)void LayerTreeHostImpl::OnSwapBuffersComplete( 10705e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) const CompositorFrameAck* ack) { 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(piman): We may need to do some validation on this ack before 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // processing it. 10735e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (ack && renderer_) 10745e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) renderer_->ReceiveSwapBuffersAck(*ack); 1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10765e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) client_->OnSwapBuffersCompleteOnImplThread(); 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::OnCanDrawStateChangedForTree() { 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CompositorFrameMetadata LayerTreeHostImpl::MakeCompositorFrameMetadata() const { 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompositorFrameMetadata metadata; 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.device_scale_factor = device_scale_factor_; 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.page_scale_factor = active_tree_->total_page_scale_factor(); 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.viewport_size = active_tree_->ScrollableViewportSize(); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.root_layer_size = active_tree_->ScrollableSize(); 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.min_page_scale_factor = active_tree_->min_page_scale_factor(); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.max_page_scale_factor = active_tree_->max_page_scale_factor(); 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_controls_manager_) { 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.location_bar_offset = 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF(0.f, top_controls_manager_->controls_top_offset()); 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.location_bar_content_translation = 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF(0.f, top_controls_manager_->content_top_offset()); 1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metadata.overdraw_bottom_height = overdraw_bottom_height_; 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!RootScrollLayer()) 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metadata; 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.root_scroll_offset = RootScrollLayer()->TotalScrollOffset(); 1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metadata.latency_info = active_tree_->GetLatencyInfo(); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metadata; 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::AllowPartialSwap() const { 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We don't track damage on the HUD layer (it interacts with damage tracking 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // visualizations), so disable partial swaps to make the HUD layer display 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // properly. 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !debug_state_.ShowHudRects(); 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class DidBeginTracingFunctor { 1116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 1117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void operator()(LayerImpl* layer) { 1118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) layer->DidBeginTracing(); 1119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 1121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DrawLayers(FrameData* frame, 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks frame_begin_time) { 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CanDraw()); 1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (frame->has_no_damage) 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!frame->render_passes.empty()); 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fps_counter_->SaveTimeStamp(frame_begin_time); 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->SetScreenFrameCount( 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fps_counter_->current_frame_number()); 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->SetDroppedFrameCount( 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fps_counter_->dropped_frame_count()); 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tile_manager_) { 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_history_->SaveEntry( 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->memory_stats_from_last_assign()); 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state_.ShowHudRects()) { 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rect_history_->SaveDebugRectsForCurrentFrame( 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer(), 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *frame->render_surface_layer_list, 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->occluding_screen_space_rects, 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->non_occluding_screen_space_rects, 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_state_); 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!settings_.impl_side_painting && debug_state_.continuous_painting) { 1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const RenderingStats& stats = 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rendering_stats_instrumentation_->GetRenderingStats(); 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_time_counter_->SavePaintTime(stats.total_paint_time); 1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool is_new_trace; 1160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); 1161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_new_trace) { 1162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (pending_tree_) 1163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LayerTreeHostCommon::CallFunctionForSubtree< 1164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DidBeginTracingFunctor, LayerImpl>( 1165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_tree_->root_layer()); 1166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LayerTreeHostCommon::CallFunctionForSubtree< 1167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DidBeginTracingFunctor, LayerImpl>( 1168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_tree_->root_layer()); 1169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 117190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 117290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", this, 117390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TracedValue::FromValue(AsValue().release())); 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Because the contents of the HUD depend on everything else in the frame, the 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // contents of its texture are updated as the last thing before the frame is 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // drawn. 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->hud_layer()) 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->hud_layer()->UpdateHudTexture(resource_provider_.get()); 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1181b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (output_surface_->ForcedDrawToSoftwareDevice()) { 1182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<SoftwareRenderer> temp_software_renderer = 1183b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SoftwareRenderer::Create(this, output_surface_.get(), NULL); 1184b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) temp_software_renderer->DrawFrame(&frame->render_passes); 1185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 1186b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) renderer_->DrawFrame(&frame->render_passes); 1187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The render passes should be consumed by the renderer. 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes.empty()); 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.clear(); 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The next frame should start by assuming nothing has changed, and changes 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are noted as they occur. 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDrawDamagedArea(); 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidDrawAllLayers(const FrameData& frame) { 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < frame.will_draw_layers.size(); ++i) 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame.will_draw_layers[i]->DidDraw(resource_provider_.get()); 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Once all layers have been drawn, pending texture uploads should no 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // longer block future uploads. 120790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (resource_provider_) 120890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resource_provider_->MarkPendingUploadsAsNonBlocking(); 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::FinishAllRendering() { 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (renderer_) 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->Finish(); 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::IsContextLost() { 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return renderer_ && renderer_->IsContextLost(); 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const RendererCapabilities& LayerTreeHostImpl::GetRendererCapabilities() const { 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return renderer_->Capabilities(); 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) { 1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (frame.has_no_damage) 1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 12285e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) renderer_->SwapBuffers(); 1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->ClearLatencyInfo(); 1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) { 1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (output_surface_) 123590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) output_surface_->SetNeedsBeginFrame(enable); 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 123890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)float LayerTreeHostImpl::DeviceScaleFactor() const { 123990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return device_scale_factor_; 124090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 124190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::SizeF LayerTreeHostImpl::VisibleViewportSize() const { 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::SizeF dip_size = 1244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::ScaleSize(device_viewport_size(), 1.f / device_scale_factor()); 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The clip layer should be used if non-overlay scrollbars may exist since 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it adjusts for them. 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* clip_layer = active_tree_->RootClipLayer(); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!Settings().solid_color_scrollbars && clip_layer && 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clip_layer->masks_to_bounds()) 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dip_size = clip_layer->bounds(); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float top_offset = 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::SizeF(dip_size.width(), 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dip_size.height() - top_offset - overdraw_bottom_height_); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeSettings& LayerTreeHostImpl::Settings() const { 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return settings(); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidLoseOutputSurface() { 1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(jamesr): The renderer_ check is needed to make some of the 1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LayerTreeHostContextTest tests pass, but shouldn't be necessary (or 1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // important) in production. We should adjust the test to not need this. 1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (renderer_) 1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_->DidLoseOutputSurfaceOnImplThread(); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::Readback(void* pixels, 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect rect_in_device_viewport) { 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(renderer_); 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->GetFramebufferPixels(pixels, rect_in_device_viewport); 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::HaveRootScrollLayer() const { 1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !!RootScrollLayer(); 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::RootLayer() const { 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return active_tree_->root_layer(); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::RootScrollLayer() const { 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return active_tree_->RootScrollLayer(); 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const { 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return active_tree_->CurrentlyScrollingLayer(); 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Content layers can be either directly scrollable or contained in an outer 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scrolling layer which applies the scroll transform. Given a content layer, 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this function returns the associated scroll layer if any. 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static LayerImpl* FindScrollLayerForContentLayer(LayerImpl* layer_impl) { 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl) 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_impl->scrollable()) 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_impl; 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_impl->DrawsContent() && 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->parent() && 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->parent()->scrollable()) 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_impl->parent(); 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::CreatePendingTree() { 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(!pending_tree_); 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (recycle_tree_) 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recycle_tree_.swap(pending_tree_); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_ = LayerTreeImpl::create(this); 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnHasPendingTreeStateChanged(pending_tree_); 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree", pending_tree_.get()); 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_STEP0("cc", 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "PendingTree", pending_tree_.get(), "waiting"); 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::CheckForCompletedTileUploads() { 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!client_->IsInsideDraw()) << 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Checking for completed uploads within a draw may trigger " 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "spurious redraws."; 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tile_manager_) 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->CheckForCompletedTileUploads(); 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::ActivatePendingTreeIfNeeded() { 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pending_tree_) 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 133690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CHECK(settings_.impl_side_painting); 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 133890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(enne): This needs to be moved somewhere else (post-animate?) 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pending_tree_->UpdateDrawProperties(); 1340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Note: This will likely cause ManageTiles to be needed. However, 1341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // it is only out of date as far as the last commit or the last draw. 1342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // For performance reasons, don't call ManageTiles again here. 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1344b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) TRACE_EVENT_ASYNC_STEP1( 134590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "cc", 134690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "PendingTree", pending_tree_.get(), "activate", 134790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "state", TracedValue::FromValue(ActivationStateAsValue().release())); 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (tile_manager_) { 135090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) tile_manager_->CheckForCompletedTileUploads(); 135190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!tile_manager_->AreTilesRequiredForActivationReady()) 135290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 135390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ActivatePendingTree(); 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ActivatePendingTree() { 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(pending_tree_); 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_END0("cc", "PendingTree", pending_tree_.get()); 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->SetRootLayerScrollOffsetDelegate(NULL); 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->PushPersistedState(pending_tree_.get()); 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_->needs_full_tree_sync()) { 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetRootLayer( 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TreeSynchronizer::SynchronizeTrees(pending_tree_->root_layer(), 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->DetachLayerTree(), 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_.get())); 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TreeSynchronizer::PushProperties(pending_tree_->root_layer(), 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer()); 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!recycle_tree_); 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_->PushPropertiesTo(active_tree_.get()); 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now that we've synced everything from the pending tree to the active 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tree, rename the pending tree the recycle tree so we can reuse it on the 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // next sync. 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_.swap(recycle_tree_); 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recycle_tree_->ClearRenderSurfaces(); 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->SetRootLayerScrollOffsetDelegate( 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->DidBecomeActive(); 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reduce wasted memory now that unlinked resources are guaranteed not 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to be used. 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->ReduceWastedContentsTextureMemoryOnImplThread(); 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnHasPendingTreeStateChanged(pending_tree_); 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (debug_state_.continuous_painting) { 1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const RenderingStats& stats = 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->GetRenderingStats(); 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_time_counter_->SavePaintTime( 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stats.total_paint_time + stats.total_record_time + 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stats.total_rasterize_time_for_now_bins_on_pending_tree); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1403a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1404a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) client_->DidActivatePendingTree(); 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetVisible(bool visible) { 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visible_ == visible) 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible_ = visible; 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidVisibilityChange(this, visible_); 141490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!renderer_) 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->SetVisible(visible); 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ManagedMemoryPolicy LayerTreeHostImpl::ActualManagedMemoryPolicy() const { 142390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!debug_state_.rasterize_only_visible_content) 142490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return managed_memory_policy_; 142590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 142690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ManagedMemoryPolicy actual = managed_memory_policy_; 142790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) actual.priority_cutoff_when_not_visible = 142890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING; 142990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) actual.priority_cutoff_when_visible = 143090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_REQUIRED_ONLY; 143190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return actual; 143290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 143390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::InitializeRenderer( 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OutputSurface> output_surface) { 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since we will create a new resource provider, we cannot continue to use 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the old resources (i.e. render_surfaces and texture IDs). Clear them 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before we destroy the old resource provider. 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->root_layer()) 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearRenderSurfaces(); 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->root_layer()) 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidLoseOutputSurfaceRecursive(active_tree_->root_layer()); 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_ && pending_tree_->root_layer()) 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidLoseOutputSurfaceRecursive(pending_tree_->root_layer()); 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (recycle_tree_ && recycle_tree_->root_layer()) 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidLoseOutputSurfaceRecursive(recycle_tree_->root_layer()); 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (resource_provider_) 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_provider_->DidLoseOutputSurface(); 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: order is important here. 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_.reset(); 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_.reset(); 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_provider_.reset(); 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_surface_.reset(); 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!output_surface->BindToClient(this)) 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return DoInitializeRenderer(output_surface.Pass(), 1460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) false /* is_deferred_init */); 1461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool LayerTreeHostImpl::DoInitializeRenderer( 1464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<OutputSurface> output_surface, 1465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool is_deferred_init) { 1466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (output_surface->capabilities().deferred_gl_initialization && 1467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !is_deferred_init) { 146890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(joth): Defer creating the Renderer too, until GL is initialized. 146990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // See http://crbug.com/230197 147090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) renderer_ = SoftwareRenderer::Create(this, output_surface.get(), NULL); 147190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 147290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<ResourceProvider> resource_provider = ResourceProvider::Create( 147390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) output_surface.get(), settings_.highp_threshold_min); 147490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!resource_provider) 147590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14775e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (output_surface->capabilities().delegated_rendering) { 147890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) renderer_ = DelegatingRenderer::Create(this, output_surface.get(), 147990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resource_provider.get()); 148090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (output_surface->context3d()) { 148190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) renderer_ = GLRenderer::Create(this, 148290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) output_surface.get(), 148390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resource_provider.get(), 148490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings_.highp_threshold_min, 148590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings_.force_direct_layer_drawing); 148690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (output_surface->software_device()) { 148790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) renderer_ = SoftwareRenderer::Create(this, 148890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) output_surface.get(), 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_provider.get()); 149090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 149190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!renderer_) 149290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 149390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 149490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (settings_.impl_side_painting) { 149590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool using_map_image = GetRendererCapabilities().using_map_image; 149690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) tile_manager_ = TileManager::Create(this, 149790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resource_provider.get(), 149890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings_.num_raster_threads, 149990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) settings_.use_color_estimator, 150090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) rendering_stats_instrumentation_, 150190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) using_map_image); 150290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); 150390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 150490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 150590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resource_provider_ = resource_provider.Pass(); 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_surface_ = output_surface.Pass(); 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!visible_) 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->SetVisible(visible_); 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to be initialized to get max texture size. 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->set_needs_update_draw_properties(); 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_) 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_->set_needs_update_draw_properties(); 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool LayerTreeHostImpl::DeferredInitialize( 1525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<ContextProvider> offscreen_context_provider) { 1526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(output_surface_->capabilities().deferred_gl_initialization); 1527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(output_surface_->context3d()); 1528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(boliu): This is temporary until proper resource clean up is possible 1530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // without resetting |tile_manager_| or |resource_provider_|. 1531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!resource_provider_); 1532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool success = 1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DoInitializeRenderer(output_surface_.Pass(), true /* is_deferred_init */); 1535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) client_->DidTryInitializeRendererOnImplThread(success, 1536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) offscreen_context_provider); 1537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return success; 1538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetViewportSize(gfx::Size device_viewport_size) { 1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (device_viewport_size == device_viewport_size_) 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_ && device_viewport_size_ != device_viewport_size) 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetViewportSizeInvalid(); 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_viewport_size_ = device_viewport_size; 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (renderer_) 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->ViewportChanged(); 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetFullRootLayerDamage(); 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) { 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (overdraw_bottom_height == overdraw_bottom_height_) 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overdraw_bottom_height_ = overdraw_bottom_height; 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetFullRootLayerDamage(); 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (device_scale_factor == device_scale_factor_) 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor_ = device_scale_factor; 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 157290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (renderer_) 157390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) renderer_->ViewportChanged(); 157490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetFullRootLayerDamage(); 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1579868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gfx::Rect LayerTreeHostImpl::DeviceViewport() const { 1580868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (external_viewport_.IsEmpty()) 1581868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return gfx::Rect(device_viewport_size_); 1582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return external_viewport_; 1584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const gfx::Transform& LayerTreeHostImpl::DeviceTransform() const { 1587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return external_transform_; 1588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::UpdateMaxScrollOffset() { 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->UpdateMaxScrollOffset(); 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::DidChangeTopControlsPosition() { 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->set_needs_update_draw_properties(); 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetFullRootLayerDamage(); 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::EnsureRenderSurfaceLayerList() { 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->UpdateDrawProperties(); 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !active_tree_->RenderSurfaceLayerList().empty(); 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 160590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) { 160690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(input_handler_client_ == NULL); 160790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_ = client; 160890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 160990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin( 1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Point viewport_point, InputHandler::ScrollInputType type) { 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin"); 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_controls_manager_) 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_->ScrollBegin(); 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!CurrentlyScrollingLayer()); 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearCurrentlyScrollingLayer(); 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!EnsureRenderSurfaceLayerList()) 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollIgnored; 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF device_viewport_point = gfx::ScalePoint(viewport_point, 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor_); 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First find out which layer was hit from the saved list of visible layers 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the most recent frame. 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer_impl = LayerTreeHostCommon::FindLayerThatIsHitByPoint( 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_viewport_point, active_tree_->RenderSurfaceLayerList()); 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Walk up the hierarchy and look for a scrollable layer. 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* potentially_scrolling_layer_impl = 0; 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; layer_impl; layer_impl = layer_impl->parent()) { 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The content layer can also block attempts to scroll outside the main 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread. 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollStatus status = layer_impl->TryScroll(device_viewport_point, type); 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == ScrollOnMainThread) { 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->IncrementMainThreadScrolls(); 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true); 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollOnMainThread; 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* scroll_layer_impl = FindScrollLayerForContentLayer(layer_impl); 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!scroll_layer_impl) 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status = scroll_layer_impl->TryScroll(device_viewport_point, type); 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any layer wants to divert the scroll event to the main thread, abort. 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == ScrollOnMainThread) { 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->IncrementMainThreadScrolls(); 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true); 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollOnMainThread; 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == ScrollStarted && !potentially_scrolling_layer_impl) 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) potentially_scrolling_layer_impl = scroll_layer_impl; 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When hiding top controls is enabled and the controls are hidden or 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overlaying the content, force scrolls to be enabled on the root layer to 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // allow bringing the top controls back into view. 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!potentially_scrolling_layer_impl && top_controls_manager_ && 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_->content_top_offset() != 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_.top_controls_height) { 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) potentially_scrolling_layer_impl = RootScrollLayer(); 16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (potentially_scrolling_layer_impl) { 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetCurrentlyScrollingLayer( 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) potentially_scrolling_layer_impl); 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_bubble_scrolls_ = (type != NonBubblingGesture); 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wheel_scrolling_ = (type == Wheel); 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->IncrementImplThreadScrolls(); 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false); 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollStarted; 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollIgnored; 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2dF LayerTreeHostImpl::ScrollLayerWithViewportSpaceDelta( 16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer_impl, 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale_from_viewport_to_screen_space, 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF viewport_point, 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF viewport_delta) { 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Layers with non-invertible screen space transforms should not have passed 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the scroll hit test in the first place. 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(layer_impl->screen_space_transform().IsInvertible()); 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform inverse_screen_space_transform( 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform::kSkipInitialization); 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool did_invert = layer_impl->screen_space_transform().GetInverse( 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &inverse_screen_space_transform); 1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(shawnsingh): With the advent of impl-side crolling for non-root 1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // layers, we may need to explicitly handle uninvertible transforms here. 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(did_invert); 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF screen_space_point = 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(viewport_point, scale_from_viewport_to_screen_space); 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF screen_space_delta = viewport_delta; 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_space_delta.Scale(scale_from_viewport_to_screen_space); 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First project the scroll start and end points to local layer space to find 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the scroll delta in layer coordinates. 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool start_clipped, end_clipped; 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF screen_space_end_point = screen_space_point + screen_space_delta; 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF local_start_point = 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::ProjectPoint(inverse_screen_space_transform, 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_space_point, 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &start_clipped); 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF local_end_point = 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::ProjectPoint(inverse_screen_space_transform, 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_space_end_point, 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &end_clipped); 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In general scroll point coordinates should not get clipped. 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!start_clipped); 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!end_clipped); 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (start_clipped || end_clipped) 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2dF(); 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // local_start_point and local_end_point are in content space but we want to 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // move them to layer space for scrolling. 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float width_scale = 1.f / layer_impl->contents_scale_x(); 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float height_scale = 1.f / layer_impl->contents_scale_y(); 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_start_point.Scale(width_scale, height_scale); 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_end_point.Scale(width_scale, height_scale); 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Apply the scroll delta. 1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF previous_delta = layer_impl->ScrollDelta(); 17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->ScrollBy(local_end_point - local_start_point); 17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the end point in the layer's content space so we can apply its 17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ScreenSpaceTransform. 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF actual_local_end_point = local_start_point + 1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_impl->ScrollDelta() - 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_delta; 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF actual_local_content_end_point = 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(actual_local_end_point, 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.f / width_scale, 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.f / height_scale); 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculate the applied scroll delta in viewport space coordinates. 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF actual_screen_space_end_point = 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapPoint(layer_impl->screen_space_transform(), 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actual_local_content_end_point, 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &end_clipped); 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!end_clipped); 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end_clipped) 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2dF(); 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF actual_viewport_end_point = 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(actual_screen_space_end_point, 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.f / scale_from_viewport_to_screen_space); 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return actual_viewport_end_point - viewport_point; 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static gfx::Vector2dF ScrollLayerWithLocalDelta(LayerImpl* layer_impl, 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF local_delta) { 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF previous_delta(layer_impl->ScrollDelta()); 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->ScrollBy(local_delta); 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return layer_impl->ScrollDelta() - previous_delta; 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::ScrollBy(gfx::Point viewport_point, 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scroll_delta) { 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!CurrentlyScrollingLayer()) 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF pending_delta = scroll_delta; 177290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Vector2dF unused_root_delta; 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool did_scroll = false; 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool consume_by_top_controls = top_controls_manager_ && 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (CurrentlyScrollingLayer() == RootScrollLayer() || scroll_delta.y() < 0); 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl; 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl = layer_impl->parent()) { 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl->scrollable()) 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 178390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (layer_impl == RootScrollLayer()) { 178490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only allow bubble scrolling when the scroll is in the direction to make 178590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the top controls visible. 178690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (consume_by_top_controls && layer_impl == RootScrollLayer()) { 178790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pending_delta = top_controls_manager_->ScrollBy(pending_delta); 178890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UpdateMaxScrollOffset(); 178990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 179090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Track root layer deltas for reporting overscroll. 179190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unused_root_delta = pending_delta; 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF applied_delta; 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gesture events need to be transformed from viewport coordinates to local 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layer coordinates so that the scrolling contents exactly follow the 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // user's finger. In contrast, wheel events represent a fixed amount of 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scrolling so we can just apply them directly. 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!wheel_scrolling_) { 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale_from_viewport_to_screen_space = device_scale_factor_; 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) applied_delta = 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollLayerWithViewportSpaceDelta(layer_impl, 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scale_from_viewport_to_screen_space, 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_point, pending_delta); 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) applied_delta = ScrollLayerWithLocalDelta(layer_impl, pending_delta); 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the layer wasn't able to move, try the next one in the hierarchy. 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float move_threshold_squared = 0.1f * 0.1f; 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (applied_delta.LengthSquared() < move_threshold_squared) { 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (should_bubble_scrolls_ || !did_lock_scrolling_layer_) 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 181790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 181890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (layer_impl == RootScrollLayer()) 181990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unused_root_delta.Subtract(applied_delta); 182090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_scroll = true; 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_lock_scrolling_layer_ = true; 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!should_bubble_scrolls_) { 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetCurrentlyScrollingLayer(layer_impl); 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the applied delta is within 45 degrees of the input delta, bail out to 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // make it easier to scroll just one layer in one direction without 18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // affecting any of its parents. 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float angle_threshold = 45; 18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (MathUtil::SmallestAngleBetweenVectors( 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) applied_delta, pending_delta) < angle_threshold) { 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_delta = gfx::Vector2d(); 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow further movement only on an axis perpendicular to the direction in 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // which the layer moved. 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF perpendicular_axis(-applied_delta.y(), applied_delta.x()); 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_delta = MathUtil::ProjectVector(pending_delta, perpendicular_axis); 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 184390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (gfx::ToRoundedVector2d(pending_delta).IsZero()) 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (did_scroll) { 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 185190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 185290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Scrolling of any layer will reset root overscroll accumulation. 185390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) accumulated_root_overscroll_ = gfx::Vector2dF(); 185490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 185590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 185690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) accumulated_root_overscroll_ += unused_root_delta; 185790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool did_overscroll = !gfx::ToRoundedVector2d(unused_root_delta).IsZero(); 185890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (did_overscroll && input_handler_client_) { 185990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_->DidOverscroll(accumulated_root_overscroll_, 186090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) current_fling_velocity_); 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 186290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return did_scroll; 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This implements scrolling by page as described here: 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://msdn.microsoft.com/en-us/library/windows/desktop/ms645601(v=vs.85).aspx#_win32_The_Mouse_Wheel 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for events with WHEEL_PAGESCROLL set. 186990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool LayerTreeHostImpl::ScrollVerticallyByPage(gfx::Point viewport_point, 187090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScrollDirection direction) { 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(wheel_scrolling_); 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl; 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl = layer_impl->parent()) { 18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl->scrollable()) 18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl->vertical_scrollbar_layer()) 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float height = layer_impl->vertical_scrollbar_layer()->bounds().height(); 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // These magical values match WebKit and are designed to scroll nearly the 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // entire visible content height but leave a bit of overlap. 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page = std::max(height * 0.875f, 1.f); 188790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (direction == SCROLL_BACKWARD) 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page = -page; 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF delta = gfx::Vector2dF(0.f, page); 18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF applied_delta = ScrollLayerWithLocalDelta(layer_impl, delta); 18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!applied_delta.IsZero()) { 18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetCurrentlyScrollingLayer(layer_impl); 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetRootLayerScrollOffsetDelegate( 1908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 1909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 1910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->SetRootLayerScrollOffsetDelegate( 1911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::OnRootLayerDelegatedScrollOffsetChanged() { 1915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(root_layer_scroll_offset_delegate_ != NULL); 1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ClearCurrentlyScrollingLayer() { 19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->ClearCurrentlyScrollingLayer(); 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_lock_scrolling_layer_ = false; 192290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) accumulated_root_overscroll_ = gfx::Vector2dF(); 1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_fling_velocity_ = gfx::Vector2dF(); 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ScrollEnd() { 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_controls_manager_) 19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_->ScrollEnd(); 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearCurrentlyScrollingLayer(); 1930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartScrollbarAnimation(CurrentFrameTimeTicks()); 1931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InputHandler::ScrollStatus LayerTreeHostImpl::FlingScrollBegin() { 1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (active_tree_->CurrentlyScrollingLayer()) 1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ScrollStarted; 1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ScrollIgnored; 1938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::NotifyCurrentFlingVelocity(gfx::Vector2dF velocity) { 1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_fling_velocity_ = velocity; 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureBegin() { 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_gesture_active_ = true; 19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_pinch_anchor_ = gfx::Point(); 19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta, 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point anchor) { 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::PinchGestureUpdate"); 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!RootScrollLayer()) 19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep the center-of-pinch anchor specified by (x, y) in a stable 19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // position over the course of the magnify. 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page_scale_delta = active_tree_->page_scale_delta(); 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF previous_scale_anchor = 19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(anchor, 1.f / page_scale_delta); 19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetPageScaleDelta(page_scale_delta * magnify_delta); 19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_delta = active_tree_->page_scale_delta(); 19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF new_scale_anchor = 19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(anchor, 1.f / page_scale_delta); 19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor; 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_pinch_anchor_ = anchor; 19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) move.Scale(1 / active_tree_->page_scale_factor()); 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RootScrollLayer()->ScrollBy(move); 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureEnd() { 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_gesture_active_ = false; 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer_impl) { 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl) 19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d scroll_delta = 1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ToFlooredVector2d(layer_impl->ScrollDelta()); 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!scroll_delta.IsZero()) { 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostCommon::ScrollUpdateInfo scroll; 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll.layer_id = layer_impl->id(); 19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll.scroll_delta = scroll_delta; 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_info->scrolls.push_back(scroll); 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->SetSentScrollDelta(scroll_delta); 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer_impl->children().size(); ++i) 20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CollectScrollDeltas(scroll_info, layer_impl->children()[i]); 20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_info->page_scale_delta = active_tree_->page_scale_delta(); 20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scroll_info.Pass(); 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetFullRootLayerDamage() { 2014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetViewportDamage(gfx::Rect(device_viewport_size_)); 20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { 20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_scale_animation_ || !RootScrollLayer()) 20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double monotonic_time = (time - base::TimeTicks()).InSecondsF(); 20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() + 2023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootScrollLayer()->ScrollDelta(); 20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetPageScaleDelta( 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_->PageScaleFactorAtTime(monotonic_time) / 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->page_scale_factor()); 20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF next_scroll = 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_->ScrollOffsetAtTime(monotonic_time); 20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RootScrollLayer()->ScrollBy(next_scroll - scroll_total); 20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) { 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_.reset(); 20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!top_controls_manager_ || !RootScrollLayer()) 20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scroll = top_controls_manager_->Animate(time); 20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (RootScrollLayer()->TotalScrollOffset().y() == 0.f) 2047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RootScrollLayer()->ScrollBy(gfx::ScaleVector2d( 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll, 1.f / active_tree_->total_page_scale_factor())); 20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time, 20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time wall_clock_time) { 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!settings_.accelerated_animation_enabled || 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_->active_animation_controllers().empty() || 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !active_tree_->root_layer()) 20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers"); 20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_animation_time_ = wall_clock_time; 20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double monotonic_seconds = (monotonic_time - base::TimeTicks()).InSecondsF(); 20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimationRegistrar::AnimationControllerMap copy = 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_->active_animation_controllers(); 20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); 20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != copy.end(); 20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter).second->Animate(monotonic_seconds); 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!settings_.accelerated_animation_enabled || 20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_->active_animation_controllers().empty() || 20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !active_tree_->root_layer()) 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState"); 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<AnimationEventsVector> events = 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) make_scoped_ptr(new AnimationEventsVector); 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimationRegistrar::AnimationControllerMap copy = 20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_->active_animation_controllers(); 20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != copy.end(); 20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) 2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (*iter).second->UpdateState(start_ready_animations, events.get()); 20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!events->empty()) { 20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass(), 20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_animation_time_); 20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeDelta LayerTreeHostImpl::LowFrequencyAnimationInterval() const { 20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta::FromSeconds(1); 20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SendDidLoseOutputSurfaceRecursive(LayerImpl* current) { 21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(current); 21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current->DidLoseOutputSurface(); 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current->mask_layer()) 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidLoseOutputSurfaceRecursive(current->mask_layer()); 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current->replica_layer()) 21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidLoseOutputSurfaceRecursive(current->replica_layer()); 21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < current->children().size(); ++i) 21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidLoseOutputSurfaceRecursive(current->children()[i]); 21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ClearRenderSurfaces() { 21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->ClearRenderSurfaces(); 21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_) 21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_->ClearRenderSurfaces(); 21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string LayerTreeHostImpl::LayerTreeAsText() const { 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string str; 21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->root_layer()) { 21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) str = active_tree_->root_layer()->LayerTreeAsText(); 21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) str += "RenderSurfaces:\n"; 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DumpRenderSurfaces(&str, 1, active_tree_->root_layer()); 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return str; 21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string LayerTreeHostImpl::LayerTreeAsJson() const { 21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string str; 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->root_layer()) { 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson()); 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONWriter::WriteWithOptions( 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return str; 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DumpRenderSurfaces(std::string* str, 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int indent, 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerImpl* layer) const { 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->render_surface()) 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->render_surface()->DumpSurface(str, indent); 21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) 21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DumpRenderSurfaces(str, indent, layer->children()[i]); 21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int LayerTreeHostImpl::SourceAnimationFrameNumber() const { 21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fps_counter_->current_frame_number(); 21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SendManagedMemoryStats( 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_visible_bytes, 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_visible_and_nearby_bytes, 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_use_bytes) { 21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!renderer_) 21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Round the numbers being sent up to the next 8MB, to throttle the rate 21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // at which we spam the GPU process. 21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const size_t rounding_step = 8 * 1024 * 1024; 21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_visible_bytes = RoundUp(memory_visible_bytes, rounding_step); 21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_visible_and_nearby_bytes = RoundUp(memory_visible_and_nearby_bytes, 21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rounding_step); 21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_use_bytes = RoundUp(memory_use_bytes, rounding_step); 21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_sent_memory_visible_bytes_ == memory_visible_bytes && 21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_and_nearby_bytes_ == 21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_visible_and_nearby_bytes && 21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_use_bytes_ == memory_use_bytes) { 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_bytes_ = memory_visible_bytes; 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_and_nearby_bytes_ = memory_visible_and_nearby_bytes; 21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_use_bytes_ = memory_use_bytes; 21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->SendManagedMemoryStats(last_sent_memory_visible_bytes_, 21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_and_nearby_bytes_, 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_use_bytes_); 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateScrollbars(base::TimeTicks time) { 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateScrollbarsRecursive(active_tree_->root_layer(), time); 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateScrollbarsRecursive(LayerImpl* layer, 21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks time) { 21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer) 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarAnimationController* scrollbar_controller = 21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->scrollbar_animation_controller(); 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scrollbar_controller && scrollbar_controller->Animate(time)) { 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_INSTANT0( 2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "cc", "LayerTreeHostImpl::SetNeedsRedraw due to AnimateScrollbars", 2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) 21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateScrollbarsRecursive(layer->children()[i], time); 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::StartScrollbarAnimation(base::TimeTicks time) { 22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::StartScrollbarAnimation"); 22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartScrollbarAnimationRecursive(RootLayer(), time); 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::StartScrollbarAnimationRecursive(LayerImpl* layer, 22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks time) { 22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer) 22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarAnimationController* scrollbar_controller = 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->scrollbar_animation_controller(); 22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scrollbar_controller && scrollbar_controller->IsAnimating()) { 22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta delay = scrollbar_controller->DelayBeforeStart(time); 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delay > base::TimeDelta()) 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RequestScrollbarAnimationOnImplThread(delay); 22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (scrollbar_controller->Animate(time)) 22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartScrollbarAnimationRecursive(layer->children()[i], time); 22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetTreePriority(TreePriority priority) { 22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tile_manager_) 22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GlobalStateThatImpactsTilePriority new_state(tile_manager_->GlobalState()); 22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_state.tree_priority == priority) 22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state.tree_priority = priority; 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->SetGlobalState(new_state); 2236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manage_tiles_needed_ = true; 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 223990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::ResetCurrentFrameTimeForNextFrame() { 2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_frame_timeticks_ = base::TimeTicks(); 2241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_frame_time_ = base::Time(); 2242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void UpdateCurrentFrameTime(base::TimeTicks* ticks, base::Time* now) { 2245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ticks->is_null()) { 2246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(now->is_null()); 2247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *ticks = base::TimeTicks::Now(); 2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *now = base::Time::Now(); 2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::TimeTicks LayerTreeHostImpl::CurrentFrameTimeTicks() { 2253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateCurrentFrameTime(¤t_frame_timeticks_, ¤t_frame_time_); 2254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return current_frame_timeticks_; 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::Time LayerTreeHostImpl::CurrentFrameTime() { 2258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateCurrentFrameTime(¤t_frame_timeticks_, ¤t_frame_time_); 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_frame_time_; 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> LayerTreeHostImpl::AsValue() const { 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 2264b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (this->pending_tree_) 2265b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("activation_state", ActivationStateAsValue().release()); 2266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("device_viewport_size", 2267b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MathUtil::AsValue(device_viewport_size_).release()); 2268b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (tile_manager_) 2269b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("tiles", tile_manager_->AllTilesAsValue().release()); 2270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("active_tree", active_tree_->AsValue().release()); 2271b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (pending_tree_) 2272b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("pending_tree", pending_tree_->AsValue().release()); 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state.PassAs<base::Value>(); 22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> LayerTreeHostImpl::ActivationStateAsValue() const { 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 2278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("lthi", TracedValue::CreateIDRef(this).release()); 227990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (tile_manager_) 228090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) state->Set("tile_manager", tile_manager_->BasicStateAsValue().release()); 22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state.PassAs<base::Value>(); 22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::GetNonCompositedContentLayerRecursive( 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer) { 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer) 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->DrawsContent()) 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer; 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (LayerImplList::const_iterator it = layer->children().begin(); 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != layer->children().end(); ++it) { 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* nccr = GetNonCompositedContentLayerRecursive(*it); 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (nccr) 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return nccr; 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)skia::RefPtr<SkPicture> LayerTreeHostImpl::CapturePicture() { 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeImpl* tree = 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_ ? pending_tree_.get() : active_tree_.get(); 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer = GetNonCompositedContentLayerRecursive(tree->root_layer()); 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer ? layer->GetPicture() : skia::RefPtr<SkPicture>(); 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetDebugState(const LayerTreeDebugState& debug_state) { 23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state_.continuous_painting != debug_state.continuous_painting) 23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_time_counter_->ClearHistory(); 23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_state_ = debug_state; 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 2318