| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 paint_time_counter_(PaintTimeCounter::Create()), | 243 paint_time_counter_(PaintTimeCounter::Create()), |
| 244 memory_history_(MemoryHistory::Create()), | 244 memory_history_(MemoryHistory::Create()), |
| 245 debug_rect_history_(DebugRectHistory::Create()), | 245 debug_rect_history_(DebugRectHistory::Create()), |
| 246 texture_mailbox_deleter_(new TextureMailboxDeleter( | 246 texture_mailbox_deleter_(new TextureMailboxDeleter( |
| 247 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 247 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
| 248 : proxy_->MainThreadTaskRunner())), | 248 : proxy_->MainThreadTaskRunner())), |
| 249 max_memory_needed_bytes_(0), | 249 max_memory_needed_bytes_(0), |
| 250 zero_budget_(false), | 250 zero_budget_(false), |
| 251 device_scale_factor_(1.f), | 251 device_scale_factor_(1.f), |
| 252 overhang_ui_resource_id_(0), | 252 overhang_ui_resource_id_(0), |
| 253 overdraw_bottom_height_(0.f), | 253 top_controls_layout_height_(0.f), |
| 254 resourceless_software_draw_(false), | 254 resourceless_software_draw_(false), |
| 255 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), | 255 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), |
| 256 animation_registrar_(AnimationRegistrar::Create()), | 256 animation_registrar_(AnimationRegistrar::Create()), |
| 257 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 257 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 258 micro_benchmark_controller_(this), | 258 micro_benchmark_controller_(this), |
| 259 need_to_update_visible_tiles_before_draw_(false), | 259 need_to_update_visible_tiles_before_draw_(false), |
| 260 have_valid_output_surface_(false), | 260 have_valid_output_surface_(false), |
| 261 shared_bitmap_manager_(manager), | 261 shared_bitmap_manager_(manager), |
| 262 id_(id), | 262 id_(id), |
| 263 transfer_buffer_memory_limit_(0u) { | 263 transfer_buffer_memory_limit_(0u) { |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 void LayerTreeHostImpl::StartPageScaleAnimation( | 428 void LayerTreeHostImpl::StartPageScaleAnimation( |
| 429 const gfx::Vector2d& target_offset, | 429 const gfx::Vector2d& target_offset, |
| 430 bool anchor_point, | 430 bool anchor_point, |
| 431 float page_scale, | 431 float page_scale, |
| 432 base::TimeDelta duration) { | 432 base::TimeDelta duration) { |
| 433 if (!InnerViewportScrollLayer()) | 433 if (!InnerViewportScrollLayer()) |
| 434 return; | 434 return; |
| 435 | 435 |
| 436 gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset(); | 436 gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset(); |
| 437 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); | 437 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); |
| 438 gfx::SizeF viewport_size = UnscaledScrollableViewportSize(); | 438 gfx::SizeF viewport_size = |
| 439 active_tree_->InnerViewportContainerLayer()->bounds(); |
| 439 | 440 |
| 440 // Easing constants experimentally determined. | 441 // Easing constants experimentally determined. |
| 441 scoped_ptr<TimingFunction> timing_function = | 442 scoped_ptr<TimingFunction> timing_function = |
| 442 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); | 443 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); |
| 443 | 444 |
| 444 page_scale_animation_ = | 445 page_scale_animation_ = |
| 445 PageScaleAnimation::Create(scroll_total, | 446 PageScaleAnimation::Create(scroll_total, |
| 446 active_tree_->total_page_scale_factor(), | 447 active_tree_->total_page_scale_factor(), |
| 447 viewport_size, | 448 viewport_size, |
| 448 scaled_scrollable_size, | 449 scaled_scrollable_size, |
| (...skipping 1013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1462 metadata.page_scale_factor = active_tree_->total_page_scale_factor(); | 1463 metadata.page_scale_factor = active_tree_->total_page_scale_factor(); |
| 1463 metadata.scrollable_viewport_size = active_tree_->ScrollableViewportSize(); | 1464 metadata.scrollable_viewport_size = active_tree_->ScrollableViewportSize(); |
| 1464 metadata.root_layer_size = active_tree_->ScrollableSize(); | 1465 metadata.root_layer_size = active_tree_->ScrollableSize(); |
| 1465 metadata.min_page_scale_factor = active_tree_->min_page_scale_factor(); | 1466 metadata.min_page_scale_factor = active_tree_->min_page_scale_factor(); |
| 1466 metadata.max_page_scale_factor = active_tree_->max_page_scale_factor(); | 1467 metadata.max_page_scale_factor = active_tree_->max_page_scale_factor(); |
| 1467 if (top_controls_manager_) { | 1468 if (top_controls_manager_) { |
| 1468 metadata.location_bar_offset = | 1469 metadata.location_bar_offset = |
| 1469 gfx::Vector2dF(0.f, top_controls_manager_->controls_top_offset()); | 1470 gfx::Vector2dF(0.f, top_controls_manager_->controls_top_offset()); |
| 1470 metadata.location_bar_content_translation = | 1471 metadata.location_bar_content_translation = |
| 1471 gfx::Vector2dF(0.f, top_controls_manager_->content_top_offset()); | 1472 gfx::Vector2dF(0.f, top_controls_manager_->content_top_offset()); |
| 1472 metadata.overdraw_bottom_height = overdraw_bottom_height_; | |
| 1473 } | 1473 } |
| 1474 | 1474 |
| 1475 active_tree_->GetViewportSelection(&metadata.selection_start, | 1475 active_tree_->GetViewportSelection(&metadata.selection_start, |
| 1476 &metadata.selection_end); | 1476 &metadata.selection_end); |
| 1477 | 1477 |
| 1478 if (!InnerViewportScrollLayer()) | 1478 if (!InnerViewportScrollLayer()) |
| 1479 return metadata; | 1479 return metadata; |
| 1480 | 1480 |
| 1481 metadata.root_scroll_offset = active_tree_->TotalScrollOffset(); | 1481 metadata.root_scroll_offset = active_tree_->TotalScrollOffset(); |
| 1482 | 1482 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1675 } | 1675 } |
| 1676 | 1676 |
| 1677 void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { | 1677 void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { |
| 1678 // Sample the frame time now. This time will be used for updating animations | 1678 // Sample the frame time now. This time will be used for updating animations |
| 1679 // when we draw. | 1679 // when we draw. |
| 1680 UpdateCurrentFrameTime(); | 1680 UpdateCurrentFrameTime(); |
| 1681 // Cache the begin impl frame interval | 1681 // Cache the begin impl frame interval |
| 1682 begin_impl_frame_interval_ = args.interval; | 1682 begin_impl_frame_interval_ = args.interval; |
| 1683 } | 1683 } |
| 1684 | 1684 |
| 1685 gfx::SizeF LayerTreeHostImpl::ComputeInnerViewportContainerSize() const { | |
| 1686 gfx::SizeF dip_size = | |
| 1687 gfx::ScaleSize(device_viewport_size_, 1.f / device_scale_factor()); | |
| 1688 | |
| 1689 float top_offset = | |
| 1690 top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; | |
| 1691 | |
| 1692 return gfx::SizeF(dip_size.width(), | |
| 1693 dip_size.height() - top_offset - overdraw_bottom_height_); | |
| 1694 } | |
| 1695 | |
| 1696 void LayerTreeHostImpl::UpdateInnerViewportContainerSize() { | 1685 void LayerTreeHostImpl::UpdateInnerViewportContainerSize() { |
| 1697 LayerImpl* container_layer = active_tree_->InnerViewportContainerLayer(); | 1686 LayerImpl* container_layer = active_tree_->InnerViewportContainerLayer(); |
| 1698 if (!container_layer) | 1687 if (!container_layer) |
| 1699 return; | 1688 return; |
| 1700 | 1689 |
| 1701 // We pass the value returned from UnscaledScrollableViewportSize() here as | 1690 if (top_controls_manager_) |
| 1702 // it accounts for scrollbar dimensions when | 1691 container_layer->SetBoundsDelta( |
| 1703 // container_layer->masks_to_bounds() is set. | 1692 gfx::Vector2dF(0, |
| 1704 container_layer->SetTemporaryImplBounds(UnscaledScrollableViewportSize()); | 1693 top_controls_layout_height_ - |
| 1705 } | 1694 top_controls_manager_->content_top_offset())); |
| 1706 | |
| 1707 gfx::SizeF LayerTreeHostImpl::UnscaledScrollableViewportSize() const { | |
| 1708 // Use the root container layer bounds if it clips to them, otherwise, the | |
| 1709 // true viewport size should be used. | |
| 1710 LayerImpl* container_layer = active_tree_->InnerViewportContainerLayer(); | |
| 1711 if (container_layer && container_layer->masks_to_bounds()) { | |
| 1712 DCHECK(!top_controls_manager_); | |
| 1713 DCHECK_EQ(0, overdraw_bottom_height_); | |
| 1714 return container_layer->bounds(); | |
| 1715 } | |
| 1716 | |
| 1717 return ComputeInnerViewportContainerSize(); | |
| 1718 } | |
| 1719 | |
| 1720 float LayerTreeHostImpl::VerticalAdjust() const { | |
| 1721 if (!active_tree_->InnerViewportContainerLayer()) | |
| 1722 return 0; | |
| 1723 | |
| 1724 return active_tree_->InnerViewportContainerLayer()->BoundsDelta().y(); | |
| 1725 } | 1695 } |
| 1726 | 1696 |
| 1727 void LayerTreeHostImpl::DidLoseOutputSurface() { | 1697 void LayerTreeHostImpl::DidLoseOutputSurface() { |
| 1728 if (!have_valid_output_surface_) | 1698 if (!have_valid_output_surface_) |
| 1729 return; | 1699 return; |
| 1730 have_valid_output_surface_ = false; | 1700 have_valid_output_surface_ = false; |
| 1731 if (resource_provider_) | 1701 if (resource_provider_) |
| 1732 resource_provider_->DidLoseOutputSurface(); | 1702 resource_provider_->DidLoseOutputSurface(); |
| 1733 // TODO(jamesr): The renderer_ check is needed to make some of the | 1703 // TODO(jamesr): The renderer_ check is needed to make some of the |
| 1734 // LayerTreeHostContextTest tests pass, but shouldn't be necessary (or | 1704 // LayerTreeHostContextTest tests pass, but shouldn't be necessary (or |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2191 active_tree_->SetViewportSizeInvalid(); | 2161 active_tree_->SetViewportSizeInvalid(); |
| 2192 | 2162 |
| 2193 device_viewport_size_ = device_viewport_size; | 2163 device_viewport_size_ = device_viewport_size; |
| 2194 | 2164 |
| 2195 UpdateInnerViewportContainerSize(); | 2165 UpdateInnerViewportContainerSize(); |
| 2196 client_->OnCanDrawStateChanged(CanDraw()); | 2166 client_->OnCanDrawStateChanged(CanDraw()); |
| 2197 SetFullRootLayerDamage(); | 2167 SetFullRootLayerDamage(); |
| 2198 active_tree_->set_needs_update_draw_properties(); | 2168 active_tree_->set_needs_update_draw_properties(); |
| 2199 } | 2169 } |
| 2200 | 2170 |
| 2201 void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) { | 2171 void LayerTreeHostImpl::SetTopControlsLayoutHeight( |
| 2202 if (overdraw_bottom_height == overdraw_bottom_height_) | 2172 float top_controls_layout_height) { |
| 2173 if (top_controls_layout_height_ == top_controls_layout_height) |
| 2203 return; | 2174 return; |
| 2204 overdraw_bottom_height_ = overdraw_bottom_height; | 2175 top_controls_layout_height_ = top_controls_layout_height; |
| 2205 | 2176 |
| 2206 UpdateInnerViewportContainerSize(); | 2177 UpdateInnerViewportContainerSize(); |
| 2207 SetFullRootLayerDamage(); | 2178 SetFullRootLayerDamage(); |
| 2208 } | 2179 } |
| 2209 | 2180 |
| 2210 void LayerTreeHostImpl::SetOverhangUIResource( | 2181 void LayerTreeHostImpl::SetOverhangUIResource( |
| 2211 UIResourceId overhang_ui_resource_id, | 2182 UIResourceId overhang_ui_resource_id, |
| 2212 const gfx::Size& overhang_ui_resource_size) { | 2183 const gfx::Size& overhang_ui_resource_size) { |
| 2213 overhang_ui_resource_id_ = overhang_ui_resource_id; | 2184 overhang_ui_resource_id_ = overhang_ui_resource_id; |
| 2214 overhang_ui_resource_size_ = overhang_ui_resource_size; | 2185 overhang_ui_resource_size_ = overhang_ui_resource_size; |
| 2215 } | 2186 } |
| 2216 | 2187 |
| 2217 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { | 2188 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { |
| 2218 if (device_scale_factor == device_scale_factor_) | 2189 if (device_scale_factor == device_scale_factor_) |
| 2219 return; | 2190 return; |
| 2220 device_scale_factor_ = device_scale_factor; | 2191 device_scale_factor_ = device_scale_factor; |
| 2221 | 2192 |
| 2222 UpdateInnerViewportContainerSize(); | |
| 2223 SetFullRootLayerDamage(); | 2193 SetFullRootLayerDamage(); |
| 2224 } | 2194 } |
| 2225 | 2195 |
| 2226 const gfx::Rect LayerTreeHostImpl::ViewportRectForTilePriority() const { | 2196 const gfx::Rect LayerTreeHostImpl::ViewportRectForTilePriority() const { |
| 2227 if (viewport_rect_for_tile_priority_.IsEmpty()) | 2197 if (viewport_rect_for_tile_priority_.IsEmpty()) |
| 2228 return DeviceViewport(); | 2198 return DeviceViewport(); |
| 2229 | 2199 |
| 2230 return viewport_rect_for_tile_priority_; | 2200 return viewport_rect_for_tile_priority_; |
| 2231 } | 2201 } |
| 2232 | 2202 |
| (...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3406 } | 3376 } |
| 3407 | 3377 |
| 3408 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3378 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
| 3409 std::vector<PictureLayerImpl*>::iterator it = | 3379 std::vector<PictureLayerImpl*>::iterator it = |
| 3410 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3380 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
| 3411 DCHECK(it != picture_layers_.end()); | 3381 DCHECK(it != picture_layers_.end()); |
| 3412 picture_layers_.erase(it); | 3382 picture_layers_.erase(it); |
| 3413 } | 3383 } |
| 3414 | 3384 |
| 3415 } // namespace cc | 3385 } // namespace cc |
| OLD | NEW |