| 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" |
| 11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 12 #include "base/debug/trace_event_argument.h" | |
| 13 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 14 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 15 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
| 16 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 16 #include "base/trace_event/trace_event_argument.h" |
| 17 #include "cc/animation/animation_id_provider.h" | 17 #include "cc/animation/animation_id_provider.h" |
| 18 #include "cc/animation/scroll_offset_animation_curve.h" | 18 #include "cc/animation/scroll_offset_animation_curve.h" |
| 19 #include "cc/animation/scrollbar_animation_controller.h" | 19 #include "cc/animation/scrollbar_animation_controller.h" |
| 20 #include "cc/animation/timing_function.h" | 20 #include "cc/animation/timing_function.h" |
| 21 #include "cc/base/latency_info_swap_promise_monitor.h" | 21 #include "cc/base/latency_info_swap_promise_monitor.h" |
| 22 #include "cc/base/math_util.h" | 22 #include "cc/base/math_util.h" |
| 23 #include "cc/base/util.h" | 23 #include "cc/base/util.h" |
| 24 #include "cc/debug/benchmark_instrumentation.h" | 24 #include "cc/debug/benchmark_instrumentation.h" |
| 25 #include "cc/debug/debug_rect_history.h" | 25 #include "cc/debug/debug_rect_history.h" |
| 26 #include "cc/debug/devtools_instrumentation.h" | 26 #include "cc/debug/devtools_instrumentation.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 namespace cc { | 81 namespace cc { |
| 82 namespace { | 82 namespace { |
| 83 | 83 |
| 84 // Small helper class that saves the current viewport location as the user sees | 84 // Small helper class that saves the current viewport location as the user sees |
| 85 // it and resets to the same location. | 85 // it and resets to the same location. |
| 86 class ViewportAnchor { | 86 class ViewportAnchor { |
| 87 public: | 87 public: |
| 88 ViewportAnchor(LayerImpl* inner_scroll, LayerImpl* outer_scroll) | 88 ViewportAnchor(LayerImpl* inner_scroll, LayerImpl* outer_scroll) |
| 89 : inner_(inner_scroll), | 89 : inner_(inner_scroll), |
| 90 outer_(outer_scroll) { | 90 outer_(outer_scroll) { |
| 91 viewport_in_content_coordinates_ = inner_->TotalScrollOffset(); | 91 viewport_in_content_coordinates_ = inner_->CurrentScrollOffset(); |
| 92 | 92 |
| 93 if (outer_) | 93 if (outer_) |
| 94 viewport_in_content_coordinates_ += outer_->TotalScrollOffset(); | 94 viewport_in_content_coordinates_ += outer_->CurrentScrollOffset(); |
| 95 } | 95 } |
| 96 | 96 |
| 97 void ResetViewportToAnchoredPosition() { | 97 void ResetViewportToAnchoredPosition() { |
| 98 DCHECK(outer_); | 98 DCHECK(outer_); |
| 99 | 99 |
| 100 inner_->ClampScrollToMaxScrollOffset(); | 100 inner_->ClampScrollToMaxScrollOffset(); |
| 101 outer_->ClampScrollToMaxScrollOffset(); | 101 outer_->ClampScrollToMaxScrollOffset(); |
| 102 | 102 |
| 103 gfx::ScrollOffset viewport_location = inner_->TotalScrollOffset() + | 103 gfx::ScrollOffset viewport_location = |
| 104 outer_->TotalScrollOffset(); | 104 inner_->CurrentScrollOffset() + outer_->CurrentScrollOffset(); |
| 105 | 105 |
| 106 gfx::Vector2dF delta = | 106 gfx::Vector2dF delta = |
| 107 viewport_in_content_coordinates_.DeltaFrom(viewport_location); | 107 viewport_in_content_coordinates_.DeltaFrom(viewport_location); |
| 108 | 108 |
| 109 delta = outer_->ScrollBy(delta); | 109 delta = outer_->ScrollBy(delta); |
| 110 inner_->ScrollBy(delta); | 110 inner_->ScrollBy(delta); |
| 111 } | 111 } |
| 112 | 112 |
| 113 private: | 113 private: |
| 114 LayerImpl* inner_; | 114 LayerImpl* inner_; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 device_scale_factor_(1.f), | 222 device_scale_factor_(1.f), |
| 223 resourceless_software_draw_(false), | 223 resourceless_software_draw_(false), |
| 224 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), | 224 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), |
| 225 animation_registrar_(AnimationRegistrar::Create()), | 225 animation_registrar_(AnimationRegistrar::Create()), |
| 226 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 226 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 227 micro_benchmark_controller_(this), | 227 micro_benchmark_controller_(this), |
| 228 shared_bitmap_manager_(shared_bitmap_manager), | 228 shared_bitmap_manager_(shared_bitmap_manager), |
| 229 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 229 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
| 230 id_(id), | 230 id_(id), |
| 231 requires_high_res_to_draw_(false), | 231 requires_high_res_to_draw_(false), |
| 232 required_for_draw_tile_is_top_of_raster_queue_(false) { | 232 is_likely_to_require_a_draw_(false) { |
| 233 DCHECK(proxy_->IsImplThread()); | 233 DCHECK(proxy_->IsImplThread()); |
| 234 DidVisibilityChange(this, visible_); | 234 DidVisibilityChange(this, visible_); |
| 235 animation_registrar_->set_supports_scroll_animations( | 235 animation_registrar_->set_supports_scroll_animations( |
| 236 proxy_->SupportsImplScrolling()); | 236 proxy_->SupportsImplScrolling()); |
| 237 | 237 |
| 238 SetDebugState(settings.initial_debug_state); | 238 SetDebugState(settings.initial_debug_state); |
| 239 | 239 |
| 240 // LTHI always has an active tree. | 240 // LTHI always has an active tree. |
| 241 active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), | 241 active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), |
| 242 new SyncedElasticOverscroll); | 242 new SyncedElasticOverscroll); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 if (!settings_.impl_side_painting && output_surface_) | 298 if (!settings_.impl_side_painting && output_surface_) |
| 299 output_surface_->ForceReclaimResources(); | 299 output_surface_->ForceReclaimResources(); |
| 300 | 300 |
| 301 if (UsePendingTreeForSync()) | 301 if (UsePendingTreeForSync()) |
| 302 CreatePendingTree(); | 302 CreatePendingTree(); |
| 303 } | 303 } |
| 304 | 304 |
| 305 void LayerTreeHostImpl::CommitComplete() { | 305 void LayerTreeHostImpl::CommitComplete() { |
| 306 TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete"); | 306 TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete"); |
| 307 | 307 |
| 308 if (pending_tree_) | |
| 309 pending_tree_->ApplyScrollDeltasSinceBeginMainFrame(); | |
| 310 sync_tree()->set_needs_update_draw_properties(); | 308 sync_tree()->set_needs_update_draw_properties(); |
| 311 | 309 |
| 312 if (settings_.impl_side_painting) { | 310 if (settings_.impl_side_painting) { |
| 313 // Impl-side painting needs an update immediately post-commit to have the | 311 // Impl-side painting needs an update immediately post-commit to have the |
| 314 // opportunity to create tilings. Other paths can call UpdateDrawProperties | 312 // opportunity to create tilings. Other paths can call UpdateDrawProperties |
| 315 // more lazily when needed prior to drawing. | 313 // more lazily when needed prior to drawing. |
| 316 sync_tree()->UpdateDrawProperties(); | 314 sync_tree()->UpdateDrawProperties(); |
| 317 // Start working on newly created tiles immediately if needed. | 315 // Start working on newly created tiles immediately if needed. |
| 318 if (tile_manager_ && tile_priorities_dirty_) | 316 if (tile_manager_ && tile_priorities_dirty_) |
| 319 PrepareTiles(); | 317 PrepareTiles(); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 | 450 |
| 453 LayerImpl* layer_impl = | 451 LayerImpl* layer_impl = |
| 454 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); | 452 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); |
| 455 | 453 |
| 456 bool scroll_on_main_thread = false; | 454 bool scroll_on_main_thread = false; |
| 457 LayerImpl* scrolling_layer_impl = FindScrollLayerForDeviceViewportPoint( | 455 LayerImpl* scrolling_layer_impl = FindScrollLayerForDeviceViewportPoint( |
| 458 device_viewport_point, type, layer_impl, &scroll_on_main_thread, NULL); | 456 device_viewport_point, type, layer_impl, &scroll_on_main_thread, NULL); |
| 459 return CurrentlyScrollingLayer() == scrolling_layer_impl; | 457 return CurrentlyScrollingLayer() == scrolling_layer_impl; |
| 460 } | 458 } |
| 461 | 459 |
| 460 bool LayerTreeHostImpl::HaveWheelEventHandlersAt( |
| 461 const gfx::Point& viewport_point) { |
| 462 gfx::PointF device_viewport_point = |
| 463 gfx::ScalePoint(viewport_point, device_scale_factor_); |
| 464 |
| 465 LayerImpl* layer_impl = |
| 466 active_tree_->FindLayerWithWheelHandlerThatIsHitByPoint( |
| 467 device_viewport_point); |
| 468 |
| 469 return layer_impl != NULL; |
| 470 } |
| 471 |
| 462 bool LayerTreeHostImpl::HaveTouchEventHandlersAt( | 472 bool LayerTreeHostImpl::HaveTouchEventHandlersAt( |
| 463 const gfx::Point& viewport_point) { | 473 const gfx::Point& viewport_point) { |
| 464 | 474 |
| 465 gfx::PointF device_viewport_point = | 475 gfx::PointF device_viewport_point = |
| 466 gfx::ScalePoint(viewport_point, device_scale_factor_); | 476 gfx::ScalePoint(viewport_point, device_scale_factor_); |
| 467 | 477 |
| 468 LayerImpl* layer_impl = | 478 LayerImpl* layer_impl = |
| 469 active_tree_->FindLayerThatIsHitByPointInTouchHandlerRegion( | 479 active_tree_->FindLayerThatIsHitByPointInTouchHandlerRegion( |
| 470 device_viewport_point); | 480 device_viewport_point); |
| 471 | 481 |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 LayerIteratorType::Begin(frame->render_surface_layer_list); | 755 LayerIteratorType::Begin(frame->render_surface_layer_list); |
| 746 it != end; | 756 it != end; |
| 747 ++it) { | 757 ++it) { |
| 748 RenderPassId target_render_pass_id = | 758 RenderPassId target_render_pass_id = |
| 749 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); | 759 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); |
| 750 RenderPass* target_render_pass = | 760 RenderPass* target_render_pass = |
| 751 frame->render_passes_by_id[target_render_pass_id]; | 761 frame->render_passes_by_id[target_render_pass_id]; |
| 752 | 762 |
| 753 occlusion_tracker.EnterLayer(it); | 763 occlusion_tracker.EnterLayer(it); |
| 754 | 764 |
| 755 AppendQuadsData append_quads_data(target_render_pass_id); | 765 AppendQuadsData append_quads_data; |
| 756 | 766 |
| 757 if (it.represents_target_render_surface()) { | 767 if (it.represents_target_render_surface()) { |
| 758 if (it->HasCopyRequest()) { | 768 if (it->HasCopyRequest()) { |
| 759 have_copy_request = true; | 769 have_copy_request = true; |
| 760 it->TakeCopyRequestsAndTransformToTarget( | 770 it->TakeCopyRequestsAndTransformToTarget( |
| 761 &target_render_pass->copy_requests); | 771 &target_render_pass->copy_requests); |
| 762 } | 772 } |
| 763 } else if (it.represents_contributing_render_surface() && | 773 } else if (it.represents_contributing_render_surface() && |
| 764 it->render_surface()->contributes_to_drawn_surface()) { | 774 it->render_surface()->contributes_to_drawn_surface()) { |
| 765 RenderPassId contributing_render_pass_id = | 775 RenderPassId contributing_render_pass_id = |
| (...skipping 16 matching lines...) Expand all Loading... |
| 782 frame->will_draw_layers.push_back(*it); | 792 frame->will_draw_layers.push_back(*it); |
| 783 | 793 |
| 784 if (it->HasContributingDelegatedRenderPasses()) { | 794 if (it->HasContributingDelegatedRenderPasses()) { |
| 785 RenderPassId contributing_render_pass_id = | 795 RenderPassId contributing_render_pass_id = |
| 786 it->FirstContributingRenderPassId(); | 796 it->FirstContributingRenderPassId(); |
| 787 while (frame->render_passes_by_id.find(contributing_render_pass_id) != | 797 while (frame->render_passes_by_id.find(contributing_render_pass_id) != |
| 788 frame->render_passes_by_id.end()) { | 798 frame->render_passes_by_id.end()) { |
| 789 RenderPass* render_pass = | 799 RenderPass* render_pass = |
| 790 frame->render_passes_by_id[contributing_render_pass_id]; | 800 frame->render_passes_by_id[contributing_render_pass_id]; |
| 791 | 801 |
| 792 AppendQuadsData append_quads_data(render_pass->id); | |
| 793 AppendQuadsForLayer(render_pass, | 802 AppendQuadsForLayer(render_pass, |
| 794 *it, | 803 *it, |
| 795 occlusion_tracker, | 804 occlusion_tracker, |
| 796 &append_quads_data); | 805 &append_quads_data); |
| 797 | 806 |
| 798 contributing_render_pass_id = | 807 contributing_render_pass_id = |
| 799 it->NextContributingRenderPassId(contributing_render_pass_id); | 808 it->NextContributingRenderPassId(contributing_render_pass_id); |
| 800 } | 809 } |
| 801 } | 810 } |
| 802 | 811 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1193 } | 1202 } |
| 1194 } | 1203 } |
| 1195 } | 1204 } |
| 1196 | 1205 |
| 1197 scoped_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue( | 1206 scoped_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue( |
| 1198 TreePriority tree_priority, | 1207 TreePriority tree_priority, |
| 1199 RasterTilePriorityQueue::Type type) { | 1208 RasterTilePriorityQueue::Type type) { |
| 1200 TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildRasterQueue"); | 1209 TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildRasterQueue"); |
| 1201 picture_layer_pairs_.clear(); | 1210 picture_layer_pairs_.clear(); |
| 1202 GetPictureLayerImplPairs(&picture_layer_pairs_, true); | 1211 GetPictureLayerImplPairs(&picture_layer_pairs_, true); |
| 1203 scoped_ptr<RasterTilePriorityQueue> queue(RasterTilePriorityQueue::Create( | 1212 return RasterTilePriorityQueue::Create(picture_layer_pairs_, tree_priority, |
| 1204 picture_layer_pairs_, tree_priority, type)); | 1213 type); |
| 1205 | |
| 1206 if (!queue->IsEmpty()) { | |
| 1207 // Only checking the Top() tile here isn't a definite answer that there is | |
| 1208 // or isn't something required for draw in this raster queue. It's just a | |
| 1209 // heuristic to let us hit the common case and proactively tell the | |
| 1210 // scheduler that we expect to draw within each vsync until we get all the | |
| 1211 // tiles ready to draw. If we happen to miss a required for draw tile here, | |
| 1212 // then we will miss telling the scheduler each frame that we intend to draw | |
| 1213 // so it may make worse scheduling decisions. | |
| 1214 required_for_draw_tile_is_top_of_raster_queue_ = | |
| 1215 queue->Top()->required_for_draw(); | |
| 1216 } else { | |
| 1217 required_for_draw_tile_is_top_of_raster_queue_ = false; | |
| 1218 } | |
| 1219 return queue; | |
| 1220 } | 1214 } |
| 1221 | 1215 |
| 1222 scoped_ptr<EvictionTilePriorityQueue> LayerTreeHostImpl::BuildEvictionQueue( | 1216 scoped_ptr<EvictionTilePriorityQueue> LayerTreeHostImpl::BuildEvictionQueue( |
| 1223 TreePriority tree_priority) { | 1217 TreePriority tree_priority) { |
| 1224 TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildEvictionQueue"); | 1218 TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildEvictionQueue"); |
| 1225 scoped_ptr<EvictionTilePriorityQueue> queue(new EvictionTilePriorityQueue); | 1219 scoped_ptr<EvictionTilePriorityQueue> queue(new EvictionTilePriorityQueue); |
| 1226 picture_layer_pairs_.clear(); | 1220 picture_layer_pairs_.clear(); |
| 1227 GetPictureLayerImplPairs(&picture_layer_pairs_, false); | 1221 GetPictureLayerImplPairs(&picture_layer_pairs_, false); |
| 1228 queue->Build(picture_layer_pairs_, tree_priority); | 1222 queue->Build(picture_layer_pairs_, tree_priority); |
| 1229 return queue; | 1223 return queue; |
| 1230 } | 1224 } |
| 1231 | 1225 |
| 1226 void LayerTreeHostImpl::SetIsLikelyToRequireADraw( |
| 1227 bool is_likely_to_require_a_draw) { |
| 1228 // Proactively tell the scheduler that we expect to draw within each vsync |
| 1229 // until we get all the tiles ready to draw. If we happen to miss a required |
| 1230 // for draw tile here, then we will miss telling the scheduler each frame that |
| 1231 // we intend to draw so it may make worse scheduling decisions. |
| 1232 is_likely_to_require_a_draw_ = is_likely_to_require_a_draw; |
| 1233 } |
| 1234 |
| 1232 const std::vector<PictureLayerImpl*>& LayerTreeHostImpl::GetPictureLayers() | 1235 const std::vector<PictureLayerImpl*>& LayerTreeHostImpl::GetPictureLayers() |
| 1233 const { | 1236 const { |
| 1234 return picture_layers_; | 1237 return picture_layers_; |
| 1235 } | 1238 } |
| 1236 | 1239 |
| 1237 void LayerTreeHostImpl::NotifyReadyToActivate() { | 1240 void LayerTreeHostImpl::NotifyReadyToActivate() { |
| 1238 client_->NotifyReadyToActivate(); | 1241 client_->NotifyReadyToActivate(); |
| 1239 } | 1242 } |
| 1240 | 1243 |
| 1241 void LayerTreeHostImpl::NotifyReadyToDraw() { | 1244 void LayerTreeHostImpl::NotifyReadyToDraw() { |
| 1242 // Tiles that are ready will cause NotifyTileStateChanged() to be called so we | 1245 // Tiles that are ready will cause NotifyTileStateChanged() to be called so we |
| 1243 // don't need to schedule a draw here. Just stop WillBeginImplFrame() from | 1246 // don't need to schedule a draw here. Just stop WillBeginImplFrame() from |
| 1244 // causing optimistic requests to draw a frame. | 1247 // causing optimistic requests to draw a frame. |
| 1245 required_for_draw_tile_is_top_of_raster_queue_ = false; | 1248 is_likely_to_require_a_draw_ = false; |
| 1246 | 1249 |
| 1247 client_->NotifyReadyToDraw(); | 1250 client_->NotifyReadyToDraw(); |
| 1248 } | 1251 } |
| 1249 | 1252 |
| 1250 void LayerTreeHostImpl::NotifyTileStateChanged(const Tile* tile) { | 1253 void LayerTreeHostImpl::NotifyTileStateChanged(const Tile* tile) { |
| 1251 TRACE_EVENT0("cc", "LayerTreeHostImpl::NotifyTileStateChanged"); | 1254 TRACE_EVENT0("cc", "LayerTreeHostImpl::NotifyTileStateChanged"); |
| 1252 | 1255 |
| 1253 if (active_tree_) { | 1256 if (active_tree_) { |
| 1254 LayerImpl* layer_impl = | 1257 LayerImpl* layer_impl = |
| 1255 active_tree_->FindActiveTreeLayerById(tile->layer_id()); | 1258 active_tree_->FindActiveTreeLayerById(tile->layer_id()); |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1605 return true; | 1608 return true; |
| 1606 } | 1609 } |
| 1607 | 1610 |
| 1608 void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { | 1611 void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { |
| 1609 // Sample the frame time now. This time will be used for updating animations | 1612 // Sample the frame time now. This time will be used for updating animations |
| 1610 // when we draw. | 1613 // when we draw. |
| 1611 UpdateCurrentBeginFrameArgs(args); | 1614 UpdateCurrentBeginFrameArgs(args); |
| 1612 // Cache the begin impl frame interval | 1615 // Cache the begin impl frame interval |
| 1613 begin_impl_frame_interval_ = args.interval; | 1616 begin_impl_frame_interval_ = args.interval; |
| 1614 | 1617 |
| 1615 if (required_for_draw_tile_is_top_of_raster_queue_) { | 1618 if (is_likely_to_require_a_draw_) { |
| 1616 // Optimistically schedule a draw, as a tile required for draw is at the top | 1619 // Optimistically schedule a draw. This will let us expect the tile manager |
| 1617 // of the current raster queue. This will let us expect the tile to complete | 1620 // to complete its work so that we can draw new tiles within the impl frame |
| 1618 // and draw it within the impl frame we are beginning now. | 1621 // we are beginning now. |
| 1619 SetNeedsRedraw(); | 1622 SetNeedsRedraw(); |
| 1620 } | 1623 } |
| 1621 } | 1624 } |
| 1622 | 1625 |
| 1623 void LayerTreeHostImpl::UpdateViewportContainerSizes() { | 1626 void LayerTreeHostImpl::UpdateViewportContainerSizes() { |
| 1624 LayerImpl* inner_container = active_tree_->InnerViewportContainerLayer(); | 1627 LayerImpl* inner_container = active_tree_->InnerViewportContainerLayer(); |
| 1625 LayerImpl* outer_container = active_tree_->OuterViewportContainerLayer(); | 1628 LayerImpl* outer_container = active_tree_->OuterViewportContainerLayer(); |
| 1626 | 1629 |
| 1627 if (!inner_container || !top_controls_manager_) | 1630 if (!inner_container || !top_controls_manager_) |
| 1628 return; | 1631 return; |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1949 tile_task_worker_pool_->AsTileTaskRunner(), | 1952 tile_task_worker_pool_->AsTileTaskRunner(), |
| 1950 rasterizer_.get(), scheduled_raster_task_limit); | 1953 rasterizer_.get(), scheduled_raster_task_limit); |
| 1951 | 1954 |
| 1952 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1955 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
| 1953 } | 1956 } |
| 1954 | 1957 |
| 1955 scoped_ptr<Rasterizer> LayerTreeHostImpl::CreateRasterizer() { | 1958 scoped_ptr<Rasterizer> LayerTreeHostImpl::CreateRasterizer() { |
| 1956 ContextProvider* context_provider = output_surface_->context_provider(); | 1959 ContextProvider* context_provider = output_surface_->context_provider(); |
| 1957 if (use_gpu_rasterization_ && context_provider) { | 1960 if (use_gpu_rasterization_ && context_provider) { |
| 1958 return GpuRasterizer::Create(context_provider, resource_provider_.get(), | 1961 return GpuRasterizer::Create(context_provider, resource_provider_.get(), |
| 1959 settings_.use_distance_field_text, false); | 1962 settings_.use_distance_field_text, false, |
| 1963 settings_.gpu_rasterization_msaa_sample_count); |
| 1960 } | 1964 } |
| 1961 return SoftwareRasterizer::Create(); | 1965 return SoftwareRasterizer::Create(); |
| 1962 } | 1966 } |
| 1963 | 1967 |
| 1964 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( | 1968 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( |
| 1965 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, | 1969 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, |
| 1966 scoped_ptr<ResourcePool>* resource_pool, | 1970 scoped_ptr<ResourcePool>* resource_pool, |
| 1967 scoped_ptr<ResourcePool>* staging_resource_pool) { | 1971 scoped_ptr<ResourcePool>* staging_resource_pool) { |
| 1968 base::SingleThreadTaskRunner* task_runner = | 1972 base::SingleThreadTaskRunner* task_runner = |
| 1969 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1973 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2394 // behavior as ScrollBy to determine which layer to animate, but we do not | 2398 // behavior as ScrollBy to determine which layer to animate, but we do not |
| 2395 // do the Android-specific things in ScrollBy like showing top controls. | 2399 // do the Android-specific things in ScrollBy like showing top controls. |
| 2396 InputHandler::ScrollStatus scroll_status = ScrollBegin(viewport_point, Wheel); | 2400 InputHandler::ScrollStatus scroll_status = ScrollBegin(viewport_point, Wheel); |
| 2397 if (scroll_status == ScrollStarted) { | 2401 if (scroll_status == ScrollStarted) { |
| 2398 gfx::Vector2dF pending_delta = scroll_delta; | 2402 gfx::Vector2dF pending_delta = scroll_delta; |
| 2399 for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); layer_impl; | 2403 for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); layer_impl; |
| 2400 layer_impl = layer_impl->parent()) { | 2404 layer_impl = layer_impl->parent()) { |
| 2401 if (!layer_impl->scrollable()) | 2405 if (!layer_impl->scrollable()) |
| 2402 continue; | 2406 continue; |
| 2403 | 2407 |
| 2404 gfx::ScrollOffset current_offset = layer_impl->TotalScrollOffset(); | 2408 gfx::ScrollOffset current_offset = layer_impl->CurrentScrollOffset(); |
| 2405 gfx::ScrollOffset target_offset = | 2409 gfx::ScrollOffset target_offset = |
| 2406 ScrollOffsetWithDelta(current_offset, pending_delta); | 2410 ScrollOffsetWithDelta(current_offset, pending_delta); |
| 2407 target_offset.SetToMax(gfx::ScrollOffset()); | 2411 target_offset.SetToMax(gfx::ScrollOffset()); |
| 2408 target_offset.SetToMin(layer_impl->MaxScrollOffset()); | 2412 target_offset.SetToMin(layer_impl->MaxScrollOffset()); |
| 2409 gfx::Vector2dF actual_delta = target_offset.DeltaFrom(current_offset); | 2413 gfx::Vector2dF actual_delta = target_offset.DeltaFrom(current_offset); |
| 2410 | 2414 |
| 2411 const float kEpsilon = 0.1f; | 2415 const float kEpsilon = 0.1f; |
| 2412 bool can_layer_scroll = (std::abs(actual_delta.x()) > kEpsilon || | 2416 bool can_layer_scroll = (std::abs(actual_delta.x()) > kEpsilon || |
| 2413 std::abs(actual_delta.y()) > kEpsilon); | 2417 std::abs(actual_delta.y()) > kEpsilon); |
| 2414 | 2418 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2484 return gfx::Vector2dF(); | 2488 return gfx::Vector2dF(); |
| 2485 | 2489 |
| 2486 // local_start_point and local_end_point are in content space but we want to | 2490 // local_start_point and local_end_point are in content space but we want to |
| 2487 // move them to layer space for scrolling. | 2491 // move them to layer space for scrolling. |
| 2488 float width_scale = 1.f / layer_impl->contents_scale_x(); | 2492 float width_scale = 1.f / layer_impl->contents_scale_x(); |
| 2489 float height_scale = 1.f / layer_impl->contents_scale_y(); | 2493 float height_scale = 1.f / layer_impl->contents_scale_y(); |
| 2490 local_start_point.Scale(width_scale, height_scale); | 2494 local_start_point.Scale(width_scale, height_scale); |
| 2491 local_end_point.Scale(width_scale, height_scale); | 2495 local_end_point.Scale(width_scale, height_scale); |
| 2492 | 2496 |
| 2493 // Apply the scroll delta. | 2497 // Apply the scroll delta. |
| 2494 gfx::Vector2dF previous_delta = layer_impl->ScrollDelta(); | 2498 gfx::ScrollOffset previous_offset = layer_impl->CurrentScrollOffset(); |
| 2495 layer_impl->ScrollBy(local_end_point - local_start_point); | 2499 layer_impl->ScrollBy(local_end_point - local_start_point); |
| 2500 gfx::ScrollOffset scrolled = |
| 2501 layer_impl->CurrentScrollOffset() - previous_offset; |
| 2496 | 2502 |
| 2497 // Get the end point in the layer's content space so we can apply its | 2503 // Get the end point in the layer's content space so we can apply its |
| 2498 // ScreenSpaceTransform. | 2504 // ScreenSpaceTransform. |
| 2499 gfx::PointF actual_local_end_point = local_start_point + | 2505 gfx::PointF actual_local_end_point = |
| 2500 layer_impl->ScrollDelta() - | 2506 local_start_point + gfx::Vector2dF(scrolled.x(), scrolled.y()); |
| 2501 previous_delta; | |
| 2502 gfx::PointF actual_local_content_end_point = | 2507 gfx::PointF actual_local_content_end_point = |
| 2503 gfx::ScalePoint(actual_local_end_point, | 2508 gfx::ScalePoint(actual_local_end_point, |
| 2504 1.f / width_scale, | 2509 1.f / width_scale, |
| 2505 1.f / height_scale); | 2510 1.f / height_scale); |
| 2506 | 2511 |
| 2507 // Calculate the applied scroll delta in viewport space coordinates. | 2512 // Calculate the applied scroll delta in viewport space coordinates. |
| 2508 gfx::PointF actual_screen_space_end_point = | 2513 gfx::PointF actual_screen_space_end_point = |
| 2509 MathUtil::MapPoint(layer_impl->screen_space_transform(), | 2514 MathUtil::MapPoint(layer_impl->screen_space_transform(), |
| 2510 actual_local_content_end_point, | 2515 actual_local_content_end_point, |
| 2511 &end_clipped); | 2516 &end_clipped); |
| 2512 DCHECK(!end_clipped); | 2517 DCHECK(!end_clipped); |
| 2513 if (end_clipped) | 2518 if (end_clipped) |
| 2514 return gfx::Vector2dF(); | 2519 return gfx::Vector2dF(); |
| 2515 gfx::PointF actual_viewport_end_point = | 2520 gfx::PointF actual_viewport_end_point = |
| 2516 gfx::ScalePoint(actual_screen_space_end_point, | 2521 gfx::ScalePoint(actual_screen_space_end_point, |
| 2517 1.f / scale_from_viewport_to_screen_space); | 2522 1.f / scale_from_viewport_to_screen_space); |
| 2518 return actual_viewport_end_point - viewport_point; | 2523 return actual_viewport_end_point - viewport_point; |
| 2519 } | 2524 } |
| 2520 | 2525 |
| 2521 static gfx::Vector2dF ScrollLayerWithLocalDelta( | 2526 static gfx::Vector2dF ScrollLayerWithLocalDelta( |
| 2522 LayerImpl* layer_impl, | 2527 LayerImpl* layer_impl, |
| 2523 const gfx::Vector2dF& local_delta, | 2528 const gfx::Vector2dF& local_delta, |
| 2524 float page_scale_factor) { | 2529 float page_scale_factor) { |
| 2525 gfx::Vector2dF previous_delta(layer_impl->ScrollDelta()); | 2530 gfx::ScrollOffset previous_offset = layer_impl->CurrentScrollOffset(); |
| 2526 gfx::Vector2dF delta = local_delta; | 2531 gfx::Vector2dF delta = local_delta; |
| 2527 delta.Scale(1.f / page_scale_factor); | 2532 delta.Scale(1.f / page_scale_factor); |
| 2528 layer_impl->ScrollBy(delta); | 2533 layer_impl->ScrollBy(delta); |
| 2529 return layer_impl->ScrollDelta() - previous_delta; | 2534 gfx::ScrollOffset scrolled = |
| 2535 layer_impl->CurrentScrollOffset() - previous_offset; |
| 2536 return gfx::Vector2dF(scrolled.x(), scrolled.y()); |
| 2530 } | 2537 } |
| 2531 | 2538 |
| 2532 bool LayerTreeHostImpl::ShouldTopControlsConsumeScroll( | 2539 bool LayerTreeHostImpl::ShouldTopControlsConsumeScroll( |
| 2533 const gfx::Vector2dF& scroll_delta) const { | 2540 const gfx::Vector2dF& scroll_delta) const { |
| 2534 DCHECK(CurrentlyScrollingLayer()); | 2541 DCHECK(CurrentlyScrollingLayer()); |
| 2535 | 2542 |
| 2536 if (!top_controls_manager_) | 2543 if (!top_controls_manager_) |
| 2537 return false; | 2544 return false; |
| 2538 | 2545 |
| 2539 // Always consume if it's in the direction to show the top controls. | 2546 // Always consume if it's in the direction to show the top controls. |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2969 // scales that we want when we're not inside a pinch. | 2976 // scales that we want when we're not inside a pinch. |
| 2970 active_tree_->set_needs_update_draw_properties(); | 2977 active_tree_->set_needs_update_draw_properties(); |
| 2971 SetNeedsRedraw(); | 2978 SetNeedsRedraw(); |
| 2972 } | 2979 } |
| 2973 | 2980 |
| 2974 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, | 2981 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, |
| 2975 LayerImpl* layer_impl) { | 2982 LayerImpl* layer_impl) { |
| 2976 if (!layer_impl) | 2983 if (!layer_impl) |
| 2977 return; | 2984 return; |
| 2978 | 2985 |
| 2979 gfx::Vector2d scroll_delta = | 2986 gfx::ScrollOffset scroll_delta = layer_impl->PullDeltaForMainThread(); |
| 2980 gfx::ToFlooredVector2d(layer_impl->ScrollDelta()); | 2987 |
| 2981 if (!scroll_delta.IsZero()) { | 2988 if (!scroll_delta.IsZero()) { |
| 2982 LayerTreeHostCommon::ScrollUpdateInfo scroll; | 2989 LayerTreeHostCommon::ScrollUpdateInfo scroll; |
| 2983 scroll.layer_id = layer_impl->id(); | 2990 scroll.layer_id = layer_impl->id(); |
| 2984 scroll.scroll_delta = scroll_delta; | 2991 scroll.scroll_delta = gfx::Vector2d(scroll_delta.x(), scroll_delta.y()); |
| 2985 scroll_info->scrolls.push_back(scroll); | 2992 scroll_info->scrolls.push_back(scroll); |
| 2986 layer_impl->SetSentScrollDelta(scroll_delta); | |
| 2987 } | 2993 } |
| 2988 | 2994 |
| 2989 for (size_t i = 0; i < layer_impl->children().size(); ++i) | 2995 for (size_t i = 0; i < layer_impl->children().size(); ++i) |
| 2990 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); | 2996 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); |
| 2991 } | 2997 } |
| 2992 | 2998 |
| 2993 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { | 2999 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { |
| 2994 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); | 3000 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); |
| 2995 | 3001 |
| 2996 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); | 3002 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3453 } | 3459 } |
| 3454 | 3460 |
| 3455 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3461 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
| 3456 std::vector<PictureLayerImpl*>::iterator it = | 3462 std::vector<PictureLayerImpl*>::iterator it = |
| 3457 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3463 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
| 3458 DCHECK(it != picture_layers_.end()); | 3464 DCHECK(it != picture_layers_.end()); |
| 3459 picture_layers_.erase(it); | 3465 picture_layers_.erase(it); |
| 3460 } | 3466 } |
| 3461 | 3467 |
| 3462 } // namespace cc | 3468 } // namespace cc |
| OLD | NEW |