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" 104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/containers/hash_tables.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_writer.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/scrollbar_animation_controller.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/animation/timing_function.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/util.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/debug_rect_history.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/frame_rate_counter.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/overdraw_metrics.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/paint_time_counter.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/rendering_stats_instrumentation.h" 24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/debug/traced_value.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/page_scale_animation.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/top_controls_manager.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/append_quads_data.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/layer_impl.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_iterator.h" 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer_impl.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_metadata.h" 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/output/copy_output_request.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegating_renderer.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/gl_renderer.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/software_renderer.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/memory_history.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture_layer_tiling.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h" 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/resources/ui_resource_bitmap.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/delay_based_time_source.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/texture_uploader.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/damage_tracker.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_common.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/quad_culler.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/tree_synchronizer.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DidVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visible) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN1("webkit", 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeHostImpl::SetVisible", 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeHostImpl", 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::SetVisible", id); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> Create( 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelayBasedTimeSource> time_source) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr( 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new LayerTreeHostImplTimeSourceAdapter(layer_tree_host_impl, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source)); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~LayerTreeHostImplTimeSourceAdapter() { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_->SetClient(NULL); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_->SetActive(false); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTimerTick() OVERRIDE { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In single threaded mode we attempt to simulate changing the current 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread by maintaining a fake thread id. When we switch from one 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread to another, we construct DebugScopedSetXXXThread objects that 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // update the thread id. This lets DCHECKS that ensure we're on the 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // right thread to work correctly in single threaded mode. The problem 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // here is that the timer tasks are run via the message loop, and when 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // they run, we've had no chance to construct a DebugScopedSetXXXThread 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // object. The result is that we report that we're running on the main 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread. In multi-threaded mode, this timer is run on the compositor 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread, so to keep this consistent in single-threaded mode, we'll 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // construct a DebugScopedSetImplThread object. There is no need to do 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this in multi-threaded mode since the real thread id's will be 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // correct. In fact, setting fake thread id's interferes with the real 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread id's and causes breakage. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DebugScopedSetImplThread> set_impl_thread; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_tree_host_impl_->proxy()->HasImplThread()) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_impl_thread.reset( 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DebugScopedSetImplThread(layer_tree_host_impl_->proxy())); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(enne): This should probably happen post-animate. 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (layer_tree_host_impl_->pending_tree()) { 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layer_tree_host_impl_->ActivatePendingTreeIfNeeded(); 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (layer_tree_host_impl_->pending_tree()) { 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layer_tree_host_impl_->pending_tree()->UpdateDrawProperties(); 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layer_tree_host_impl_->ManageTiles(); 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->Animate( 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->CurrentFrameTimeTicks(), 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->CurrentFrameTime()); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool start_ready_animations = true; 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetActive(bool active) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active != time_source_->Active()) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_->SetActive(active); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplTimeSourceAdapter( 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelayBasedTimeSource> time_source) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : layer_tree_host_impl_(layer_tree_host_impl), 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_(time_source) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_->SetClient(this); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl_; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelayBasedTimeSource> time_source_; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LayerTreeHostImplTimeSourceAdapter); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::FrameData::FrameData() 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : contains_incomplete_tile(false), has_no_damage(false) {} 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::FrameData::~FrameData() {} 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create( 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) return make_scoped_ptr( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new LayerTreeHostImpl(settings, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation)); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::LayerTreeHostImpl( 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeSettings& settings, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImplClient* client, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Proxy* proxy, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : client_(client), 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_(proxy), 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_(NULL), 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_lock_scrolling_layer_(false), 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_bubble_scrolls_(false), 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wheel_scrolling_(false), 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manage_tiles_needed_(false), 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_(NULL), 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_(settings), 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible_(true), 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cached_managed_memory_policy_( 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrioritizedResourceManager::DefaultMemoryAllocationLimit(), 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING, 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedMemoryPolicy::kDefaultNumResourcesLimit), 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_gesture_active_(false), 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())), 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_time_counter_(PaintTimeCounter::Create()), 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_history_(MemoryHistory::Create()), 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rect_history_(DebugRectHistory::Create()), 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) max_memory_needed_bytes_(0), 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_bytes_(0), 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_and_nearby_bytes_(0), 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_use_bytes_(0), 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch zero_budget_(false), 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) device_scale_factor_(1.f), 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) overdraw_bottom_height_(0.f), 200438599f994082010ffd07abcbecb7a97956451e2Bo Liu device_viewport_valid_for_tile_management_(true), 201fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch external_stencil_test_enabled_(false), 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_(AnimationRegistrar::Create()), 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch rendering_stats_instrumentation_(rendering_stats_instrumentation), 204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch need_to_update_visible_tiles_before_draw_(false) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidVisibilityChange(this, visible_); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDebugState(settings.initial_debug_state); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (settings.calculate_top_controls_position) { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_ = 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TopControlsManager::Create(this, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.top_controls_height, 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.top_controls_show_threshold, 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.top_controls_hide_threshold); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDebugState(settings.initial_debug_state); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LTHI always has an active tree. 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_ = LayerTreeImpl::create(this); 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_EVENT_OBJECT_CREATED_WITH_ID( 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", this); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTreeHostImpl::~LayerTreeHostImpl() { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_EVENT_OBJECT_DELETED_WITH_ID( 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", this); 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_handler_client_) { 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_->WillShutdown(); 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_ = NULL; 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The layer trees must be destroyed before the layer tree host. We've 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // made a contract with our animation controllers that the registrar 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // will outlive them, and we must make good. 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch recycle_tree_.reset(); 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_tree_.reset(); 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_tree_.reset(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::BeginCommit() {} 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::CommitComplete() { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete"); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Impl-side painting needs an update immediately post-commit to have the 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // opportunity to create tilings. Other paths can call UpdateDrawProperties 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // more lazily when needed prior to drawing. 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (settings_.impl_side_painting) { 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_->set_needs_update_draw_properties(); 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pending_tree_->UpdateDrawProperties(); 256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Start working on newly created tiles immediately if needed. 257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ManageTiles(); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->set_needs_update_draw_properties(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SendManagedMemoryStats(); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochbool LayerTreeHostImpl::CanDraw() const { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: If you are changing this function or any other function that might 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // affect the result of CanDraw, make sure to call 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // client_->OnCanDrawStateChanged in the proper places and update the 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NotifyIfCanDrawChanged test. 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 271fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch if (!renderer_) { 272fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no renderer", 273fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch TRACE_EVENT_SCOPE_THREAD); 274fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch return false; 275fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch } 276fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 277fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch // Must have an OutputSurface if |renderer_| is not NULL. 278fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch DCHECK(output_surface_); 279fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 280fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch // TODO(boliu): Make draws without root_layer work and move this below 281fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967. 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!active_tree_->root_layer()) { 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 287fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 288fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) 289fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch return true; 290fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 291438599f994082010ffd07abcbecb7a97956451e2Bo Liu if (DeviceViewport().IsEmpty()) { 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->ViewportSizeInvalid()) { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_INSTANT0( 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->ContentsTexturesPurged()) { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_INSTANT0( 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "cc", "LayerTreeHostImpl::CanDraw contents textures purged", 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time wall_clock_time) { 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_handler_client_) 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_->Animate(monotonic_time); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatePageScale(monotonic_time); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateLayers(monotonic_time, wall_clock_time); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateScrollbars(monotonic_time); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateTopControls(monotonic_time); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ManageTiles() { 322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!tile_manager_) 323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!manage_tiles_needed_) 325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manage_tiles_needed_ = false; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->ManageTiles(); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_required_bytes; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_nice_to_have_bytes; 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_used_bytes; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->GetMemoryStats(&memory_required_bytes, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &memory_nice_to_have_bytes, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &memory_used_bytes); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendManagedMemoryStats(memory_required_bytes, 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_nice_to_have_bytes, 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_used_bytes); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset, 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool anchor_point, 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page_scale, 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time, 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) { 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!RootScrollLayer()) 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scroll_total = 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootScrollLayer()->scroll_offset() + RootScrollLayer()->ScrollDelta(); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); 351438599f994082010ffd07abcbecb7a97956451e2Bo Liu gfx::SizeF viewport_size = UnscaledScrollableViewportSize(); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double start_time_seconds = (start_time - base::TimeTicks()).InSecondsF(); 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Easing constants experimentally determined. 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TimingFunction> timing_function = 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_ = 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PageScaleAnimation::Create(scroll_total, 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->total_page_scale_factor(), 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_size, 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_scrollable_size, 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) start_time_seconds, 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timing_function.Pass()); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (anchor_point) { 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF anchor(target_offset); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_->ZoomWithAnchor(anchor, 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale, 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration.InSecondsF()); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scaled_target_offset = target_offset; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_->ZoomTo(scaled_target_offset, 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale, 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration.InSecondsF()); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ScheduleAnimation() { 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::HaveTouchEventHandlersAt(gfx::Point viewport_point) { 389a163e21641001dda3882a4a9036c2353dea0146frbyers@chromium.org if (!settings_.touch_hit_testing) 390a163e21641001dda3882a4a9036c2353dea0146frbyers@chromium.org return true; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!EnsureRenderSurfaceLayerList()) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF device_viewport_point = 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(viewport_point, device_scale_factor_); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First find out which layer was hit from the saved list of visible layers 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the most recent frame. 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer_impl = LayerTreeHostCommon::FindLayerThatIsHitByPoint( 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_viewport_point, 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->RenderSurfaceLayerList()); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Walk up the hierarchy and look for a layer with a touch event handler 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // region that the given point hits. 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; layer_impl; layer_impl = layer_impl->parent()) { 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (LayerTreeHostCommon::LayerHasTouchEventHandlersAt(device_viewport_point, 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl)) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LayerTreeHostImpl::SetLatencyInfoForInputEvent( 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const ui::LatencyInfo& latency_info) { 416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_tree()->SetLatencyInfo(latency_info); 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::TrackDamageForAllSurfaces( 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_draw_layer, 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list) { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For now, we use damage tracking to compute a global scissor. To do this, we 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // must compute all damage tracking before drawing anything, so that we know 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the root damage rect. The root damage rect is then used to scissor each 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface. 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = render_surface_layer_list.size() - 1; 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_index >= 0; 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = render_surface_layer_list[surface_index]; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(render_surface); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->damage_tracker()->UpdateDamageTrackingState( 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->layer_list(), 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->id(), 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->SurfacePropertyChangedOnlyFromDescendant(), 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->content_rect(), 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->mask_layer(), 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->filters(), 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface_layer->filter().get()); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochscoped_ptr<base::Value> LayerTreeHostImpl::FrameData::AsValue() const { 4454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 4464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("contains_incomplete_tile", contains_incomplete_tile); 4474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("has_no_damage", has_no_damage); 4484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 4494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Quad data can be quite large, so only dump render passes if we select 4504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // cc.debug.quads. 4514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool quads_enabled; 4524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TRACE_EVENT_CATEGORY_GROUP_ENABLED( 4534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), &quads_enabled); 4544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (quads_enabled) { 4554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_ptr<base::ListValue> render_pass_list(new base::ListValue()); 4564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch for (size_t i = 0; i < render_passes.size(); ++i) 4574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch render_pass_list->Append(render_passes[i]->AsValue().release()); 4584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("render_passes", render_pass_list.release()); 4594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 4604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return value.PassAs<base::Value>(); 4614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 4624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::FrameData::AppendRenderPass( 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> render_pass) { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_passes_by_id[render_pass->id] = render_pass.get(); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_passes.push_back(render_pass.Pass()); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static DrawMode GetDrawMode(OutputSurface* output_surface) { 470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (output_surface->ForcedDrawToSoftwareDevice()) { 471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return DRAW_MODE_RESOURCELESS_SOFTWARE; 472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (output_surface->context3d()) { 473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return DRAW_MODE_HARDWARE; 474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(output_surface->software_device()); 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return DRAW_MODE_SOFTWARE; 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AppendQuadsForLayer(RenderPass* target_render_pass, 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer, 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OcclusionTrackerImpl& occlusion_tracker, 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData* append_quads_data) { 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool for_surface = false; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadCuller quad_culler(&target_render_pass->quad_list, 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &target_render_pass->shared_quad_state_list, 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer, 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->ShowDebugBorders(), 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for_surface); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->AppendQuads(&quad_culler, append_quads_data); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AppendQuadsForRenderSurfaceLayer( 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* target_render_pass, 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer, 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* contributing_render_pass, 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OcclusionTrackerImpl& occlusion_tracker, 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData* append_quads_data) { 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool for_surface = true; 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadCuller quad_culler(&target_render_pass->quad_list, 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &target_render_pass->shared_quad_state_list, 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer, 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->ShowDebugBorders(), 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for_surface); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_replica = false; 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->render_surface()->AppendQuads(&quad_culler, 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) append_quads_data, 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_replica, 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_render_pass->id); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add replica after the surface so that it appears below the surface. 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->has_replica()) { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_replica = true; 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->render_surface()->AppendQuads(&quad_culler, 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) append_quads_data, 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_replica, 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_render_pass->id); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void AppendQuadsToFillScreen( 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* target_render_pass, 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_layer, 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor screen_background_color, 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const OcclusionTrackerImpl& occlusion_tracker) { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!root_layer || !SkColorGetA(screen_background_color)) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (fill_region.IsEmpty()) 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool for_surface = false; 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadCuller quad_culler(&target_render_pass->quad_list, 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &target_render_pass->shared_quad_state_list, 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer, 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer->ShowDebugBorders(), 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for_surface); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Manually create the quad state for the gutter quads, as the root layer 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // doesn't have any bounds and so can't generate this itself. 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(danakj): Make the gutter quads generated by the solid color layer 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (make it smarter about generating quads to fill unoccluded areas). 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect root_target_rect = root_layer->render_surface()->content_rect(); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float opacity = 1.f; 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SharedQuadState* shared_quad_state = 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_culler.UseSharedQuadState(SharedQuadState::Create()); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shared_quad_state->SetAll(root_layer->draw_transform(), 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_target_rect.size(), 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_target_rect, 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_target_rect, 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) opacity); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData append_quads_data; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform_to_layer_space(gfx::Transform::kSkipInitialization); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool did_invert = root_layer->screen_space_transform().GetInverse( 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &transform_to_layer_space); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(did_invert); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (Region::Iterator fill_rects(fill_region); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fill_rects.has_rect(); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fill_rects.next()) { 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The root layer transform is composed of translations and scales only, 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // no perspective, so mapping is sufficient (as opposed to projecting). 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect layer_rect = 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect(transform_to_layer_space, fill_rects.rect()); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Skip the quad culler and just append the quads directly to avoid 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // occlusion checks. 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quad->SetNew(shared_quad_state, layer_rect, screen_background_color, false); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_culler.Append(quad.PassAs<DrawQuad>(), &append_quads_data); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes.empty()); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!CanDraw() || !active_tree_->root_layer()) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackDamageForAllSurfaces(active_tree_->root_layer(), 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *frame->render_surface_layer_list); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the root render surface has no visible damage, then don't generate a 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // frame at all. 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderSurfaceImpl* root_surface = 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->root_layer()->render_surface(); 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool root_surface_has_no_visible_damage = 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !root_surface->damage_tracker()->current_damage_rect().Intersects( 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_surface->content_rect()); 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool root_surface_has_contributing_layers = 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !root_surface->layer_list().empty(); 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_surface_has_contributing_layers && 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_surface_has_no_visible_damage) { 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT0("cc", 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->has_no_damage = true; 6047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // A copy request should cause damage, so we should not have any copy 6057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // requests in this case. 6067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_EQ(0u, active_tree_->LayersWithCopyOutputRequest().size()); 607fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch DCHECK(!output_surface_->capabilities() 608fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch .draw_and_swap_full_viewport_every_frame); 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT1("cc", 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "LayerTreeHostImpl::CalculateRenderPasses", 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "render_surface_layer_list.size()", 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<uint64>(frame->render_surface_layer_list->size())); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create the render passes in dependency order. 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = frame->render_surface_layer_list->size() - 1; 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) surface_index >= 0; 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*frame->render_surface_layer_list)[surface_index]; 6237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool should_draw_into_render_pass = 6267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_surface_layer->parent() == NULL || 6277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_surface->contributes_to_drawn_surface() || 6287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_surface_layer->HasCopyRequest(); 6297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (should_draw_into_render_pass) 6307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch render_surface_layer->render_surface()->AppendRenderPasses(frame); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool record_metrics_for_frame = 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_.show_overdraw_in_tracing && 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::debug::TraceLog::GetInstance() && 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::debug::TraceLog::GetInstance()->IsEnabled(); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OcclusionTrackerImpl occlusion_tracker( 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer()->render_surface()->content_rect(), 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) record_metrics_for_frame); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.set_minimum_tracking_size( 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_.minimum_occlusion_tracking_size); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state_.show_occluding_rects) { 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.set_occluding_screen_space_rects_container( 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &frame->occluding_screen_space_rects); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state_.show_non_occluding_rects) { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.set_non_occluding_screen_space_rects_container( 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &frame->non_occluding_screen_space_rects); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add quads to the Render passes in FrontToBack order to allow for testing 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // occlusion and performing culling during the tree walk. 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef LayerIterator<LayerImpl, 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerImplList, 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl, 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorActions::FrontToBack> LayerIteratorType; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Typically when we are missing a texture and use a checkerboard quad, we 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // still draw the frame. However when the layer being checkerboarded is moving 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // due to an impl-animation, we drop the frame to avoid flashing due to the 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // texture suddenly appearing in the future. 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool draw_frame = true; 664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When we have a copy request for a layer, we need to draw no matter 665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // what, as the layer may disappear after this frame. 666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool have_copy_request = false; 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int layers_drawn = 0; 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DrawMode draw_mode = GetDrawMode(output_surface_.get()); 671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType end = 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType::End(frame->render_surface_layer_list); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerIteratorType it = 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerIteratorType::Begin(frame->render_surface_layer_list); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != end; 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it) { 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id target_render_pass_id = 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it.target_render_surface_layer()->render_surface()->RenderPassId(); 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* target_render_pass = 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id[target_render_pass_id]; 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool prevent_occlusion = it.target_render_surface_layer()->HasCopyRequest(); 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) occlusion_tracker.EnterLayer(it, prevent_occlusion); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AppendQuadsData append_quads_data(target_render_pass_id); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (it.represents_target_render_surface()) { 68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (it->HasCopyRequest()) { 690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) have_copy_request = true; 691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it->TakeCopyRequestsAndTransformToTarget( 692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &target_render_pass->copy_requests); 693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (it.represents_contributing_render_surface() && 6957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch it->render_surface()->contributes_to_drawn_surface()) { 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id contributing_render_pass_id = 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->render_surface()->RenderPassId(); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* contributing_render_pass = 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id[contributing_render_pass_id]; 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsForRenderSurfaceLayer(target_render_pass, 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *it, 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_render_pass, 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &append_quads_data); 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (it.represents_itself() && 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !it->visible_content_rect().IsEmpty()) { 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_occlusion_from_outside_target_surface; 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool impl_draw_transform_is_unknown = false; 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (occlusion_tracker.Occluded( 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->render_target(), 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->visible_content_rect(), 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->draw_transform(), 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_draw_transform_is_unknown, 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->is_clipped(), 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->clip_rect(), 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &has_occlusion_from_outside_target_surface)) { 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) append_quads_data.had_occlusion_from_outside_target_surface |= 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_occlusion_from_outside_target_surface; 719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (it->WillDraw(draw_mode, resource_provider_.get())) { 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(active_tree_, it->layer_tree_impl()); 721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->will_draw_layers.push_back(*it); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->HasContributingDelegatedRenderPasses()) { 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id contributing_render_pass_id = 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->FirstContributingRenderPassId(); 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (frame->render_passes_by_id.find(contributing_render_pass_id) != 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.end()) { 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* render_pass = 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id[contributing_render_pass_id]; 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData append_quads_data(render_pass->id); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsForLayer(render_pass, 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *it, 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &append_quads_data); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_render_pass_id = 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->NextContributingRenderPassId(contributing_render_pass_id); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsForLayer(target_render_pass, 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *it, 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker, 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &append_quads_data); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++layers_drawn; 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (append_quads_data.had_occlusion_from_outside_target_surface) 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_render_pass->has_occlusion_from_outside_target_surface = true; 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (append_quads_data.num_missing_tiles) { 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->AddMissingTiles( 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) append_quads_data.num_missing_tiles); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool layer_has_animating_transform = 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->screen_space_transform_is_animating() || 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->draw_transform_is_animating(); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_has_animating_transform) 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_frame = false; 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (append_quads_data.had_incomplete_tile) 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->contains_incomplete_tile = true; 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.LeaveLayer(it); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 771fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch if (have_copy_request || 772fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) draw_frame = true; 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->AddLayersDrawn(layers_drawn); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NDEBUG 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < frame->render_passes.size(); ++i) { 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) != frame->render_passes_by_id.end()); 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!active_tree_->has_transparent_background()) { 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes.back()->has_transparent_background = false; 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsToFillScreen(frame->render_passes.back(), 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer(), 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->background_color(), 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker); 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (draw_frame) 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) occlusion_tracker.overdraw_metrics()->RecordMetrics(this); 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!have_copy_request); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); 80152ebdf0d579a55c74b2fbf1111a990fc410b65a3Alexandre Elias renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); 802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RemoveRenderPasses(CullRenderPassesWithCachedTextures(renderer_.get()), 803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch frame); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Any copy requests left in the tree are not going to get serviced, and 8067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // should be aborted. 8077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ScopedPtrVector<CopyOutputRequest> requests_to_abort; 8087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch while (!active_tree_->LayersWithCopyOutputRequest().empty()) { 8097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); 8107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer->TakeCopyRequestsAndTransformToTarget(&requests_to_abort); 8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (size_t i = 0; i < requests_to_abort.size(); ++i) 8137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch requests_to_abort[i]->SendEmptyResult(); 8147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we're making a frame to draw, it better have at least one render pass. 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!frame->render_passes.empty()); 81752ebdf0d579a55c74b2fbf1111a990fc410b65a3Alexandre Elias 81852ebdf0d579a55c74b2fbf1111a990fc410b65a3Alexandre Elias // Should only have one render pass in resourceless software mode. 81952ebdf0d579a55c74b2fbf1111a990fc410b65a3Alexandre Elias if (output_surface_->ForcedDrawToSoftwareDevice()) 82052ebdf0d579a55c74b2fbf1111a990fc410b65a3Alexandre Elias DCHECK_EQ(1u, frame->render_passes.size()); 82152ebdf0d579a55c74b2fbf1111a990fc410b65a3Alexandre Elias 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return draw_frame; 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { 82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_handler_client_) 82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_->MainThreadHasStoppedFlinging(); 82890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool should_background_tick) { 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(proxy_->IsImplThread()); 833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool enabled = should_background_tick && 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !animation_registrar_->active_animation_controllers().empty(); 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lazily create the time_source adapter so that we can vary the interval for 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // testing. 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!time_source_client_adapter_) { 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_client_adapter_ = LayerTreeHostImplTimeSourceAdapter::Create( 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DelayBasedTimeSource::Create( 843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LowFrequencyAnimationInterval(), 844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : proxy_->MainThreadTaskRunner())); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_source_client_adapter_->SetActive(enabled); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetViewportDamage(gfx::Rect damage_rect) { 852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) viewport_damage_rect_.Union(damage_rect); 853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline RenderPass* FindRenderPassById( 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id render_pass_id, 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeHostImpl::FrameData& frame) { 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassIdHashMap::const_iterator it = 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame.render_passes_by_id.find(render_pass_id); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return it != frame.render_passes_by_id.end() ? it->second : NULL; 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void RemoveRenderPassesRecursive(RenderPass::Id remove_render_pass_id, 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame) { 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass* remove_render_pass = 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindRenderPassById(remove_render_pass_id, *frame); 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The pass was already removed by another quad - probably the original, and 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we are the replica. 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!remove_render_pass) 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassList& render_passes = frame->render_passes; 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassList::iterator to_remove = std::find(render_passes.begin(), 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_passes.end(), 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remove_render_pass); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(to_remove != render_passes.end()); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> removed_pass = render_passes.take(to_remove); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes.erase(to_remove); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.erase(remove_render_pass_id); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now follow up for all RenderPass quads and remove their RenderPasses 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // recursively. 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const QuadList& quad_list = removed_pass->quad_list; 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadList::ConstBackToFrontIterator quad_list_iterator = 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_list.BackToFrontBegin(); 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) if (current_quad->material != DrawQuad::RENDER_PASS) 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id next_remove_render_pass_id = 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id; 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveRenderPassesRecursive(next_remove_render_pass_id, frame); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures:: 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldRemoveRenderPass(const RenderPassDrawQuad& quad, 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FrameData& frame) const { 90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(renderer_); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool quad_has_damage = !quad.contents_changed_since_last_frame.IsEmpty(); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool quad_has_cached_resource = 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) renderer_->HaveCachedResourcesForRenderPassId(quad.render_pass_id); 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (quad_has_damage) { 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures have damage"); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (!quad_has_cached_resource) { 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures have no texture"); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures dropped!"); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::ShouldRemoveRenderPass( 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPassDrawQuad& quad, const FrameData& frame) const { 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* render_pass = 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindRenderPassById(quad.render_pass_id, frame); 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!render_pass) 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any quad or RenderPass draws into this RenderPass, then keep it. 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const QuadList& quad_list = render_pass->quad_list; 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (QuadList::ConstBackToFrontIterator quad_list_iterator = 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_list.BackToFrontBegin(); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_list_iterator != quad_list.BackToFrontEnd(); 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++quad_list_iterator) { 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DrawQuad* current_quad = *quad_list_iterator; 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_quad->material != DrawQuad::RENDER_PASS) 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* contributing_pass = FindRenderPassById( 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id, frame); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contributing_pass) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Defined for linking tests. 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template CC_EXPORT void LayerTreeHostImpl::RemoveRenderPasses< 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::CullRenderPassesWithCachedTextures>( 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CullRenderPassesWithCachedTextures culler, FrameData* frame); 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template CC_EXPORT void LayerTreeHostImpl::RemoveRenderPasses< 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::CullRenderPassesWithNoQuads>( 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CullRenderPassesWithNoQuads culler, FrameData*); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename RenderPassCuller> 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::RemoveRenderPasses(RenderPassCuller culler, 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FrameData* frame) { 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t it = culler.RenderPassListBegin(frame->render_passes); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != culler.RenderPassListEnd(frame->render_passes); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = culler.RenderPassListNext(it)) { 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* current_pass = frame->render_passes[it]; 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const QuadList& quad_list = current_pass->quad_list; 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadList::ConstBackToFrontIterator quad_list_iterator = 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_list.BackToFrontBegin(); 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; quad_list_iterator != quad_list.BackToFrontEnd(); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++quad_list_iterator) { 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DrawQuad* current_quad = *quad_list_iterator; 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_quad->material != DrawQuad::RENDER_PASS) 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPassDrawQuad* render_pass_quad = 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPassDrawQuad::MaterialCast(current_quad); 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!culler.ShouldRemoveRenderPass(*render_pass_quad, *frame)) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We are changing the vector in the middle of iteration. Because we 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // delete render passes that draw into the current pass, we are 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // guaranteed that any data from the iterator to the end will not 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // change. So, capture the iterator position from the end of the 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // list, and restore it after the change. 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t position_from_end = frame->render_passes.size() - it; 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = frame->render_passes.size() - position_from_end; 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(frame->render_passes.size(), position_from_end); 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::PrepareToDraw(FrameData* frame, 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect device_viewport_damage_rect) { 9907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TRACE_EVENT1("cc", 9917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "LayerTreeHostImpl::PrepareToDraw", 9927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "SourceFrameNumber", 9937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch active_tree_->source_frame_number()); 9947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 995ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (need_to_update_visible_tiles_before_draw_) { 9967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(tile_manager_); 997ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (tile_manager_->UpdateVisibleTiles()) 998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DidInitializeVisibleTile(); 9997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->UpdateDrawProperties(); 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes.clear(); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.clear(); 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->will_draw_layers.clear(); 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->contains_incomplete_tile = false; 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->has_no_damage = false; 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (active_tree_->root_layer()) { 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) device_viewport_damage_rect.Union(viewport_damage_rect_); 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) viewport_damage_rect_ = gfx::Rect(); 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->root_layer()->render_surface()->damage_tracker()-> 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddDamageNextUpdate(device_viewport_damage_rect); 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1018fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch if (!CalculateRenderPasses(frame)) { 1019fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch DCHECK(!output_surface_->capabilities() 1020fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch .draw_and_swap_full_viewport_every_frame); 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1022fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch } 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we return true, then we expect DrawLayers() to be called before this 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // function is called again. 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1029eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LayerTreeHostImpl::EvictTexturesForTesting() { 1030eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); 1031eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1032eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::EnforceManagedMemoryPolicy( 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ManagedMemoryPolicy& policy) { 103590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool evicted_resources = client_->ReduceContentsTextureMemoryOnImplThread( 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible_ ? policy.bytes_limit_when_visible 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : policy.bytes_limit_when_not_visible, 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedMemoryPolicy::PriorityCutoffToValue( 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible_ ? policy.priority_cutoff_when_visible 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : policy.priority_cutoff_when_not_visible)); 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (evicted_resources) { 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetContentsTexturesPurged(); 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_) 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_->SetContentsTexturesPurged(); 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SendManagedMemoryStats(); 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateTileManagerMemoryPolicy(policy); 1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy( 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ManagedMemoryPolicy& policy) { 1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!tile_manager_) 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GlobalStateThatImpactsTilePriority new_state(tile_manager_->GlobalState()); 1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_state.memory_limit_in_bytes = visible_ ? 1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.bytes_limit_when_visible : 1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.bytes_limit_when_not_visible; 1064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(reveman): We should avoid keeping around unused resources if 1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // possible. crbug.com/224475 1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_state.unused_memory_limit_in_bytes = static_cast<size_t>( 1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (static_cast<int64>(new_state.memory_limit_in_bytes) * 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings_.max_unused_resource_memory_percentage) / 100); 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_state.memory_limit_policy = 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy( 1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) visible_ ? 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.priority_cutoff_when_visible : 1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy.priority_cutoff_when_not_visible); 1074a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new_state.num_resources_limit = policy.num_resources_limit; 1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tile_manager_->SetGlobalState(new_state); 1076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manage_tiles_needed_ = true; 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::HasImplThread() const { 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return proxy_->HasImplThread(); 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidInitializeVisibleTile() { 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(reveman): Determine tiles that changed and only damage 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // what's necessary. 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetFullRootLayerDamage(); 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (client_) 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->DidInitializeVisibleTileOnImplThread(); 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void LayerTreeHostImpl::NotifyReadyToActivate() { 10927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (pending_tree_) { 1093ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch need_to_update_visible_tiles_before_draw_ = true; 10947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ActivatePendingTree(); 10957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 10967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 10977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::ShouldClearRootRenderPass() const { 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return settings_.should_clear_root_render_pass; 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { 1103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetManagedMemoryPolicy(policy, zero_budget_); 1104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 1105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeHostImpl::SetDiscardBackBufferWhenNotVisible(bool discard) { 1107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(renderer_); 1108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) renderer_->SetDiscardBackBufferWhenNotVisible(discard); 1109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid LayerTreeHostImpl::SetTreeActivationCallback( 1112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::Closure& callback) { 1113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(proxy_->IsImplThread()); 1114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(settings_.impl_side_painting || callback.is_null()); 1115a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch tree_activation_callback_ = callback; 1116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetManagedMemoryPolicy( 1119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const ManagedMemoryPolicy& policy, bool zero_budget) { 1120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (cached_managed_memory_policy_ == policy && zero_budget_ == zero_budget) 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedMemoryPolicy old_policy = ActualManagedMemoryPolicy(); 1124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) cached_managed_memory_policy_ = policy; 1126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) zero_budget_ = zero_budget; 1127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedMemoryPolicy actual_policy = ActualManagedMemoryPolicy(); 1128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (old_policy == actual_policy) 1130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!proxy_->HasImplThread()) { 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // In single-thread mode, this can be called on the main thread by 1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // GLRenderer::OnMemoryAllocationChanged. 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugScopedSetImplThread impl_thread(proxy_); 1136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnforceManagedMemoryPolicy(actual_policy); 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 1139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnforceManagedMemoryPolicy(actual_policy); 1140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If there is already enough memory to draw everything imaginable and the 1143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // new memory limit does not change this, then do not re-commit. Don't bother 1144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // skipping commits if this is not visible (commits don't happen when not 1145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // visible, there will almost always be a commit when this becomes visible). 1146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool needs_commit = true; 1147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (visible() && 1148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_policy.bytes_limit_when_visible >= max_memory_needed_bytes_ && 1149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) old_policy.bytes_limit_when_visible >= max_memory_needed_bytes_ && 1150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_policy.priority_cutoff_when_visible == 1151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) old_policy.priority_cutoff_when_visible) { 1152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) needs_commit = false; 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (needs_commit) 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LayerTreeHostImpl::SetExternalDrawConstraints( 1160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Transform& transform, 1161438599f994082010ffd07abcbecb7a97956451e2Bo Liu gfx::Rect viewport, 1162438599f994082010ffd07abcbecb7a97956451e2Bo Liu gfx::Rect clip, 1163438599f994082010ffd07abcbecb7a97956451e2Bo Liu bool valid_for_tile_management) { 1164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) external_transform_ = transform; 1165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) external_viewport_ = viewport; 1166438599f994082010ffd07abcbecb7a97956451e2Bo Liu external_clip_ = clip; 1167438599f994082010ffd07abcbecb7a97956451e2Bo Liu device_viewport_valid_for_tile_management_ = valid_for_tile_management; 1168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1170fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochvoid LayerTreeHostImpl::SetExternalStencilTest(bool enabled) { 1171fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch external_stencil_test_enabled_ = enabled; 1172fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch} 1173fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetNeedsRedrawRect(gfx::Rect damage_rect) { 1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_->SetNeedsRedrawRectOnImplThread(damage_rect); 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void LayerTreeHostImpl::BeginFrame(const BeginFrameArgs& args) { 11797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_->BeginFrameOnImplThread(args); 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11825e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)void LayerTreeHostImpl::OnSwapBuffersComplete( 11835e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) const CompositorFrameAck* ack) { 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(piman): We may need to do some validation on this ack before 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // processing it. 11865e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (ack && renderer_) 11875e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) renderer_->ReceiveSwapBuffersAck(*ack); 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11895e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) client_->OnSwapBuffersCompleteOnImplThread(); 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::OnCanDrawStateChangedForTree() { 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CompositorFrameMetadata LayerTreeHostImpl::MakeCompositorFrameMetadata() const { 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompositorFrameMetadata metadata; 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.device_scale_factor = device_scale_factor_; 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.page_scale_factor = active_tree_->total_page_scale_factor(); 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.viewport_size = active_tree_->ScrollableViewportSize(); 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.root_layer_size = active_tree_->ScrollableSize(); 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.min_page_scale_factor = active_tree_->min_page_scale_factor(); 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.max_page_scale_factor = active_tree_->max_page_scale_factor(); 12047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) metadata.latency_info = active_tree_->GetLatencyInfo(); 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_controls_manager_) { 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.location_bar_offset = 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF(0.f, top_controls_manager_->controls_top_offset()); 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.location_bar_content_translation = 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF(0.f, top_controls_manager_->content_top_offset()); 1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metadata.overdraw_bottom_height = overdraw_bottom_height_; 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!RootScrollLayer()) 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metadata; 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata.root_scroll_offset = RootScrollLayer()->TotalScrollOffset(); 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metadata; 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::AllowPartialSwap() const { 1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We don't track damage on the HUD layer (it interacts with damage tracking 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // visualizations), so disable partial swaps to make the HUD layer display 1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // properly. 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !debug_state_.ShowHudRects(); 1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1228fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochbool LayerTreeHostImpl::ExternalStencilTestEnabled() const { 1229fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch return external_stencil_test_enabled_; 1230fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch} 1231fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 1232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) { 1233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->DidBeginTracing(); 1234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DrawLayers(FrameData* frame, 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks frame_begin_time) { 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CanDraw()); 1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1241558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (frame->has_no_damage) { 1242558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch TRACE_EVENT0("cc", "EarlyOut_NoDamage"); 1243fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch DCHECK(!output_surface_->capabilities() 1244fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch .draw_and_swap_full_viewport_every_frame); 1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1246558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!frame->render_passes.empty()); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fps_counter_->SaveTimeStamp(frame_begin_time); 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->SetScreenFrameCount( 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fps_counter_->current_frame_number()); 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->SetDroppedFrameCount( 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fps_counter_->dropped_frame_count()); 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tile_manager_) { 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_history_->SaveEntry( 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->memory_stats_from_last_assign()); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state_.ShowHudRects()) { 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rect_history_->SaveDebugRectsForCurrentFrame( 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer(), 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *frame->render_surface_layer_list, 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->occluding_screen_space_rects, 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->non_occluding_screen_space_rects, 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_state_); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!settings_.impl_side_painting && debug_state_.continuous_painting) { 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const RenderingStats& stats = 1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rendering_stats_instrumentation_->GetRenderingStats(); 1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_time_counter_->SavePaintTime(stats.total_paint_time); 1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool is_new_trace; 1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); 1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_new_trace) { 1280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (pending_tree_) { 1281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree( 1282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_tree_->root_layer(), 1283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&LayerTreeHostImplDidBeginTracingCallback)); 1284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree( 1286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_tree_->root_layer(), 1287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&LayerTreeHostImplDidBeginTracingCallback)); 1288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 12914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TRACE_DISABLED_BY_DEFAULT("cc.debug") "," 12924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), "cc::LayerTreeHostImpl", 12934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch this, TracedValue::FromValue(AsValueWithFrame(frame).release())); 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Because the contents of the HUD depend on everything else in the frame, the 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // contents of its texture are updated as the last thing before the frame is 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // drawn. 1298ff02a5906993e65f5c8bf12b09245e7a673d8283boliu@chromium.org if (active_tree_->hud_layer()) { 1299ff02a5906993e65f5c8bf12b09245e7a673d8283boliu@chromium.org active_tree_->hud_layer()->UpdateHudTexture( 1300ff02a5906993e65f5c8bf12b09245e7a673d8283boliu@chromium.org GetDrawMode(output_surface_.get()), resource_provider_.get()); 1301ff02a5906993e65f5c8bf12b09245e7a673d8283boliu@chromium.org } 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (output_surface_->ForcedDrawToSoftwareDevice()) { 130474e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias bool disable_picture_quad_image_filtering = 130574e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias IsCurrentlyScrolling() || needs_animate_layers(); 130674e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias 1307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<SoftwareRenderer> temp_software_renderer = 1308b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SoftwareRenderer::Create(this, output_surface_.get(), NULL); 130974e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias temp_software_renderer->DrawFrame(&frame->render_passes, disable_picture_quad_image_filtering); 1310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 131174e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias renderer_->DrawFrame(&frame->render_passes, false); 1312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The render passes should be consumed by the renderer. 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(frame->render_passes.empty()); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.clear(); 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The next frame should start by assuming nothing has changed, and changes 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are noted as they occur. 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDrawDamagedArea(); 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidDrawAllLayers(const FrameData& frame) { 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < frame.will_draw_layers.size(); ++i) 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame.will_draw_layers[i]->DidDraw(resource_provider_.get()); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Once all layers have been drawn, pending texture uploads should no 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // longer block future uploads. 1332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resource_provider_->MarkPendingUploadsAsNonBlocking(); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::FinishAllRendering() { 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (renderer_) 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->Finish(); 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::IsContextLost() { 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return renderer_ && renderer_->IsContextLost(); 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const RendererCapabilities& LayerTreeHostImpl::GetRendererCapabilities() const { 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return renderer_->Capabilities(); 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) { 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (frame.has_no_damage) 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 13525e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) renderer_->SwapBuffers(); 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->ClearLatencyInfo(); 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) { 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (output_surface_) 135990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) output_surface_->SetNeedsBeginFrame(enable); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 136290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)float LayerTreeHostImpl::DeviceScaleFactor() const { 136390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return device_scale_factor_; 136490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 136590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1366438599f994082010ffd07abcbecb7a97956451e2Bo Liugfx::SizeF LayerTreeHostImpl::UnscaledScrollableViewportSize() const { 1367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The container layer bounds should be used if non-overlay scrollbars may 1368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // exist since it adjusts for them. 1369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerImpl* container_layer = active_tree_->RootContainerLayer(); 1370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!Settings().solid_color_scrollbars && container_layer) { 1371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(!top_controls_manager_); 1372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK_EQ(0, overdraw_bottom_height_); 1373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return container_layer->bounds(); 1374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::SizeF dip_size = 1377438599f994082010ffd07abcbecb7a97956451e2Bo Liu gfx::ScaleSize(device_viewport_size_, 1.f / device_scale_factor()); 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float top_offset = 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::SizeF(dip_size.width(), 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dip_size.height() - top_offset - overdraw_bottom_height_); 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTreeSettings& LayerTreeHostImpl::Settings() const { 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return settings(); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::DidLoseOutputSurface() { 1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(jamesr): The renderer_ check is needed to make some of the 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // LayerTreeHostContextTest tests pass, but shouldn't be necessary (or 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // important) in production. We should adjust the test to not need this. 1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (renderer_) 1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_->DidLoseOutputSurfaceOnImplThread(); 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::Readback(void* pixels, 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect rect_in_device_viewport) { 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(renderer_); 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->GetFramebufferPixels(pixels, rect_in_device_viewport); 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LayerTreeHostImpl::HaveRootScrollLayer() const { 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !!RootScrollLayer(); 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::RootLayer() const { 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return active_tree_->root_layer(); 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::RootScrollLayer() const { 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return active_tree_->RootScrollLayer(); 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const { 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return active_tree_->CurrentlyScrollingLayer(); 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141974e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Eliasbool LayerTreeHostImpl::IsCurrentlyScrolling() const { 142074e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias return CurrentlyScrollingLayer() || 142174e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias (RootScrollLayer() && RootScrollLayer()->IsExternalFlingActive()); 142274e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias} 142374e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Content layers can be either directly scrollable or contained in an outer 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scrolling layer which applies the scroll transform. Given a content layer, 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this function returns the associated scroll layer if any. 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static LayerImpl* FindScrollLayerForContentLayer(LayerImpl* layer_impl) { 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl) 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_impl->scrollable()) 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_impl; 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_impl->DrawsContent() && 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->parent() && 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->parent()->scrollable()) 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_impl->parent(); 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::CreatePendingTree() { 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(!pending_tree_); 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (recycle_tree_) 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recycle_tree_.swap(pending_tree_); 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_ = LayerTreeImpl::create(this); 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnHasPendingTreeStateChanged(pending_tree_); 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree", pending_tree_.get()); 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_STEP0("cc", 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "PendingTree", pending_tree_.get(), "waiting"); 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1455ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid LayerTreeHostImpl::UpdateVisibleTiles() { 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!client_->IsInsideDraw()) << 1457ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "Updating visible tiles within a draw may trigger " 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "spurious redraws."; 1459ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (tile_manager_ && tile_manager_->UpdateVisibleTiles()) 1460ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DidInitializeVisibleTile(); 14617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1462ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch need_to_update_visible_tiles_before_draw_ = false; 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void LayerTreeHostImpl::ActivatePendingTreeIfNeeded() { 14667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(pending_tree_); 146790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CHECK(settings_.impl_side_painting); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!pending_tree_) 14707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 14717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The tile manager is usually responsible for notifying activation. 14737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // If there is no tile manager, then we need to manually activate. 14747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!tile_manager_ || tile_manager_->AreTilesRequiredForActivationReady()) { 14757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ActivatePendingTree(); 14767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 14777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Manage tiles in case state affecting tile priority has changed. 14807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ManageTiles(); 14817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1482b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) TRACE_EVENT_ASYNC_STEP1( 148390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "cc", 148490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "PendingTree", pending_tree_.get(), "activate", 148590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "state", TracedValue::FromValue(ActivationStateAsValue().release())); 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ActivatePendingTree() { 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(pending_tree_); 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_END0("cc", "PendingTree", pending_tree_.get()); 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->SetRootLayerScrollOffsetDelegate(NULL); 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->PushPersistedState(pending_tree_.get()); 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_->needs_full_tree_sync()) { 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetRootLayer( 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TreeSynchronizer::SynchronizeTrees(pending_tree_->root_layer(), 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->DetachLayerTree(), 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_.get())); 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TreeSynchronizer::PushProperties(pending_tree_->root_layer(), 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->root_layer()); 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!recycle_tree_); 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1504a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Process any requests in the UI resource queue. The request queue is given 1505a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // in LayerTreeHost::FinishCommitOnImplThread. This must take place before 1506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the swap. 1507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pending_tree_->ProcessUIResourceRequestQueue(); 1508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_->PushPropertiesTo(active_tree_.get()); 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now that we've synced everything from the pending tree to the active 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tree, rename the pending tree the recycle tree so we can reuse it on the 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // next sync. 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_tree_.swap(recycle_tree_); 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1516331ba8b17b62dfe7ec9544bbfc1203a2ba03c0c3primiano@chromium.org active_tree_->DidBecomeActive(); 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->SetRootLayerScrollOffsetDelegate( 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reduce wasted memory now that unlinked resources are guaranteed not 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to be used. 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->ReduceWastedContentsTextureMemoryOnImplThread(); 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnHasPendingTreeStateChanged(pending_tree_); 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (debug_state_.continuous_painting) { 1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const RenderingStats& stats = 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->GetRenderingStats(); 1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_time_counter_->SavePaintTime( 1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stats.total_paint_time + stats.total_record_time + 1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stats.total_rasterize_time_for_now_bins_on_pending_tree); 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1537a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) client_->DidActivatePendingTree(); 1538a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!tree_activation_callback_.is_null()) 1539a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch tree_activation_callback_.Run(); 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetVisible(bool visible) { 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(proxy_->IsImplThread()); 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visible_ == visible) 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visible_ = visible; 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidVisibilityChange(this, visible_); 154990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy()); 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1551f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) // Evict tiles immediately if invisible since this tab may never get another 1552f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) // draw or timer tick. 1553f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) if (!visible_) 1554f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) ManageTiles(); 1555f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!renderer_) 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->SetVisible(visible); 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 156290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ManagedMemoryPolicy LayerTreeHostImpl::ActualManagedMemoryPolicy() const { 1563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedMemoryPolicy actual = cached_managed_memory_policy_; 1564a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (debug_state_.rasterize_only_visible_content) { 1565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual.priority_cutoff_when_not_visible = 1566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING; 1567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual.priority_cutoff_when_visible = 1568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_REQUIRED_ONLY; 1569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1571a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (zero_budget_) { 1572a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual.bytes_limit_when_visible = 0; 1573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual.bytes_limit_when_not_visible = 0; 1574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1575a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 157690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return actual; 157790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 157890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)size_t LayerTreeHostImpl::memory_allocation_limit_bytes() const { 1580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return ActualManagedMemoryPolicy().bytes_limit_when_visible; 1581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 1582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LayerTreeHostImpl::ReleaseTreeResources() { 1584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (active_tree_->root_layer()) 1585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SendReleaseResourcesRecursive(active_tree_->root_layer()); 1586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (pending_tree_ && pending_tree_->root_layer()) 1587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SendReleaseResourcesRecursive(pending_tree_->root_layer()); 1588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (recycle_tree_ && recycle_tree_->root_layer()) 1589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SendReleaseResourcesRecursive(recycle_tree_->root_layer()); 1590a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1591a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Remove all existing maps from UIResourceId to ResourceId. 1592a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_map_.clear(); 1593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LayerTreeHostImpl::CreateAndSetRenderer( 1596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OutputSurface* output_surface, 15977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ResourceProvider* resource_provider, 15987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool skip_gl_renderer) { 1599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!renderer_); 1600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (output_surface->capabilities().delegated_rendering) { 1601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch renderer_ = 1602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DelegatingRenderer::Create(this, output_surface, resource_provider); 16037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (output_surface->context3d() && !skip_gl_renderer) { 1604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch renderer_ = GLRenderer::Create(this, 1605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch output_surface, 1606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resource_provider, 1607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings_.highp_threshold_min, 1608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings_.force_direct_layer_drawing); 1609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (output_surface->software_device()) { 1610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch renderer_ = 1611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SoftwareRenderer::Create(this, output_surface, resource_provider); 1612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (renderer_) { 1615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch renderer_->SetVisible(visible_); 1616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetFullRootLayerDamage(); 1617e591d623e77fe2d98bfee55d0463a658e1aa17e1enne@chromium.org 1618e591d623e77fe2d98bfee55d0463a658e1aa17e1enne@chromium.org // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be 1619e591d623e77fe2d98bfee55d0463a658e1aa17e1enne@chromium.org // initialized to get max texture size. Also, after releasing resources, 1620e591d623e77fe2d98bfee55d0463a658e1aa17e1enne@chromium.org // trees need another update to generate new ones. 1621e591d623e77fe2d98bfee55d0463a658e1aa17e1enne@chromium.org active_tree_->set_needs_update_draw_properties(); 1622e591d623e77fe2d98bfee55d0463a658e1aa17e1enne@chromium.org if (pending_tree_) 1623e591d623e77fe2d98bfee55d0463a658e1aa17e1enne@chromium.org pending_tree_->set_needs_update_draw_properties(); 1624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeHostImpl::CreateAndSetTileManager( 16287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ResourceProvider* resource_provider, 16297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool using_map_image) { 16307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(settings_.impl_side_painting); 16317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(resource_provider); 16327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch tile_manager_ = TileManager::Create(this, 16337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch resource_provider, 16347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch settings_.num_raster_threads, 16357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch rendering_stats_instrumentation_, 16367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch using_map_image); 16377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); 1638ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch need_to_update_visible_tiles_before_draw_ = false; 16397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 16407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { 1642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); 1643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::InitializeRenderer( 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OutputSurface> output_surface) { 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since we will create a new resource provider, we cannot continue to use 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the old resources (i.e. render_surfaces and texture IDs). Clear them 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before we destroy the old resource provider. 1650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReleaseTreeResources(); 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (resource_provider_) 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_provider_->DidLoseOutputSurface(); 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: order is important here. 16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_.reset(); 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_.reset(); 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_provider_.reset(); 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_surface_.reset(); 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!output_surface->BindToClient(this)) 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<ResourceProvider> resource_provider = ResourceProvider::Create( 1664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch output_surface.get(), settings_.highp_threshold_min); 1665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!resource_provider) 1666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 1667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (output_surface->capabilities().deferred_gl_initialization) 1669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EnforceZeroBudget(true); 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool skip_gl_renderer = false; 16727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateAndSetRenderer( 16737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch output_surface.get(), resource_provider.get(), skip_gl_renderer); 167490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!renderer_) 1676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 167790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (settings_.impl_side_painting) { 16797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateAndSetTileManager(resource_provider.get(), 16807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetRendererCapabilities().using_map_image); 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Setup BeginFrameEmulation if it's not supported natively 16847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!settings_.begin_frame_scheduling_enabled) { 16857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::TimeDelta display_refresh_interval = 16867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeDelta::FromMicroseconds( 16877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time::kMicrosecondsPerSecond / 16887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) settings_.refresh_rate); 16897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 16907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_surface->InitializeBeginFrameEmulation( 1691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch proxy_->ImplThreadTaskRunner(), 16927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) settings_.throttle_frame_production, 16937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) display_refresh_interval); 16947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 16967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int max_frames_pending = 16977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_surface->capabilities().max_frames_pending; 16987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (max_frames_pending <= 0) 16997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING; 17007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) output_surface->SetMaxFramesPending(max_frames_pending); 17017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1702eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resource_provider_ = resource_provider.Pass(); 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_surface_ = output_surface.Pass(); 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool LayerTreeHostImpl::DeferredInitialize( 1711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<ContextProvider> offscreen_context_provider) { 1712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(output_surface_->capabilities().deferred_gl_initialization); 1713eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(settings_.impl_side_painting); 1714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(settings_.solid_color_scrollbars); 1715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(output_surface_->context3d()); 1716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1717eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReleaseTreeResources(); 1718eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch renderer_.reset(); 17197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch resource_provider_->InitializeGL(); 17207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool skip_gl_renderer = false; 17217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateAndSetRenderer( 17227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch output_surface_.get(), resource_provider_.get(), skip_gl_renderer); 1723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool success = !!renderer_.get(); 1725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) client_->DidTryInitializeRendererOnImplThread(success, 1726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) offscreen_context_provider); 1727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (success) { 1728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EnforceZeroBudget(false); 1729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch client_->SetNeedsCommitOnImplThread(); 1730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return success; 1732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 17347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeHostImpl::ReleaseGL() { 17357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(output_surface_->capabilities().deferred_gl_initialization); 17367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(settings_.impl_side_painting); 17377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(settings_.solid_color_scrollbars); 17387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(output_surface_->context3d()); 17397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReleaseTreeResources(); 17417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch renderer_.reset(); 17427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch tile_manager_.reset(); 17437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch resource_provider_->InitializeSoftware(); 17447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool skip_gl_renderer = true; 17467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateAndSetRenderer( 17477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch output_surface_.get(), resource_provider_.get(), skip_gl_renderer); 17487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(renderer_); 17497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnforceZeroBudget(true); 17517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateAndSetTileManager(resource_provider_.get(), 17527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetRendererCapabilities().using_map_image); 17537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(tile_manager_); 17547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool success = true; 17567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch client_->DidTryInitializeRendererOnImplThread( 17577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch success, scoped_refptr<ContextProvider>()); 17587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch client_->SetNeedsCommitOnImplThread(); 17597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 17607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetViewportSize(gfx::Size device_viewport_size) { 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (device_viewport_size == device_viewport_size_) 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_tree_ && device_viewport_size_ != device_viewport_size) 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetViewportSizeInvalid(); 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_viewport_size_ = device_viewport_size; 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (renderer_) 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->ViewportChanged(); 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->OnCanDrawStateChanged(CanDraw()); 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetFullRootLayerDamage(); 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) { 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (overdraw_bottom_height == overdraw_bottom_height_) 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overdraw_bottom_height_ = overdraw_bottom_height; 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetFullRootLayerDamage(); 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (device_scale_factor == device_scale_factor_) 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor_ = device_scale_factor; 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 179390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (renderer_) 179490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) renderer_->ViewportChanged(); 179590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetFullRootLayerDamage(); 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1800868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gfx::Rect LayerTreeHostImpl::DeviceViewport() const { 1801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (external_viewport_.IsEmpty()) 1802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return gfx::Rect(device_viewport_size_); 1803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return external_viewport_; 1805868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1807438599f994082010ffd07abcbecb7a97956451e2Bo Liugfx::Rect LayerTreeHostImpl::DeviceClip() const { 1808438599f994082010ffd07abcbecb7a97956451e2Bo Liu return external_clip_; 1809438599f994082010ffd07abcbecb7a97956451e2Bo Liu} 1810438599f994082010ffd07abcbecb7a97956451e2Bo Liu 1811868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const gfx::Transform& LayerTreeHostImpl::DeviceTransform() const { 1812868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return external_transform_; 1813868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1814868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::UpdateMaxScrollOffset() { 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->UpdateMaxScrollOffset(); 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::DidChangeTopControlsPosition() { 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->set_needs_update_draw_properties(); 1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetFullRootLayerDamage(); 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::EnsureRenderSurfaceLayerList() { 1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->UpdateDrawProperties(); 1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !active_tree_->RenderSurfaceLayerList().empty(); 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 183090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) { 183190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(input_handler_client_ == NULL); 183290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_client_ = client; 183390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 183490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin( 1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Point viewport_point, InputHandler::ScrollInputType type) { 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin"); 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_controls_manager_) 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_->ScrollBegin(); 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!CurrentlyScrollingLayer()); 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearCurrentlyScrollingLayer(); 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!EnsureRenderSurfaceLayerList()) 18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollIgnored; 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF device_viewport_point = gfx::ScalePoint(viewport_point, 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor_); 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First find out which layer was hit from the saved list of visible layers 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the most recent frame. 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer_impl = LayerTreeHostCommon::FindLayerThatIsHitByPoint( 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_viewport_point, active_tree_->RenderSurfaceLayerList()); 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Walk up the hierarchy and look for a scrollable layer. 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* potentially_scrolling_layer_impl = 0; 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; layer_impl; layer_impl = layer_impl->parent()) { 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The content layer can also block attempts to scroll outside the main 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread. 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollStatus status = layer_impl->TryScroll(device_viewport_point, type); 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == ScrollOnMainThread) { 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->IncrementMainThreadScrolls(); 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true); 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollOnMainThread; 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* scroll_layer_impl = FindScrollLayerForContentLayer(layer_impl); 18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!scroll_layer_impl) 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status = scroll_layer_impl->TryScroll(device_viewport_point, type); 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any layer wants to divert the scroll event to the main thread, abort. 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == ScrollOnMainThread) { 18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->IncrementMainThreadScrolls(); 18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true); 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollOnMainThread; 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == ScrollStarted && !potentially_scrolling_layer_impl) 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) potentially_scrolling_layer_impl = scroll_layer_impl; 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When hiding top controls is enabled and the controls are hidden or 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overlaying the content, force scrolls to be enabled on the root layer to 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // allow bringing the top controls back into view. 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!potentially_scrolling_layer_impl && top_controls_manager_ && 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_->content_top_offset() != 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_.top_controls_height) { 18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) potentially_scrolling_layer_impl = RootScrollLayer(); 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 189415d17fec7d7268c82d8cb86c963ce0d316ccb7b0Martin Kosiba // If we want to send a DidOverscroll for this scroll it can't be ignored. 189515d17fec7d7268c82d8cb86c963ce0d316ccb7b0Martin Kosiba if (!potentially_scrolling_layer_impl && settings_.always_overscroll) 189615d17fec7d7268c82d8cb86c963ce0d316ccb7b0Martin Kosiba potentially_scrolling_layer_impl = RootScrollLayer(); 189715d17fec7d7268c82d8cb86c963ce0d316ccb7b0Martin Kosiba 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (potentially_scrolling_layer_impl) { 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetCurrentlyScrollingLayer( 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) potentially_scrolling_layer_impl); 19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_bubble_scrolls_ = (type != NonBubblingGesture); 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wheel_scrolling_ = (type == Wheel); 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rendering_stats_instrumentation_->IncrementImplThreadScrolls(); 19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false); 19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollStarted; 19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScrollIgnored; 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2dF LayerTreeHostImpl::ScrollLayerWithViewportSpaceDelta( 19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer_impl, 19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale_from_viewport_to_screen_space, 19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF viewport_point, 19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF viewport_delta) { 19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Layers with non-invertible screen space transforms should not have passed 19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the scroll hit test in the first place. 19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(layer_impl->screen_space_transform().IsInvertible()); 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform inverse_screen_space_transform( 19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform::kSkipInitialization); 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool did_invert = layer_impl->screen_space_transform().GetInverse( 19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &inverse_screen_space_transform); 1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(shawnsingh): With the advent of impl-side crolling for non-root 1924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // layers, we may need to explicitly handle uninvertible transforms here. 19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(did_invert); 19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF screen_space_point = 19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(viewport_point, scale_from_viewport_to_screen_space); 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF screen_space_delta = viewport_delta; 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_space_delta.Scale(scale_from_viewport_to_screen_space); 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First project the scroll start and end points to local layer space to find 19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the scroll delta in layer coordinates. 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool start_clipped, end_clipped; 19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF screen_space_end_point = screen_space_point + screen_space_delta; 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF local_start_point = 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::ProjectPoint(inverse_screen_space_transform, 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_space_point, 19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &start_clipped); 19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF local_end_point = 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::ProjectPoint(inverse_screen_space_transform, 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_space_end_point, 19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &end_clipped); 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In general scroll point coordinates should not get clipped. 19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!start_clipped); 19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!end_clipped); 19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (start_clipped || end_clipped) 19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2dF(); 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // local_start_point and local_end_point are in content space but we want to 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // move them to layer space for scrolling. 19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float width_scale = 1.f / layer_impl->contents_scale_x(); 19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float height_scale = 1.f / layer_impl->contents_scale_y(); 19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_start_point.Scale(width_scale, height_scale); 19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_end_point.Scale(width_scale, height_scale); 19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Apply the scroll delta. 1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF previous_delta = layer_impl->ScrollDelta(); 19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->ScrollBy(local_end_point - local_start_point); 19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the end point in the layer's content space so we can apply its 19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ScreenSpaceTransform. 19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF actual_local_end_point = local_start_point + 1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_impl->ScrollDelta() - 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_delta; 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF actual_local_content_end_point = 19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(actual_local_end_point, 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.f / width_scale, 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.f / height_scale); 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculate the applied scroll delta in viewport space coordinates. 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF actual_screen_space_end_point = 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapPoint(layer_impl->screen_space_transform(), 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actual_local_content_end_point, 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &end_clipped); 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!end_clipped); 19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end_clipped) 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2dF(); 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF actual_viewport_end_point = 19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(actual_screen_space_end_point, 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.f / scale_from_viewport_to_screen_space); 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return actual_viewport_end_point - viewport_point; 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static gfx::Vector2dF ScrollLayerWithLocalDelta(LayerImpl* layer_impl, 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF local_delta) { 1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2dF previous_delta(layer_impl->ScrollDelta()); 19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->ScrollBy(local_delta); 1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return layer_impl->ScrollDelta() - previous_delta; 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostImpl::ScrollBy(gfx::Point viewport_point, 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scroll_delta) { 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!CurrentlyScrollingLayer()) 19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF pending_delta = scroll_delta; 200190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Vector2dF unused_root_delta; 2002ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool did_scroll_x = false; 2003ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool did_scroll_y = false; 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool consume_by_top_controls = top_controls_manager_ && 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (CurrentlyScrollingLayer() == RootScrollLayer() || scroll_delta.y() < 0); 20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); 20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl; 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl = layer_impl->parent()) { 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl->scrollable()) 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 201390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (layer_impl == RootScrollLayer()) { 201490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only allow bubble scrolling when the scroll is in the direction to make 201590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the top controls visible. 201690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (consume_by_top_controls && layer_impl == RootScrollLayer()) { 201790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pending_delta = top_controls_manager_->ScrollBy(pending_delta); 201890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UpdateMaxScrollOffset(); 201990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 202090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Track root layer deltas for reporting overscroll. 202190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unused_root_delta = pending_delta; 20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF applied_delta; 20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gesture events need to be transformed from viewport coordinates to local 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layer coordinates so that the scrolling contents exactly follow the 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // user's finger. In contrast, wheel events represent a fixed amount of 20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scrolling so we can just apply them directly. 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!wheel_scrolling_) { 20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale_from_viewport_to_screen_space = device_scale_factor_; 20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) applied_delta = 20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollLayerWithViewportSpaceDelta(layer_impl, 20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scale_from_viewport_to_screen_space, 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewport_point, pending_delta); 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) applied_delta = ScrollLayerWithLocalDelta(layer_impl, pending_delta); 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the layer wasn't able to move, try the next one in the hierarchy. 2040ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch float move_threshold = 0.1f; 2041ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool did_move_layer_x = std::abs(applied_delta.x()) > move_threshold; 2042ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool did_move_layer_y = std::abs(applied_delta.y()) > move_threshold; 2043ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch did_scroll_x |= did_move_layer_x; 2044ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch did_scroll_y |= did_move_layer_y; 2045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!did_move_layer_x && !did_move_layer_y) { 20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (should_bubble_scrolls_ || !did_lock_scrolling_layer_) 20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 205190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 205290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (layer_impl == RootScrollLayer()) 205390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unused_root_delta.Subtract(applied_delta); 205490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_lock_scrolling_layer_ = true; 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!should_bubble_scrolls_) { 20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetCurrentlyScrollingLayer(layer_impl); 20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the applied delta is within 45 degrees of the input delta, bail out to 20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // make it easier to scroll just one layer in one direction without 20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // affecting any of its parents. 20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float angle_threshold = 45; 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (MathUtil::SmallestAngleBetweenVectors( 20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) applied_delta, pending_delta) < angle_threshold) { 20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_delta = gfx::Vector2d(); 20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow further movement only on an axis perpendicular to the direction in 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // which the layer moved. 20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF perpendicular_axis(-applied_delta.y(), applied_delta.x()); 20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_delta = MathUtil::ProjectVector(pending_delta, perpendicular_axis); 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 207690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (gfx::ToRoundedVector2d(pending_delta).IsZero()) 20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2080ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool did_scroll = did_scroll_x || did_scroll_y; 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (did_scroll) { 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 208590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 208690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2087ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Scrolling along an axis resets accumulated root overscroll for that axis. 2088ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (did_scroll_x) 2089ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch accumulated_root_overscroll_.set_x(0); 2090ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (did_scroll_y) 2091ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch accumulated_root_overscroll_.set_y(0); 2092ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 209390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) accumulated_root_overscroll_ += unused_root_delta; 209490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool did_overscroll = !gfx::ToRoundedVector2d(unused_root_delta).IsZero(); 209590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (did_overscroll && input_handler_client_) { 20969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch DidOverscrollParams params; 20979ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch params.accumulated_overscroll = accumulated_root_overscroll_; 20989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch params.latest_overscroll_delta = unused_root_delta; 20999ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch params.current_fling_velocity = current_fling_velocity_; 21009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch input_handler_client_->DidOverscroll(params); 21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 210290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return did_scroll; 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This implements scrolling by page as described here: 21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://msdn.microsoft.com/en-us/library/windows/desktop/ms645601(v=vs.85).aspx#_win32_The_Mouse_Wheel 21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for events with WHEEL_PAGESCROLL set. 210990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool LayerTreeHostImpl::ScrollVerticallyByPage(gfx::Point viewport_point, 211090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScrollDirection direction) { 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(wheel_scrolling_); 21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); 21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl; 21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl = layer_impl->parent()) { 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl->scrollable()) 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl->vertical_scrollbar_layer()) 21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float height = layer_impl->vertical_scrollbar_layer()->bounds().height(); 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // These magical values match WebKit and are designed to scroll nearly the 21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // entire visible content height but leave a bit of overlap. 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page = std::max(height * 0.875f, 1.f); 212790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (direction == SCROLL_BACKWARD) 21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page = -page; 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF delta = gfx::Vector2dF(0.f, page); 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF applied_delta = ScrollLayerWithLocalDelta(layer_impl, delta); 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!applied_delta.IsZero()) { 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetCurrentlyScrollingLayer(layer_impl); 21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::SetRootLayerScrollOffsetDelegate( 2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 2149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_tree_->SetRootLayerScrollOffsetDelegate( 2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_layer_scroll_offset_delegate_); 2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::OnRootLayerDelegatedScrollOffsetChanged() { 2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(root_layer_scroll_offset_delegate_ != NULL); 2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ClearCurrentlyScrollingLayer() { 21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->ClearCurrentlyScrollingLayer(); 21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_lock_scrolling_layer_ = false; 216290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) accumulated_root_overscroll_ = gfx::Vector2dF(); 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_fling_velocity_ = gfx::Vector2dF(); 21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::ScrollEnd() { 21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_controls_manager_) 21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) top_controls_manager_->ScrollEnd(); 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearCurrentlyScrollingLayer(); 21707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) StartScrollbarAnimation(); 2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InputHandler::ScrollStatus LayerTreeHostImpl::FlingScrollBegin() { 2174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!active_tree_->CurrentlyScrollingLayer()) 2175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return ScrollIgnored; 2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (settings_.ignore_root_layer_flings && 2178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) active_tree_->CurrentlyScrollingLayer() == 2179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) active_tree_->RootScrollLayer()) { 2180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ClearCurrentlyScrollingLayer(); 2181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return ScrollIgnored; 2182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return ScrollStarted; 2185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::NotifyCurrentFlingVelocity(gfx::Vector2dF velocity) { 2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_fling_velocity_ = velocity; 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureBegin() { 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_gesture_active_ = true; 21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_pinch_anchor_ = gfx::Point(); 21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 21954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch active_tree_->SetCurrentlyScrollingLayer(RootScrollLayer()); 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta, 21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point anchor) { 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::PinchGestureUpdate"); 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!RootScrollLayer()) 22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep the center-of-pinch anchor specified by (x, y) in a stable 22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // position over the course of the magnify. 22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page_scale_delta = active_tree_->page_scale_delta(); 22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF previous_scale_anchor = 22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(anchor, 1.f / page_scale_delta); 22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetPageScaleDelta(page_scale_delta * magnify_delta); 22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_delta = active_tree_->page_scale_delta(); 22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF new_scale_anchor = 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScalePoint(anchor, 1.f / page_scale_delta); 22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor; 22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_pinch_anchor_ = anchor; 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) move.Scale(1 / active_tree_->page_scale_factor()); 22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RootScrollLayer()->ScrollBy(move); 22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::PinchGestureEnd() { 22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pinch_gesture_active_ = false; 22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer_impl) { 22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_impl) 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d scroll_delta = 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ToFlooredVector2d(layer_impl->ScrollDelta()); 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!scroll_delta.IsZero()) { 22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostCommon::ScrollUpdateInfo scroll; 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll.layer_id = layer_impl->id(); 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll.scroll_delta = scroll_delta; 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_info->scrolls.push_back(scroll); 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_impl->SetSentScrollDelta(scroll_delta); 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer_impl->children().size(); ++i) 22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CollectScrollDeltas(scroll_info, layer_impl->children()[i]); 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { 22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); 22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_info->page_scale_delta = active_tree_->page_scale_delta(); 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scroll_info.Pass(); 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetFullRootLayerDamage() { 2262438599f994082010ffd07abcbecb7a97956451e2Bo Liu SetViewportDamage(gfx::Rect(DeviceViewport().size())); 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_scale_animation_ || !RootScrollLayer()) 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double monotonic_time = (time - base::TimeTicks()).InSecondsF(); 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() + 2271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootScrollLayer()->ScrollDelta(); 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->SetPageScaleDelta( 22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_->PageScaleFactorAtTime(monotonic_time) / 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_tree_->page_scale_factor()); 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF next_scroll = 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_->ScrollOffsetAtTime(monotonic_time); 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RootScrollLayer()->ScrollBy(next_scroll - scroll_total); 22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) { 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_scale_animation_.reset(); 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsCommitOnImplThread(); 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RenewTreePriority(); 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!top_controls_manager_ || !RootScrollLayer()) 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF scroll = top_controls_manager_->Animate(time); 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateMaxScrollOffset(); 2294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (RootScrollLayer()->TotalScrollOffset().y() == 0.f) 2295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RootScrollLayer()->ScrollBy(gfx::ScaleVector2d( 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll, 1.f / active_tree_->total_page_scale_factor())); 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time, 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time wall_clock_time) { 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!settings_.accelerated_animation_enabled || 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_->active_animation_controllers().empty() || 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !active_tree_->root_layer()) 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers"); 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_animation_time_ = wall_clock_time; 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double monotonic_seconds = (monotonic_time - base::TimeTicks()).InSecondsF(); 23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimationRegistrar::AnimationControllerMap copy = 23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_->active_animation_controllers(); 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != copy.end(); 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter).second->Animate(monotonic_seconds); 23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!settings_.accelerated_animation_enabled || 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_->active_animation_controllers().empty() || 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !active_tree_->root_layer()) 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState"); 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<AnimationEventsVector> events = 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) make_scoped_ptr(new AnimationEventsVector); 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimationRegistrar::AnimationControllerMap copy = 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_registrar_->active_animation_controllers(); 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); 23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != copy.end(); 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) 2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (*iter).second->UpdateState(start_ready_animations, events.get()); 23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!events->empty()) { 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass(), 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_animation_time_); 23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeDelta LayerTreeHostImpl::LowFrequencyAnimationInterval() const { 23452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta::FromSeconds(1); 23462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LayerTreeHostImpl::SendReleaseResourcesRecursive(LayerImpl* current) { 23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(current); 2350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(boliu): Rename DidLoseOutputSurface to ReleaseResources. 23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current->DidLoseOutputSurface(); 23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current->mask_layer()) 2353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SendReleaseResourcesRecursive(current->mask_layer()); 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current->replica_layer()) 2355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SendReleaseResourcesRecursive(current->replica_layer()); 23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < current->children().size(); ++i) 2357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SendReleaseResourcesRecursive(current->children()[i]); 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string LayerTreeHostImpl::LayerTreeAsJson() const { 23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string str; 23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_tree_->root_layer()) { 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson()); 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONWriter::WriteWithOptions( 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return str; 23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int LayerTreeHostImpl::SourceAnimationFrameNumber() const { 23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fps_counter_->current_frame_number(); 23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SendManagedMemoryStats( 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_visible_bytes, 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_visible_and_nearby_bytes, 23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_use_bytes) { 23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!renderer_) 23792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Round the numbers being sent up to the next 8MB, to throttle the rate 23822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // at which we spam the GPU process. 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const size_t rounding_step = 8 * 1024 * 1024; 23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_visible_bytes = RoundUp(memory_visible_bytes, rounding_step); 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_visible_and_nearby_bytes = RoundUp(memory_visible_and_nearby_bytes, 23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rounding_step); 23872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_use_bytes = RoundUp(memory_use_bytes, rounding_step); 23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_sent_memory_visible_bytes_ == memory_visible_bytes && 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_and_nearby_bytes_ == 23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_visible_and_nearby_bytes && 23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_use_bytes_ == memory_use_bytes) { 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 23932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_bytes_ = memory_visible_bytes; 23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_and_nearby_bytes_ = memory_visible_and_nearby_bytes; 23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_use_bytes_ = memory_use_bytes; 23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_->SendManagedMemoryStats(last_sent_memory_visible_bytes_, 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_visible_and_nearby_bytes_, 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_memory_use_bytes_); 24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateScrollbars(base::TimeTicks time) { 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateScrollbarsRecursive(active_tree_->root_layer(), time); 24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::AnimateScrollbarsRecursive(LayerImpl* layer, 24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks time) { 24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer) 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarAnimationController* scrollbar_controller = 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->scrollbar_animation_controller(); 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scrollbar_controller && scrollbar_controller->Animate(time)) { 24152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_INSTANT0( 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "cc", "LayerTreeHostImpl::SetNeedsRedraw due to AnimateScrollbars", 2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 24192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) 24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimateScrollbarsRecursive(layer->children()[i], time); 24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void LayerTreeHostImpl::StartScrollbarAnimation() { 24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("cc", "LayerTreeHostImpl::StartScrollbarAnimation"); 24277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) StartScrollbarAnimationRecursive(RootLayer(), CurrentPhysicalTimeTicks()); 24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::StartScrollbarAnimationRecursive(LayerImpl* layer, 24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks time) { 24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer) 24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarAnimationController* scrollbar_controller = 24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->scrollbar_animation_controller(); 24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scrollbar_controller && scrollbar_controller->IsAnimating()) { 24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta delay = scrollbar_controller->DelayBeforeStart(time); 24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delay > base::TimeDelta()) 24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->RequestScrollbarAnimationOnImplThread(delay); 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (scrollbar_controller->Animate(time)) 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->SetNeedsRedrawOnImplThread(); 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < layer->children().size(); ++i) 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartScrollbarAnimationRecursive(layer->children()[i], time); 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostImpl::SetTreePriority(TreePriority priority) { 24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tile_manager_) 24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GlobalStateThatImpactsTilePriority new_state(tile_manager_->GlobalState()); 24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_state.tree_priority == priority) 24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state.tree_priority = priority; 24582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_manager_->SetGlobalState(new_state); 2459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manage_tiles_needed_ = true; 24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 246290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LayerTreeHostImpl::ResetCurrentFrameTimeForNextFrame() { 2463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_frame_timeticks_ = base::TimeTicks(); 2464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_frame_time_ = base::Time(); 2465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void LayerTreeHostImpl::UpdateCurrentFrameTime(base::TimeTicks* ticks, 24687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time* now) const { 2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ticks->is_null()) { 2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(now->is_null()); 24717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *ticks = CurrentPhysicalTimeTicks(); 2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *now = base::Time::Now(); 2473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::TimeTicks LayerTreeHostImpl::CurrentFrameTimeTicks() { 2477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateCurrentFrameTime(¤t_frame_timeticks_, ¤t_frame_time_); 2478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return current_frame_timeticks_; 24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::Time LayerTreeHostImpl::CurrentFrameTime() { 2482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateCurrentFrameTime(¤t_frame_timeticks_, ¤t_frame_time_); 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_frame_time_; 24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::TimeTicks LayerTreeHostImpl::CurrentPhysicalTimeTicks() const { 24877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return base::TimeTicks::Now(); 24887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 24897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 24904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochscoped_ptr<base::Value> LayerTreeHostImpl::AsValueWithFrame( 24914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch FrameData* frame) const { 24922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 2493b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (this->pending_tree_) 2494b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("activation_state", ActivationStateAsValue().release()); 2495b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("device_viewport_size", 2496b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MathUtil::AsValue(device_viewport_size_).release()); 2497b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (tile_manager_) 2498b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("tiles", tile_manager_->AllTilesAsValue().release()); 2499b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("active_tree", active_tree_->AsValue().release()); 2500b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (pending_tree_) 2501b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("pending_tree", pending_tree_->AsValue().release()); 25024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (frame) 25034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch state->Set("frame", frame->AsValue().release()); 25042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state.PassAs<base::Value>(); 25052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> LayerTreeHostImpl::ActivationStateAsValue() const { 25082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 2509b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) state->Set("lthi", TracedValue::CreateIDRef(this).release()); 251090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (tile_manager_) 251190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) state->Set("tile_manager", tile_manager_->BasicStateAsValue().release()); 25122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state.PassAs<base::Value>(); 25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LayerTreeHostImpl::SetDebugState( 25167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const LayerTreeDebugState& new_debug_state) { 25177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (LayerTreeDebugState::Equal(debug_state_, new_debug_state)) 25187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 25197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (debug_state_.continuous_painting != new_debug_state.continuous_painting) 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_time_counter_->ClearHistory(); 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch debug_state_ = new_debug_state; 25237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetFullRootLayerDamage(); 25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2526a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeHostImpl::CreateUIResource( 2527a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId uid, 2528a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<UIResourceBitmap> bitmap) { 2529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK_GT(uid, 0); 2530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK_EQ(bitmap->GetFormat(), UIResourceBitmap::RGBA8); 2531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Allow for multiple creation requests with the same UIResourceId. The 2533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // previous resource is simply deleted. 2534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResourceProvider::ResourceId id = ResourceIdForUIResource(uid); 2535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (id) 2536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DeleteUIResource(uid); 2537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) id = resource_provider_->CreateResource( 2538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bitmap->GetSize(), GL_RGBA, ResourceProvider::TextureUsageAny); 2539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_map_[uid] = id; 2541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) resource_provider_->SetPixels(id, 2542a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) reinterpret_cast<uint8_t*>(bitmap->GetPixels()), 2543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::Rect(bitmap->GetSize()), 2544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::Rect(bitmap->GetSize()), 2545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::Vector2d(0, 0)); 2546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LayerTreeHostImpl::DeleteUIResource(UIResourceId uid) { 2549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResourceProvider::ResourceId id = ResourceIdForUIResource(uid); 2550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (id) { 2551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) resource_provider_->DeleteResource(id); 2552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_map_.erase(uid); 2553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( 2557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId uid) const { 2558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); 2559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (iter != ui_resource_map_.end()) 2560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return iter->second; 2561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return 0; 2562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 25642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 2565