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 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 memory_history_(MemoryHistory::Create()), | 190 memory_history_(MemoryHistory::Create()), |
191 debug_rect_history_(DebugRectHistory::Create()), | 191 debug_rect_history_(DebugRectHistory::Create()), |
192 max_memory_needed_bytes_(0), | 192 max_memory_needed_bytes_(0), |
193 last_sent_memory_visible_bytes_(0), | 193 last_sent_memory_visible_bytes_(0), |
194 last_sent_memory_visible_and_nearby_bytes_(0), | 194 last_sent_memory_visible_and_nearby_bytes_(0), |
195 last_sent_memory_use_bytes_(0), | 195 last_sent_memory_use_bytes_(0), |
196 zero_budget_(false), | 196 zero_budget_(false), |
197 device_scale_factor_(1.f), | 197 device_scale_factor_(1.f), |
198 overhang_ui_resource_id_(0), | 198 overhang_ui_resource_id_(0), |
199 overdraw_bottom_height_(0.f), | 199 overdraw_bottom_height_(0.f), |
| 200 device_viewport_valid_for_tile_management_(true), |
200 external_stencil_test_enabled_(false), | 201 external_stencil_test_enabled_(false), |
201 animation_registrar_(AnimationRegistrar::Create()), | 202 animation_registrar_(AnimationRegistrar::Create()), |
202 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 203 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
203 need_to_update_visible_tiles_before_draw_(false) { | 204 need_to_update_visible_tiles_before_draw_(false) { |
204 DCHECK(proxy_->IsImplThread()); | 205 DCHECK(proxy_->IsImplThread()); |
205 DidVisibilityChange(this, visible_); | 206 DidVisibilityChange(this, visible_); |
206 | 207 |
207 SetDebugState(settings.initial_debug_state); | 208 SetDebugState(settings.initial_debug_state); |
208 | 209 |
209 if (settings.calculate_top_controls_position) { | 210 if (settings.calculate_top_controls_position) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967. | 287 // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967. |
287 if (!active_tree_->root_layer()) { | 288 if (!active_tree_->root_layer()) { |
288 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", | 289 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", |
289 TRACE_EVENT_SCOPE_THREAD); | 290 TRACE_EVENT_SCOPE_THREAD); |
290 return false; | 291 return false; |
291 } | 292 } |
292 | 293 |
293 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 294 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) |
294 return true; | 295 return true; |
295 | 296 |
296 if (device_viewport_size_.IsEmpty()) { | 297 if (DrawViewportSize().IsEmpty()) { |
297 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", | 298 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", |
298 TRACE_EVENT_SCOPE_THREAD); | 299 TRACE_EVENT_SCOPE_THREAD); |
299 return false; | 300 return false; |
300 } | 301 } |
301 if (active_tree_->ViewportSizeInvalid()) { | 302 if (active_tree_->ViewportSizeInvalid()) { |
302 TRACE_EVENT_INSTANT0( | 303 TRACE_EVENT_INSTANT0( |
303 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", | 304 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", |
304 TRACE_EVENT_SCOPE_THREAD); | 305 TRACE_EVENT_SCOPE_THREAD); |
305 return false; | 306 return false; |
306 } | 307 } |
(...skipping 14 matching lines...) Expand all Loading... |
321 AnimateLayers(monotonic_time, wall_clock_time); | 322 AnimateLayers(monotonic_time, wall_clock_time); |
322 AnimateScrollbars(monotonic_time); | 323 AnimateScrollbars(monotonic_time); |
323 AnimateTopControls(monotonic_time); | 324 AnimateTopControls(monotonic_time); |
324 } | 325 } |
325 | 326 |
326 void LayerTreeHostImpl::ManageTiles() { | 327 void LayerTreeHostImpl::ManageTiles() { |
327 if (!tile_manager_) | 328 if (!tile_manager_) |
328 return; | 329 return; |
329 if (!manage_tiles_needed_) | 330 if (!manage_tiles_needed_) |
330 return; | 331 return; |
| 332 if (!device_viewport_valid_for_tile_management_) |
| 333 return; |
| 334 |
331 manage_tiles_needed_ = false; | 335 manage_tiles_needed_ = false; |
332 tile_manager_->ManageTiles(); | 336 tile_manager_->ManageTiles(); |
333 | 337 |
334 size_t memory_required_bytes; | 338 size_t memory_required_bytes; |
335 size_t memory_nice_to_have_bytes; | 339 size_t memory_nice_to_have_bytes; |
336 size_t memory_allocated_bytes; | 340 size_t memory_allocated_bytes; |
337 size_t memory_used_bytes; | 341 size_t memory_used_bytes; |
338 tile_manager_->GetMemoryStats(&memory_required_bytes, | 342 tile_manager_->GetMemoryStats(&memory_required_bytes, |
339 &memory_nice_to_have_bytes, | 343 &memory_nice_to_have_bytes, |
340 &memory_allocated_bytes, | 344 &memory_allocated_bytes, |
341 &memory_used_bytes); | 345 &memory_used_bytes); |
342 SendManagedMemoryStats(memory_required_bytes, | 346 SendManagedMemoryStats(memory_required_bytes, |
343 memory_nice_to_have_bytes, | 347 memory_nice_to_have_bytes, |
344 memory_used_bytes); | 348 memory_used_bytes); |
345 } | 349 } |
346 | 350 |
347 void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset, | 351 void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset, |
348 bool anchor_point, | 352 bool anchor_point, |
349 float page_scale, | 353 float page_scale, |
350 base::TimeTicks start_time, | 354 base::TimeTicks start_time, |
351 base::TimeDelta duration) { | 355 base::TimeDelta duration) { |
352 if (!RootScrollLayer()) | 356 if (!RootScrollLayer()) |
353 return; | 357 return; |
354 | 358 |
355 gfx::Vector2dF scroll_total = | 359 gfx::Vector2dF scroll_total = |
356 RootScrollLayer()->scroll_offset() + RootScrollLayer()->ScrollDelta(); | 360 RootScrollLayer()->scroll_offset() + RootScrollLayer()->ScrollDelta(); |
357 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); | 361 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); |
358 gfx::SizeF viewport_size = VisibleViewportSize(); | 362 gfx::SizeF viewport_size = UnscaledScrollableViewportSize(); |
359 | 363 |
360 double start_time_seconds = (start_time - base::TimeTicks()).InSecondsF(); | 364 double start_time_seconds = (start_time - base::TimeTicks()).InSecondsF(); |
361 | 365 |
362 // Easing constants experimentally determined. | 366 // Easing constants experimentally determined. |
363 scoped_ptr<TimingFunction> timing_function = | 367 scoped_ptr<TimingFunction> timing_function = |
364 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); | 368 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); |
365 | 369 |
366 page_scale_animation_ = | 370 page_scale_animation_ = |
367 PageScaleAnimation::Create(scroll_total, | 371 PageScaleAnimation::Create(scroll_total, |
368 active_tree_->total_page_scale_factor(), | 372 active_tree_->total_page_scale_factor(), |
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1180 old_policy.priority_cutoff_when_visible) { | 1184 old_policy.priority_cutoff_when_visible) { |
1181 needs_commit = false; | 1185 needs_commit = false; |
1182 } | 1186 } |
1183 | 1187 |
1184 if (needs_commit) | 1188 if (needs_commit) |
1185 client_->SetNeedsCommitOnImplThread(); | 1189 client_->SetNeedsCommitOnImplThread(); |
1186 } | 1190 } |
1187 | 1191 |
1188 void LayerTreeHostImpl::SetExternalDrawConstraints( | 1192 void LayerTreeHostImpl::SetExternalDrawConstraints( |
1189 const gfx::Transform& transform, | 1193 const gfx::Transform& transform, |
1190 gfx::Rect viewport) { | 1194 gfx::Rect viewport, |
| 1195 gfx::Rect clip, |
| 1196 bool valid_for_tile_management) { |
1191 external_transform_ = transform; | 1197 external_transform_ = transform; |
1192 external_viewport_ = viewport; | 1198 external_viewport_ = viewport; |
| 1199 external_clip_ = clip; |
| 1200 device_viewport_valid_for_tile_management_ = valid_for_tile_management; |
1193 } | 1201 } |
1194 | 1202 |
1195 void LayerTreeHostImpl::SetExternalStencilTest(bool enabled) { | 1203 void LayerTreeHostImpl::SetExternalStencilTest(bool enabled) { |
1196 external_stencil_test_enabled_ = enabled; | 1204 external_stencil_test_enabled_ = enabled; |
1197 } | 1205 } |
1198 | 1206 |
1199 void LayerTreeHostImpl::SetNeedsRedrawRect(gfx::Rect damage_rect) { | 1207 void LayerTreeHostImpl::SetNeedsRedrawRect(gfx::Rect damage_rect) { |
1200 client_->SetNeedsRedrawRectOnImplThread(damage_rect); | 1208 client_->SetNeedsRedrawRectOnImplThread(damage_rect); |
1201 } | 1209 } |
1202 | 1210 |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1383 | 1391 |
1384 void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) { | 1392 void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) { |
1385 if (output_surface_) | 1393 if (output_surface_) |
1386 output_surface_->SetNeedsBeginFrame(enable); | 1394 output_surface_->SetNeedsBeginFrame(enable); |
1387 } | 1395 } |
1388 | 1396 |
1389 float LayerTreeHostImpl::DeviceScaleFactor() const { | 1397 float LayerTreeHostImpl::DeviceScaleFactor() const { |
1390 return device_scale_factor_; | 1398 return device_scale_factor_; |
1391 } | 1399 } |
1392 | 1400 |
1393 gfx::SizeF LayerTreeHostImpl::VisibleViewportSize() const { | 1401 gfx::SizeF LayerTreeHostImpl::UnscaledScrollableViewportSize() const { |
1394 // The container layer bounds should be used if non-overlay scrollbars may | 1402 // The container layer bounds should be used if non-overlay scrollbars may |
1395 // exist since it adjusts for them. | 1403 // exist since it adjusts for them. |
1396 LayerImpl* container_layer = active_tree_->RootContainerLayer(); | 1404 LayerImpl* container_layer = active_tree_->RootContainerLayer(); |
1397 if (!Settings().solid_color_scrollbars && container_layer) { | 1405 if (!Settings().solid_color_scrollbars && container_layer) { |
1398 DCHECK(!top_controls_manager_); | 1406 DCHECK(!top_controls_manager_); |
1399 DCHECK_EQ(0, overdraw_bottom_height_); | 1407 DCHECK_EQ(0, overdraw_bottom_height_); |
1400 return container_layer->bounds(); | 1408 return container_layer->bounds(); |
1401 } | 1409 } |
1402 | 1410 |
1403 gfx::SizeF dip_size = | 1411 gfx::SizeF dip_size = |
1404 gfx::ScaleSize(device_viewport_size(), 1.f / device_scale_factor()); | 1412 gfx::ScaleSize(device_viewport_size_, 1.f / device_scale_factor()); |
1405 | 1413 |
1406 float top_offset = | 1414 float top_offset = |
1407 top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; | 1415 top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; |
1408 return gfx::SizeF(dip_size.width(), | 1416 return gfx::SizeF(dip_size.width(), |
1409 dip_size.height() - top_offset - overdraw_bottom_height_); | 1417 dip_size.height() - top_offset - overdraw_bottom_height_); |
1410 } | 1418 } |
1411 | 1419 |
1412 const LayerTreeSettings& LayerTreeHostImpl::Settings() const { | 1420 const LayerTreeSettings& LayerTreeHostImpl::Settings() const { |
1413 return settings(); | 1421 return settings(); |
1414 } | 1422 } |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1789 | 1797 |
1790 SetOffscreenContextProvider(NULL); | 1798 SetOffscreenContextProvider(NULL); |
1791 | 1799 |
1792 client_->SetNeedsCommitOnImplThread(); | 1800 client_->SetNeedsCommitOnImplThread(); |
1793 } | 1801 } |
1794 | 1802 |
1795 void LayerTreeHostImpl::SetViewportSize(gfx::Size device_viewport_size) { | 1803 void LayerTreeHostImpl::SetViewportSize(gfx::Size device_viewport_size) { |
1796 if (device_viewport_size == device_viewport_size_) | 1804 if (device_viewport_size == device_viewport_size_) |
1797 return; | 1805 return; |
1798 | 1806 |
1799 if (pending_tree_ && device_viewport_size_ != device_viewport_size) | 1807 if (pending_tree_) |
1800 active_tree_->SetViewportSizeInvalid(); | 1808 active_tree_->SetViewportSizeInvalid(); |
1801 | 1809 |
1802 device_viewport_size_ = device_viewport_size; | 1810 device_viewport_size_ = device_viewport_size; |
1803 | 1811 |
1804 UpdateMaxScrollOffset(); | 1812 UpdateMaxScrollOffset(); |
1805 | 1813 |
1806 if (renderer_) | 1814 if (renderer_) |
1807 renderer_->ViewportChanged(); | 1815 renderer_->ViewportChanged(); |
1808 | 1816 |
1809 client_->OnCanDrawStateChanged(CanDraw()); | 1817 client_->OnCanDrawStateChanged(CanDraw()); |
(...skipping 21 matching lines...) Expand all Loading... |
1831 return; | 1839 return; |
1832 device_scale_factor_ = device_scale_factor; | 1840 device_scale_factor_ = device_scale_factor; |
1833 | 1841 |
1834 if (renderer_) | 1842 if (renderer_) |
1835 renderer_->ViewportChanged(); | 1843 renderer_->ViewportChanged(); |
1836 | 1844 |
1837 UpdateMaxScrollOffset(); | 1845 UpdateMaxScrollOffset(); |
1838 SetFullRootLayerDamage(); | 1846 SetFullRootLayerDamage(); |
1839 } | 1847 } |
1840 | 1848 |
| 1849 gfx::Size LayerTreeHostImpl::DrawViewportSize() const { |
| 1850 return DeviceViewport().size(); |
| 1851 } |
| 1852 |
1841 gfx::Rect LayerTreeHostImpl::DeviceViewport() const { | 1853 gfx::Rect LayerTreeHostImpl::DeviceViewport() const { |
1842 if (external_viewport_.IsEmpty()) | 1854 if (external_viewport_.IsEmpty()) |
1843 return gfx::Rect(device_viewport_size_); | 1855 return gfx::Rect(device_viewport_size_); |
1844 | 1856 |
1845 return external_viewport_; | 1857 return external_viewport_; |
1846 } | 1858 } |
1847 | 1859 |
1848 const gfx::Transform& LayerTreeHostImpl::DeviceTransform() const { | 1860 gfx::Rect LayerTreeHostImpl::DeviceClip() const { |
| 1861 if (external_clip_.IsEmpty()) |
| 1862 return DeviceViewport(); |
| 1863 |
| 1864 return external_clip_; |
| 1865 } |
| 1866 |
| 1867 const gfx::Transform& LayerTreeHostImpl::DrawTransform() const { |
1849 return external_transform_; | 1868 return external_transform_; |
1850 } | 1869 } |
1851 | 1870 |
1852 void LayerTreeHostImpl::UpdateMaxScrollOffset() { | 1871 void LayerTreeHostImpl::UpdateMaxScrollOffset() { |
1853 active_tree_->UpdateMaxScrollOffset(); | 1872 active_tree_->UpdateMaxScrollOffset(); |
1854 } | 1873 } |
1855 | 1874 |
1856 void LayerTreeHostImpl::DidChangeTopControlsPosition() { | 1875 void LayerTreeHostImpl::DidChangeTopControlsPosition() { |
1857 client_->SetNeedsRedrawOnImplThread(); | 1876 client_->SetNeedsRedrawOnImplThread(); |
1858 active_tree_->set_needs_update_draw_properties(); | 1877 active_tree_->set_needs_update_draw_properties(); |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2291 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); | 2310 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); |
2292 | 2311 |
2293 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); | 2312 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); |
2294 scroll_info->page_scale_delta = active_tree_->page_scale_delta(); | 2313 scroll_info->page_scale_delta = active_tree_->page_scale_delta(); |
2295 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); | 2314 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); |
2296 | 2315 |
2297 return scroll_info.Pass(); | 2316 return scroll_info.Pass(); |
2298 } | 2317 } |
2299 | 2318 |
2300 void LayerTreeHostImpl::SetFullRootLayerDamage() { | 2319 void LayerTreeHostImpl::SetFullRootLayerDamage() { |
2301 SetViewportDamage(gfx::Rect(device_viewport_size_)); | 2320 SetViewportDamage(gfx::Rect(DrawViewportSize())); |
2302 } | 2321 } |
2303 | 2322 |
2304 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { | 2323 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { |
2305 if (!page_scale_animation_ || !RootScrollLayer()) | 2324 if (!page_scale_animation_ || !RootScrollLayer()) |
2306 return; | 2325 return; |
2307 | 2326 |
2308 double monotonic_time = (time - base::TimeTicks()).InSecondsF(); | 2327 double monotonic_time = (time - base::TimeTicks()).InSecondsF(); |
2309 gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() + | 2328 gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() + |
2310 RootScrollLayer()->ScrollDelta(); | 2329 RootScrollLayer()->ScrollDelta(); |
2311 | 2330 |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2611 | 2630 |
2612 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( | 2631 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( |
2613 UIResourceId uid) const { | 2632 UIResourceId uid) const { |
2614 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); | 2633 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); |
2615 if (iter != ui_resource_map_.end()) | 2634 if (iter != ui_resource_map_.end()) |
2616 return iter->second; | 2635 return iter->second; |
2617 return 0; | 2636 return 0; |
2618 } | 2637 } |
2619 | 2638 |
2620 } // namespace cc | 2639 } // namespace cc |
OLD | NEW |