Chromium Code Reviews| 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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 new DebugScopedSetImplThread(layer_tree_host_impl_->proxy())); | 160 new DebugScopedSetImplThread(layer_tree_host_impl_->proxy())); |
| 161 } | 161 } |
| 162 | 162 |
| 163 // TODO(enne): This should probably happen post-animate. | 163 // TODO(enne): This should probably happen post-animate. |
| 164 if (layer_tree_host_impl_->pending_tree()) { | 164 if (layer_tree_host_impl_->pending_tree()) { |
| 165 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties(); | 165 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties(); |
| 166 layer_tree_host_impl_->ManageTiles(); | 166 layer_tree_host_impl_->ManageTiles(); |
| 167 } | 167 } |
| 168 | 168 |
| 169 layer_tree_host_impl_->Animate( | 169 layer_tree_host_impl_->Animate( |
| 170 layer_tree_host_impl_->CurrentFrameTimeTicks(), | 170 layer_tree_host_impl_->CurrentFrameTimeTicks()); |
| 171 layer_tree_host_impl_->CurrentFrameTime()); | |
| 172 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true); | 171 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true); |
| 173 bool start_ready_animations = true; | 172 bool start_ready_animations = true; |
| 174 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); | 173 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
| 175 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); | 174 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); |
| 176 } | 175 } |
| 177 | 176 |
| 178 void SetActive(bool active) { | 177 void SetActive(bool active) { |
| 179 if (active != time_source_->Active()) | 178 if (active != time_source_->Active()) |
| 180 time_source_->SetActive(active); | 179 time_source_->SetActive(active); |
| 181 } | 180 } |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 389 } | 388 } |
| 390 if (EvictedUIResourcesExist()) { | 389 if (EvictedUIResourcesExist()) { |
| 391 TRACE_EVENT_INSTANT0( | 390 TRACE_EVENT_INSTANT0( |
| 392 "cc", "LayerTreeHostImpl::CanDraw UI resources evicted not recreated", | 391 "cc", "LayerTreeHostImpl::CanDraw UI resources evicted not recreated", |
| 393 TRACE_EVENT_SCOPE_THREAD); | 392 TRACE_EVENT_SCOPE_THREAD); |
| 394 return false; | 393 return false; |
| 395 } | 394 } |
| 396 return true; | 395 return true; |
| 397 } | 396 } |
| 398 | 397 |
| 399 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time, | 398 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { |
| 400 base::Time wall_clock_time) { | |
| 401 if (input_handler_client_) | 399 if (input_handler_client_) |
| 402 input_handler_client_->Animate(monotonic_time); | 400 input_handler_client_->Animate(monotonic_time); |
| 403 AnimatePageScale(monotonic_time); | 401 AnimatePageScale(monotonic_time); |
| 404 AnimateLayers(monotonic_time, wall_clock_time); | 402 AnimateLayers(monotonic_time); |
| 405 AnimateScrollbars(monotonic_time); | 403 AnimateScrollbars(monotonic_time); |
| 406 AnimateTopControls(monotonic_time); | 404 AnimateTopControls(monotonic_time); |
| 407 } | 405 } |
| 408 | 406 |
| 409 void LayerTreeHostImpl::ManageTiles() { | 407 void LayerTreeHostImpl::ManageTiles() { |
| 410 if (!tile_manager_) | 408 if (!tile_manager_) |
| 411 return; | 409 return; |
| 412 if (!tile_priorities_dirty_) | 410 if (!tile_priorities_dirty_) |
| 413 return; | 411 return; |
| 414 if (!device_viewport_valid_for_tile_management_) | 412 if (!device_viewport_valid_for_tile_management_) |
| (...skipping 2188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2603 gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta); | 2601 gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta); |
| 2604 | 2602 |
| 2605 if (!unused_delta.IsZero() && (scroll_layer == OuterViewportScrollLayer())) | 2603 if (!unused_delta.IsZero() && (scroll_layer == OuterViewportScrollLayer())) |
| 2606 InnerViewportScrollLayer()->ScrollBy(unused_delta); | 2604 InnerViewportScrollLayer()->ScrollBy(unused_delta); |
| 2607 } | 2605 } |
| 2608 | 2606 |
| 2609 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { | 2607 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { |
| 2610 if (!page_scale_animation_) | 2608 if (!page_scale_animation_) |
| 2611 return; | 2609 return; |
| 2612 | 2610 |
| 2613 double monotonic_time = (time - base::TimeTicks()).InSecondsF(); | 2611 double webkit_time = time.ToWebKit(); |
| 2614 gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset(); | 2612 gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset(); |
| 2615 | 2613 |
| 2616 if (!page_scale_animation_->IsAnimationStarted()) | 2614 if (!page_scale_animation_->IsAnimationStarted()) |
| 2617 page_scale_animation_->StartAnimation(monotonic_time); | 2615 page_scale_animation_->StartAnimation(webkit_time); |
| 2618 | 2616 |
| 2619 active_tree_->SetPageScaleDelta( | 2617 active_tree_->SetPageScaleDelta( |
| 2620 page_scale_animation_->PageScaleFactorAtTime(monotonic_time) / | 2618 page_scale_animation_->PageScaleFactorAtTime(webkit_time) / |
| 2621 active_tree_->page_scale_factor()); | 2619 active_tree_->page_scale_factor()); |
| 2622 gfx::Vector2dF next_scroll = | 2620 gfx::Vector2dF next_scroll = |
| 2623 page_scale_animation_->ScrollOffsetAtTime(monotonic_time); | 2621 page_scale_animation_->ScrollOffsetAtTime(webkit_time); |
| 2624 | 2622 |
| 2625 ScrollViewportBy(next_scroll - scroll_total); | 2623 ScrollViewportBy(next_scroll - scroll_total); |
| 2626 SetNeedsRedraw(); | 2624 SetNeedsRedraw(); |
| 2627 | 2625 |
| 2628 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) { | 2626 if (page_scale_animation_->IsAnimationCompleteAtTime(webkit_time)) { |
| 2629 page_scale_animation_.reset(); | 2627 page_scale_animation_.reset(); |
| 2630 client_->SetNeedsCommitOnImplThread(); | 2628 client_->SetNeedsCommitOnImplThread(); |
| 2631 client_->RenewTreePriority(); | 2629 client_->RenewTreePriority(); |
| 2632 } | 2630 } |
| 2633 } | 2631 } |
| 2634 | 2632 |
| 2635 void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { | 2633 void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { |
| 2636 if (!top_controls_manager_) | 2634 if (!top_controls_manager_) |
| 2637 return; | 2635 return; |
| 2638 gfx::Vector2dF scroll = top_controls_manager_->Animate(time); | 2636 gfx::Vector2dF scroll = top_controls_manager_->Animate(time); |
| 2639 if (active_tree_->TotalScrollOffset().y() == 0.f) | 2637 if (active_tree_->TotalScrollOffset().y() == 0.f) |
| 2640 return; | 2638 return; |
| 2641 if (scroll.IsZero()) { | 2639 if (scroll.IsZero()) { |
| 2642 // This may happen on the first animation step. Force redraw otherwise | 2640 // This may happen on the first animation step. Force redraw otherwise |
| 2643 // the animation would stop because of no new frames. | 2641 // the animation would stop because of no new frames. |
| 2644 SetNeedsRedraw(); | 2642 SetNeedsRedraw(); |
| 2645 } else { | 2643 } else { |
| 2646 ScrollViewportBy(gfx::ScaleVector2d( | 2644 ScrollViewportBy(gfx::ScaleVector2d( |
| 2647 scroll, 1.f / active_tree_->total_page_scale_factor())); | 2645 scroll, 1.f / active_tree_->total_page_scale_factor())); |
| 2648 } | 2646 } |
| 2649 } | 2647 } |
| 2650 | 2648 |
| 2651 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time, | 2649 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) { |
| 2652 base::Time wall_clock_time) { | |
| 2653 if (!settings_.accelerated_animation_enabled || | 2650 if (!settings_.accelerated_animation_enabled || |
| 2654 animation_registrar_->active_animation_controllers().empty() || | 2651 animation_registrar_->active_animation_controllers().empty() || |
| 2655 !active_tree_->root_layer()) | 2652 !active_tree_->root_layer()) |
| 2656 return; | 2653 return; |
| 2657 | 2654 |
| 2658 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers"); | 2655 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers"); |
| 2659 | 2656 |
| 2660 last_animation_time_ = wall_clock_time; | |
| 2661 double monotonic_seconds = (monotonic_time - base::TimeTicks()).InSecondsF(); | |
| 2662 | |
| 2663 AnimationRegistrar::AnimationControllerMap copy = | 2657 AnimationRegistrar::AnimationControllerMap copy = |
| 2664 animation_registrar_->active_animation_controllers(); | 2658 animation_registrar_->active_animation_controllers(); |
| 2665 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); | 2659 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); |
| 2666 iter != copy.end(); | 2660 iter != copy.end(); |
| 2667 ++iter) | 2661 ++iter) |
| 2668 (*iter).second->Animate(monotonic_seconds); | 2662 (*iter).second->Animate(monotonic_time.ToWebKit()); |
| 2669 | 2663 |
| 2670 SetNeedsRedraw(); | 2664 SetNeedsRedraw(); |
| 2671 } | 2665 } |
| 2672 | 2666 |
| 2673 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { | 2667 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { |
| 2674 if (!settings_.accelerated_animation_enabled || | 2668 if (!settings_.accelerated_animation_enabled || |
| 2675 animation_registrar_->active_animation_controllers().empty() || | 2669 animation_registrar_->active_animation_controllers().empty() || |
| 2676 !active_tree_->root_layer()) | 2670 !active_tree_->root_layer()) |
| 2677 return; | 2671 return; |
| 2678 | 2672 |
| 2679 TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState"); | 2673 TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState"); |
| 2680 scoped_ptr<AnimationEventsVector> events = | 2674 scoped_ptr<AnimationEventsVector> events = |
| 2681 make_scoped_ptr(new AnimationEventsVector); | 2675 make_scoped_ptr(new AnimationEventsVector); |
| 2682 AnimationRegistrar::AnimationControllerMap copy = | 2676 AnimationRegistrar::AnimationControllerMap copy = |
| 2683 animation_registrar_->active_animation_controllers(); | 2677 animation_registrar_->active_animation_controllers(); |
| 2684 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); | 2678 for (AnimationRegistrar::AnimationControllerMap::iterator iter = copy.begin(); |
| 2685 iter != copy.end(); | 2679 iter != copy.end(); |
| 2686 ++iter) | 2680 ++iter) |
| 2687 (*iter).second->UpdateState(start_ready_animations, events.get()); | 2681 (*iter).second->UpdateState(start_ready_animations, events.get()); |
| 2688 | 2682 |
| 2689 if (!events->empty()) { | 2683 if (!events->empty()) { |
| 2690 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass(), | 2684 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass(), |
| 2691 last_animation_time_); | 2685 last_animation_time_); |
|
ajuma
2014/02/28 02:32:03
Since last_animation_time_ is no longer being set,
| |
| 2692 } | 2686 } |
| 2693 } | 2687 } |
| 2694 | 2688 |
| 2695 base::TimeDelta LayerTreeHostImpl::LowFrequencyAnimationInterval() const { | 2689 base::TimeDelta LayerTreeHostImpl::LowFrequencyAnimationInterval() const { |
| 2696 return base::TimeDelta::FromSeconds(1); | 2690 return base::TimeDelta::FromSeconds(1); |
| 2697 } | 2691 } |
| 2698 | 2692 |
| 2699 void LayerTreeHostImpl::SendReleaseResourcesRecursive(LayerImpl* current) { | 2693 void LayerTreeHostImpl::SendReleaseResourcesRecursive(LayerImpl* current) { |
| 2700 DCHECK(current); | 2694 DCHECK(current); |
| 2701 current->ReleaseResources(); | 2695 current->ReleaseResources(); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2816 return; | 2810 return; |
| 2817 | 2811 |
| 2818 if (global_tile_state_.tree_priority == priority) | 2812 if (global_tile_state_.tree_priority == priority) |
| 2819 return; | 2813 return; |
| 2820 global_tile_state_.tree_priority = priority; | 2814 global_tile_state_.tree_priority = priority; |
| 2821 DidModifyTilePriorities(); | 2815 DidModifyTilePriorities(); |
| 2822 } | 2816 } |
| 2823 | 2817 |
| 2824 void LayerTreeHostImpl::ResetCurrentFrameTimeForNextFrame() { | 2818 void LayerTreeHostImpl::ResetCurrentFrameTimeForNextFrame() { |
| 2825 current_frame_timeticks_ = base::TimeTicks(); | 2819 current_frame_timeticks_ = base::TimeTicks(); |
| 2826 current_frame_time_ = base::Time(); | |
| 2827 } | 2820 } |
| 2828 | 2821 |
| 2829 void LayerTreeHostImpl::UpdateCurrentFrameTime(base::TimeTicks* ticks, | 2822 void LayerTreeHostImpl::UpdateCurrentFrameTime(base::TimeTicks* ticks) const { |
| 2830 base::Time* now) const { | |
| 2831 if (ticks->is_null()) { | 2823 if (ticks->is_null()) { |
| 2832 DCHECK(now->is_null()); | |
| 2833 *ticks = CurrentPhysicalTimeTicks(); | 2824 *ticks = CurrentPhysicalTimeTicks(); |
| 2834 *now = base::Time::Now(); | |
| 2835 } | 2825 } |
| 2836 } | 2826 } |
| 2837 | 2827 |
| 2838 base::TimeTicks LayerTreeHostImpl::CurrentFrameTimeTicks() { | 2828 base::TimeTicks LayerTreeHostImpl::CurrentFrameTimeTicks() { |
| 2839 UpdateCurrentFrameTime(¤t_frame_timeticks_, ¤t_frame_time_); | 2829 UpdateCurrentFrameTime(¤t_frame_timeticks_); |
| 2840 return current_frame_timeticks_; | 2830 return current_frame_timeticks_; |
| 2841 } | 2831 } |
| 2842 | 2832 |
| 2843 base::Time LayerTreeHostImpl::CurrentFrameTime() { | |
| 2844 UpdateCurrentFrameTime(¤t_frame_timeticks_, ¤t_frame_time_); | |
| 2845 return current_frame_time_; | |
| 2846 } | |
| 2847 | |
| 2848 base::TimeTicks LayerTreeHostImpl::CurrentPhysicalTimeTicks() const { | 2833 base::TimeTicks LayerTreeHostImpl::CurrentPhysicalTimeTicks() const { |
| 2849 return gfx::FrameTime::Now(); | 2834 return gfx::FrameTime::Now(); |
| 2850 } | 2835 } |
| 2851 | 2836 |
| 2852 scoped_ptr<base::Value> LayerTreeHostImpl::AsValueWithFrame( | 2837 scoped_ptr<base::Value> LayerTreeHostImpl::AsValueWithFrame( |
| 2853 FrameData* frame) const { | 2838 FrameData* frame) const { |
| 2854 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 2839 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| 2855 if (this->pending_tree_) | 2840 if (this->pending_tree_) |
| 2856 state->Set("activation_state", ActivationStateAsValue().release()); | 2841 state->Set("activation_state", ActivationStateAsValue().release()); |
| 2857 state->Set("device_viewport_size", | 2842 state->Set("device_viewport_size", |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2998 swap_promise_monitor_.erase(monitor); | 2983 swap_promise_monitor_.erase(monitor); |
| 2999 } | 2984 } |
| 3000 | 2985 |
| 3001 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { | 2986 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { |
| 3002 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 2987 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
| 3003 for (; it != swap_promise_monitor_.end(); it++) | 2988 for (; it != swap_promise_monitor_.end(); it++) |
| 3004 (*it)->OnSetNeedsRedrawOnImpl(); | 2989 (*it)->OnSetNeedsRedrawOnImpl(); |
| 3005 } | 2990 } |
| 3006 | 2991 |
| 3007 } // namespace cc | 2992 } // namespace cc |
| OLD | NEW |