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