Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 206793003: cc: Split animating and drawing into separate actions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix input handler proxy test build. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 page_scale_animation_->ZoomWithAnchor(anchor, 463 page_scale_animation_->ZoomWithAnchor(anchor,
464 page_scale, 464 page_scale,
465 duration.InSecondsF()); 465 duration.InSecondsF());
466 } else { 466 } else {
467 gfx::Vector2dF scaled_target_offset = target_offset; 467 gfx::Vector2dF scaled_target_offset = target_offset;
468 page_scale_animation_->ZoomTo(scaled_target_offset, 468 page_scale_animation_->ZoomTo(scaled_target_offset,
469 page_scale, 469 page_scale,
470 duration.InSecondsF()); 470 duration.InSecondsF());
471 } 471 }
472 472
473 SetNeedsRedraw(); 473 SetNeedsAnimate();
474 client_->SetNeedsCommitOnImplThread(); 474 client_->SetNeedsCommitOnImplThread();
475 client_->RenewTreePriority(); 475 client_->RenewTreePriority();
476 } 476 }
477 477
478 void LayerTreeHostImpl::ScheduleAnimation() {
479 SetNeedsRedraw();
480 }
481
482 bool LayerTreeHostImpl::HaveTouchEventHandlersAt( 478 bool LayerTreeHostImpl::HaveTouchEventHandlersAt(
483 const gfx::Point& viewport_point) { 479 const gfx::Point& viewport_point) {
484 if (!settings_.touch_hit_testing) 480 if (!settings_.touch_hit_testing)
485 return true; 481 return true;
486 if (!EnsureRenderSurfaceLayerList()) 482 if (!EnsureRenderSurfaceLayerList())
487 return false; 483 return false;
488 484
489 gfx::PointF device_viewport_point = 485 gfx::PointF device_viewport_point =
490 gfx::ScalePoint(viewport_point, device_scale_factor_); 486 gfx::ScalePoint(viewport_point, device_scale_factor_);
491 487
(...skipping 1243 matching lines...) Expand 10 before | Expand all | Expand 10 after
1735 // draw or timer tick. 1731 // draw or timer tick.
1736 if (!visible_) 1732 if (!visible_)
1737 ManageTiles(); 1733 ManageTiles();
1738 1734
1739 if (!renderer_) 1735 if (!renderer_)
1740 return; 1736 return;
1741 1737
1742 renderer_->SetVisible(visible); 1738 renderer_->SetVisible(visible);
1743 } 1739 }
1744 1740
1741 void LayerTreeHostImpl::SetNeedsAnimate() {
1742 NotifySwapPromiseMonitorsOfSetNeedsRedraw();
1743 client_->SetNeedsAnimateOnImplThread();
1744 }
1745
1745 void LayerTreeHostImpl::SetNeedsRedraw() { 1746 void LayerTreeHostImpl::SetNeedsRedraw() {
1746 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); 1747 NotifySwapPromiseMonitorsOfSetNeedsRedraw();
1747 client_->SetNeedsRedrawOnImplThread(); 1748 client_->SetNeedsRedrawOnImplThread();
1748 } 1749 }
1749 1750
1750 ManagedMemoryPolicy LayerTreeHostImpl::ActualManagedMemoryPolicy() const { 1751 ManagedMemoryPolicy LayerTreeHostImpl::ActualManagedMemoryPolicy() const {
1751 ManagedMemoryPolicy actual = cached_managed_memory_policy_; 1752 ManagedMemoryPolicy actual = cached_managed_memory_policy_;
1752 // TODO(ernstm): The second condition disables pre-painting for all layers 1753 // TODO(ernstm): The second condition disables pre-painting for all layers
1753 // when GPU rasterization is enabled. Once we selectively enable GPU 1754 // when GPU rasterization is enabled. Once we selectively enable GPU
1754 // rasterization per layer, we also need to disable pre-painting selectively: 1755 // rasterization per layer, we also need to disable pre-painting selectively:
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
2046 return external_clip_; 2047 return external_clip_;
2047 } 2048 }
2048 2049
2049 const gfx::Transform& LayerTreeHostImpl::DrawTransform() const { 2050 const gfx::Transform& LayerTreeHostImpl::DrawTransform() const {
2050 return external_transform_; 2051 return external_transform_;
2051 } 2052 }
2052 2053
2053 void LayerTreeHostImpl::DidChangeTopControlsPosition() { 2054 void LayerTreeHostImpl::DidChangeTopControlsPosition() {
2054 UpdateInnerViewportContainerSize(); 2055 UpdateInnerViewportContainerSize();
2055 SetNeedsRedraw(); 2056 SetNeedsRedraw();
2057 SetNeedsAnimate();
2056 active_tree_->set_needs_update_draw_properties(); 2058 active_tree_->set_needs_update_draw_properties();
2057 SetFullRootLayerDamage(); 2059 SetFullRootLayerDamage();
2058 } 2060 }
2059 2061
2060 bool LayerTreeHostImpl::EnsureRenderSurfaceLayerList() { 2062 bool LayerTreeHostImpl::EnsureRenderSurfaceLayerList() {
2061 active_tree_->UpdateDrawProperties(); 2063 active_tree_->UpdateDrawProperties();
2062 return !active_tree_->RenderSurfaceLayerList().empty(); 2064 return !active_tree_->RenderSurfaceLayerList().empty();
2063 } 2065 }
2064 2066
2065 void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) { 2067 void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) {
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
2730 monotonic_time_for_cc_animations); 2732 monotonic_time_for_cc_animations);
2731 2733
2732 ScrollViewportBy(next_scroll - scroll_total); 2734 ScrollViewportBy(next_scroll - scroll_total);
2733 SetNeedsRedraw(); 2735 SetNeedsRedraw();
2734 2736
2735 if (page_scale_animation_->IsAnimationCompleteAtTime( 2737 if (page_scale_animation_->IsAnimationCompleteAtTime(
2736 monotonic_time_for_cc_animations)) { 2738 monotonic_time_for_cc_animations)) {
2737 page_scale_animation_.reset(); 2739 page_scale_animation_.reset();
2738 client_->SetNeedsCommitOnImplThread(); 2740 client_->SetNeedsCommitOnImplThread();
2739 client_->RenewTreePriority(); 2741 client_->RenewTreePriority();
2742 } else {
2743 SetNeedsAnimate();
2740 } 2744 }
2741 } 2745 }
2742 2746
2743 void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { 2747 void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) {
2744 if (!top_controls_manager_ || !top_controls_manager_->animation()) 2748 if (!top_controls_manager_ || !top_controls_manager_->animation())
2745 return; 2749 return;
2746 gfx::Vector2dF scroll = top_controls_manager_->Animate(time); 2750 gfx::Vector2dF scroll = top_controls_manager_->Animate(time);
2747 if (active_tree_->TotalScrollOffset().y() == 0.f) 2751 if (active_tree_->TotalScrollOffset().y() == 0.f)
2748 return; 2752 return;
2749 if (scroll.IsZero()) { 2753 if (!scroll.IsZero()) {
2750 // This may happen on the first animation step. Force redraw otherwise
2751 // the animation would stop because of no new frames.
2752 SetNeedsRedraw();
2753 } else {
2754 ScrollViewportBy(gfx::ScaleVector2d( 2754 ScrollViewportBy(gfx::ScaleVector2d(
2755 scroll, 1.f / active_tree_->total_page_scale_factor())); 2755 scroll, 1.f / active_tree_->total_page_scale_factor()));
2756 SetNeedsRedraw();
2756 } 2757 }
2758 SetNeedsAnimate();
2757 } 2759 }
2758 2760
2759 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) { 2761 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) {
2760 if (!settings_.accelerated_animation_enabled || 2762 if (!settings_.accelerated_animation_enabled ||
2761 !needs_animate_layers() || 2763 !needs_animate_layers() ||
2762 !active_tree_->root_layer()) 2764 !active_tree_->root_layer())
2763 return; 2765 return;
2764 2766
2765 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers"); 2767 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers");
2766 2768
2767 // TODO(ajuma): http://crbug.com/178171 - Animations use double for monotonic 2769 // TODO(ajuma): http://crbug.com/178171 - Animations use double for monotonic
2768 // time. 2770 // time.
2769 double monotonic_time_for_cc_animations = 2771 double monotonic_time_for_cc_animations =
2770 (monotonic_time - base::TimeTicks()).InSecondsF(); 2772 (monotonic_time - base::TimeTicks()).InSecondsF();
2771 AnimationRegistrar::AnimationControllerMap copy = 2773 AnimationRegistrar::AnimationControllerMap copy =
2772 animation_registrar_->active_animation_controllers(); 2774 animation_registrar_->active_animation_controllers();
2773 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); 2775 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin();
2774 iter != copy.end(); 2776 iter != copy.end();
2775 ++iter) 2777 ++iter)
2776 (*iter).second->Animate(monotonic_time_for_cc_animations); 2778 (*iter).second->Animate(monotonic_time_for_cc_animations);
2777 2779
2778 SetNeedsRedraw(); 2780 SetNeedsAnimate();
2779 } 2781 }
2780 2782
2781 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { 2783 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) {
2782 if (!settings_.accelerated_animation_enabled || 2784 if (!settings_.accelerated_animation_enabled ||
2783 !needs_animate_layers() || 2785 !needs_animate_layers() ||
2784 !active_tree_->root_layer()) 2786 !active_tree_->root_layer())
2785 return; 2787 return;
2786 2788
2787 TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState"); 2789 TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState");
2788 scoped_ptr<AnimationEventsVector> events = 2790 scoped_ptr<AnimationEventsVector> events =
2789 make_scoped_ptr(new AnimationEventsVector); 2791 make_scoped_ptr(new AnimationEventsVector);
2790 AnimationRegistrar::AnimationControllerMap copy = 2792 AnimationRegistrar::AnimationControllerMap copy =
2791 animation_registrar_->active_animation_controllers(); 2793 animation_registrar_->active_animation_controllers();
2792 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); 2794 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin();
2793 iter != copy.end(); 2795 iter != copy.end();
2794 ++iter) 2796 ++iter)
2795 (*iter).second->UpdateState(start_ready_animations, events.get()); 2797 (*iter).second->UpdateState(start_ready_animations, events.get());
2796 2798
2797 if (!events->empty()) { 2799 if (!events->empty()) {
2798 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); 2800 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass());
2799 } 2801 }
2802
2803 SetNeedsAnimate();
2800 } 2804 }
2801 2805
2802 base::TimeDelta LayerTreeHostImpl::LowFrequencyAnimationInterval() const { 2806 base::TimeDelta LayerTreeHostImpl::LowFrequencyAnimationInterval() const {
2803 return base::TimeDelta::FromSeconds(1); 2807 return base::TimeDelta::FromSeconds(1);
2804 } 2808 }
2805 2809
2806 void LayerTreeHostImpl::SendReleaseResourcesRecursive(LayerImpl* current) { 2810 void LayerTreeHostImpl::SendReleaseResourcesRecursive(LayerImpl* current) {
2807 DCHECK(current); 2811 DCHECK(current);
2808 current->ReleaseResources(); 2812 current->ReleaseResources();
2809 if (current->mask_layer()) 2813 if (current->mask_layer())
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2863 2867
2864 void LayerTreeHostImpl::AnimateScrollbarsRecursive(LayerImpl* layer, 2868 void LayerTreeHostImpl::AnimateScrollbarsRecursive(LayerImpl* layer,
2865 base::TimeTicks time) { 2869 base::TimeTicks time) {
2866 if (!layer) 2870 if (!layer)
2867 return; 2871 return;
2868 2872
2869 ScrollbarAnimationController* scrollbar_controller = 2873 ScrollbarAnimationController* scrollbar_controller =
2870 layer->scrollbar_animation_controller(); 2874 layer->scrollbar_animation_controller();
2871 if (scrollbar_controller && scrollbar_controller->Animate(time)) { 2875 if (scrollbar_controller && scrollbar_controller->Animate(time)) {
2872 TRACE_EVENT_INSTANT0( 2876 TRACE_EVENT_INSTANT0(
2873 "cc", "LayerTreeHostImpl::SetNeedsRedraw due to AnimateScrollbars", 2877 "cc",
2878 "LayerTreeHostImpl::SetNeedsAnimate due to AnimateScrollbars",
2874 TRACE_EVENT_SCOPE_THREAD); 2879 TRACE_EVENT_SCOPE_THREAD);
2875 SetNeedsRedraw(); 2880 SetNeedsAnimate();
2876 } 2881 }
2877 2882
2878 for (size_t i = 0; i < layer->children().size(); ++i) 2883 for (size_t i = 0; i < layer->children().size(); ++i)
2879 AnimateScrollbarsRecursive(layer->children()[i], time); 2884 AnimateScrollbarsRecursive(layer->children()[i], time);
2880 } 2885 }
2881 2886
2882 void LayerTreeHostImpl::StartScrollbarAnimation() { 2887 void LayerTreeHostImpl::StartScrollbarAnimation() {
2883 TRACE_EVENT0("cc", "LayerTreeHostImpl::StartScrollbarAnimation"); 2888 TRACE_EVENT0("cc", "LayerTreeHostImpl::StartScrollbarAnimation");
2884 StartScrollbarAnimationRecursive(RootLayer(), CurrentFrameTimeTicks()); 2889 StartScrollbarAnimationRecursive(RootLayer(), CurrentFrameTimeTicks());
2885 } 2890 }
2886 2891
2887 void LayerTreeHostImpl::StartScrollbarAnimationRecursive(LayerImpl* layer, 2892 void LayerTreeHostImpl::StartScrollbarAnimationRecursive(LayerImpl* layer,
2888 base::TimeTicks time) { 2893 base::TimeTicks time) {
2889 if (!layer) 2894 if (!layer)
2890 return; 2895 return;
2891 2896
2892 ScrollbarAnimationController* scrollbar_controller = 2897 ScrollbarAnimationController* scrollbar_controller =
2893 layer->scrollbar_animation_controller(); 2898 layer->scrollbar_animation_controller();
2894 if (scrollbar_controller && scrollbar_controller->IsAnimating()) { 2899 if (scrollbar_controller && scrollbar_controller->IsAnimating()) {
2895 base::TimeDelta delay = scrollbar_controller->DelayBeforeStart(time); 2900 base::TimeDelta delay = scrollbar_controller->DelayBeforeStart(time);
2896 if (delay > base::TimeDelta()) 2901 if (delay > base::TimeDelta()) {
2897 client_->RequestScrollbarAnimationOnImplThread(delay); 2902 client_->RequestScrollbarAnimationOnImplThread(delay);
2898 else if (scrollbar_controller->Animate(time)) 2903 } else if (scrollbar_controller->Animate(time)) {
2899 SetNeedsRedraw(); 2904 SetNeedsAnimate();
2905 }
2900 } 2906 }
2901 2907
2902 for (size_t i = 0; i < layer->children().size(); ++i) 2908 for (size_t i = 0; i < layer->children().size(); ++i)
2903 StartScrollbarAnimationRecursive(layer->children()[i], time); 2909 StartScrollbarAnimationRecursive(layer->children()[i], time);
2904 } 2910 }
2905 2911
2906 void LayerTreeHostImpl::SetTreePriority(TreePriority priority) { 2912 void LayerTreeHostImpl::SetTreePriority(TreePriority priority) {
2907 if (!tile_manager_) 2913 if (!tile_manager_)
2908 return; 2914 return;
2909 2915
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
3080 swap_promise_monitor_.erase(monitor); 3086 swap_promise_monitor_.erase(monitor);
3081 } 3087 }
3082 3088
3083 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { 3089 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() {
3084 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); 3090 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3085 for (; it != swap_promise_monitor_.end(); it++) 3091 for (; it != swap_promise_monitor_.end(); it++)
3086 (*it)->OnSetNeedsRedrawOnImpl(); 3092 (*it)->OnSetNeedsRedrawOnImpl();
3087 } 3093 }
3088 3094
3089 } // namespace cc 3095 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698