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/scheduler/scheduler.h" | 5 #include "cc/scheduler/scheduler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 | 256 |
257 void Scheduler::DidCreateAndInitializeOutputSurface() { | 257 void Scheduler::DidCreateAndInitializeOutputSurface() { |
258 TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface"); | 258 TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface"); |
259 DCHECK(!frame_source_->NeedsBeginFrames()); | 259 DCHECK(!frame_source_->NeedsBeginFrames()); |
260 DCHECK(begin_impl_frame_deadline_task_.IsCancelled()); | 260 DCHECK(begin_impl_frame_deadline_task_.IsCancelled()); |
261 state_machine_.DidCreateAndInitializeOutputSurface(); | 261 state_machine_.DidCreateAndInitializeOutputSurface(); |
262 UpdateCompositorTimingHistoryRecordingEnabled(); | 262 UpdateCompositorTimingHistoryRecordingEnabled(); |
263 ProcessScheduledActions(); | 263 ProcessScheduledActions(); |
264 } | 264 } |
265 | 265 |
266 void Scheduler::NotifyBeginMainFrameStarted() { | 266 void Scheduler::NotifyBeginMainFrameStarted( |
| 267 base::TimeTicks main_thread_start_time) { |
267 TRACE_EVENT0("cc", "Scheduler::NotifyBeginMainFrameStarted"); | 268 TRACE_EVENT0("cc", "Scheduler::NotifyBeginMainFrameStarted"); |
268 state_machine_.NotifyBeginMainFrameStarted(); | 269 state_machine_.NotifyBeginMainFrameStarted(); |
| 270 compositor_timing_history_->BeginMainFrameStarted(main_thread_start_time); |
269 } | 271 } |
270 | 272 |
271 base::TimeTicks Scheduler::LastBeginImplFrameTime() { | 273 base::TimeTicks Scheduler::LastBeginImplFrameTime() { |
272 return begin_impl_frame_tracker_.Current().frame_time; | 274 return begin_impl_frame_tracker_.Current().frame_time; |
273 } | 275 } |
274 | 276 |
275 void Scheduler::SetupNextBeginFrameIfNeeded() { | 277 void Scheduler::SetupNextBeginFrameIfNeeded() { |
276 // Never call SetNeedsBeginFrames if the frame source already has the right | 278 // Never call SetNeedsBeginFrames if the frame source already has the right |
277 // value. | 279 // value. |
278 if (frame_source_->NeedsBeginFrames() != state_machine_.BeginFrameNeeded()) { | 280 if (frame_source_->NeedsBeginFrames() != state_machine_.BeginFrameNeeded()) { |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 // BeginImplFrame starts a compositor frame that will wait up until a deadline | 505 // BeginImplFrame starts a compositor frame that will wait up until a deadline |
504 // for a BeginMainFrame+activation to complete before it times out and draws | 506 // for a BeginMainFrame+activation to complete before it times out and draws |
505 // any asynchronous animation and scroll/pinch updates. | 507 // any asynchronous animation and scroll/pinch updates. |
506 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { | 508 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { |
507 DCHECK_EQ(state_machine_.begin_impl_frame_state(), | 509 DCHECK_EQ(state_machine_.begin_impl_frame_state(), |
508 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 510 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
509 DCHECK(!BeginImplFrameDeadlinePending()); | 511 DCHECK(!BeginImplFrameDeadlinePending()); |
510 DCHECK(state_machine_.HasInitializedOutputSurface()); | 512 DCHECK(state_machine_.HasInitializedOutputSurface()); |
511 | 513 |
512 begin_impl_frame_tracker_.Start(args); | 514 begin_impl_frame_tracker_.Start(args); |
| 515 begin_main_frame_args_ = args; |
513 state_machine_.OnBeginImplFrame(); | 516 state_machine_.OnBeginImplFrame(); |
514 devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); | 517 devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); |
515 client_->WillBeginImplFrame(begin_impl_frame_tracker_.Current()); | 518 client_->WillBeginImplFrame(begin_impl_frame_tracker_.Current()); |
516 | 519 |
517 ProcessScheduledActions(); | 520 ProcessScheduledActions(); |
518 } | 521 } |
519 | 522 |
520 void Scheduler::ScheduleBeginImplFrameDeadline() { | 523 void Scheduler::ScheduleBeginImplFrameDeadline() { |
521 // The synchronous compositor does not post a deadline task. | 524 // The synchronous compositor does not post a deadline task. |
522 DCHECK(!settings_.using_synchronous_renderer_compositor); | 525 DCHECK(!settings_.using_synchronous_renderer_compositor); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 base::AutoReset<SchedulerStateMachine::Action> | 644 base::AutoReset<SchedulerStateMachine::Action> |
642 mark_inside_action(&inside_action_, action); | 645 mark_inside_action(&inside_action_, action); |
643 switch (action) { | 646 switch (action) { |
644 case SchedulerStateMachine::ACTION_NONE: | 647 case SchedulerStateMachine::ACTION_NONE: |
645 break; | 648 break; |
646 case SchedulerStateMachine::ACTION_ANIMATE: | 649 case SchedulerStateMachine::ACTION_ANIMATE: |
647 state_machine_.WillAnimate(); | 650 state_machine_.WillAnimate(); |
648 client_->ScheduledActionAnimate(); | 651 client_->ScheduledActionAnimate(); |
649 break; | 652 break; |
650 case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME: | 653 case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME: |
651 compositor_timing_history_->WillBeginMainFrame(); | 654 compositor_timing_history_->WillBeginMainFrame( |
| 655 begin_main_frame_args_.on_critical_path); |
652 state_machine_.WillSendBeginMainFrame(); | 656 state_machine_.WillSendBeginMainFrame(); |
| 657 // TODO(brianderson): Pass begin_main_frame_args_ directly to client. |
653 client_->ScheduledActionSendBeginMainFrame(); | 658 client_->ScheduledActionSendBeginMainFrame(); |
654 break; | 659 break; |
655 case SchedulerStateMachine::ACTION_COMMIT: { | 660 case SchedulerStateMachine::ACTION_COMMIT: { |
656 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is | 661 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is |
657 // fixed. | 662 // fixed. |
658 tracked_objects::ScopedTracker tracking_profile4( | 663 tracked_objects::ScopedTracker tracking_profile4( |
659 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 664 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
660 "461509 Scheduler::ProcessScheduledActions4")); | 665 "461509 Scheduler::ProcessScheduledActions4")); |
661 bool commit_has_no_updates = false; | 666 bool commit_has_no_updates = false; |
662 state_machine_.WillCommit(commit_has_no_updates); | 667 state_machine_.WillCommit(commit_has_no_updates); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 } | 847 } |
843 | 848 |
844 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 849 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
845 return (state_machine_.begin_main_frame_state() == | 850 return (state_machine_.begin_main_frame_state() == |
846 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || | 851 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || |
847 state_machine_.begin_main_frame_state() == | 852 state_machine_.begin_main_frame_state() == |
848 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); | 853 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); |
849 } | 854 } |
850 | 855 |
851 } // namespace cc | 856 } // namespace cc |
OLD | NEW |