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