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 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 base::TimeTicks main_thread_start_time) { | 269 base::TimeTicks main_thread_start_time) { |
270 TRACE_EVENT0("cc", "Scheduler::NotifyBeginMainFrameStarted"); | 270 TRACE_EVENT0("cc", "Scheduler::NotifyBeginMainFrameStarted"); |
271 state_machine_.NotifyBeginMainFrameStarted(); | 271 state_machine_.NotifyBeginMainFrameStarted(); |
272 compositor_timing_history_->BeginMainFrameStarted(main_thread_start_time); | 272 compositor_timing_history_->BeginMainFrameStarted(main_thread_start_time); |
273 } | 273 } |
274 | 274 |
275 base::TimeTicks Scheduler::LastBeginImplFrameTime() { | 275 base::TimeTicks Scheduler::LastBeginImplFrameTime() { |
276 return begin_impl_frame_tracker_.Current().frame_time; | 276 return begin_impl_frame_tracker_.Current().frame_time; |
277 } | 277 } |
278 | 278 |
| 279 void Scheduler::BeginImplFrameNotExpectedSoon() { |
| 280 compositor_timing_history_->BeginImplFrameNotExpectedSoon(); |
| 281 |
| 282 // Tying this to SendBeginMainFrameNotExpectedSoon will have some |
| 283 // false negatives, but we want to avoid running long idle tasks when |
| 284 // we are actually active. |
| 285 client_->SendBeginMainFrameNotExpectedSoon(); |
| 286 } |
| 287 |
279 void Scheduler::SetupNextBeginFrameIfNeeded() { | 288 void Scheduler::SetupNextBeginFrameIfNeeded() { |
280 // Never call SetNeedsBeginFrames if the frame source already has the right | 289 // Never call SetNeedsBeginFrames if the frame source already has the right |
281 // value. | 290 // value. |
282 if (frame_source_->NeedsBeginFrames() != state_machine_.BeginFrameNeeded()) { | 291 if (frame_source_->NeedsBeginFrames() != state_machine_.BeginFrameNeeded()) { |
283 if (state_machine_.BeginFrameNeeded()) { | 292 if (state_machine_.BeginFrameNeeded()) { |
284 // Call SetNeedsBeginFrames(true) as soon as possible. | 293 // Call SetNeedsBeginFrames(true) as soon as possible. |
285 frame_source_->SetNeedsBeginFrames(true); | 294 frame_source_->SetNeedsBeginFrames(true); |
286 devtools_instrumentation::NeedsBeginFrameChanged(layer_tree_host_id_, | 295 devtools_instrumentation::NeedsBeginFrameChanged(layer_tree_host_id_, |
287 true); | 296 true); |
288 } else if (state_machine_.begin_impl_frame_state() == | 297 } else if (state_machine_.begin_impl_frame_state() == |
289 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) { | 298 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) { |
290 // Call SetNeedsBeginFrames(false) in between frames only. | 299 // Call SetNeedsBeginFrames(false) in between frames only. |
291 frame_source_->SetNeedsBeginFrames(false); | 300 frame_source_->SetNeedsBeginFrames(false); |
292 client_->SendBeginMainFrameNotExpectedSoon(); | 301 BeginImplFrameNotExpectedSoon(); |
293 devtools_instrumentation::NeedsBeginFrameChanged(layer_tree_host_id_, | 302 devtools_instrumentation::NeedsBeginFrameChanged(layer_tree_host_id_, |
294 false); | 303 false); |
295 } | 304 } |
296 } | 305 } |
297 | 306 |
298 PostBeginRetroFrameIfNeeded(); | 307 PostBeginRetroFrameIfNeeded(); |
299 } | 308 } |
300 | 309 |
301 // BeginFrame is the mechanism that tells us that now is a good time to start | 310 // BeginFrame is the mechanism that tells us that now is a good time to start |
302 // making a frame. Usually this means that user input for the frame is complete. | 311 // making a frame. Usually this means that user input for the frame is complete. |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 TRACE_EVENT1("cc,benchmark", "Scheduler::BeginImplFrame", "args", | 533 TRACE_EVENT1("cc,benchmark", "Scheduler::BeginImplFrame", "args", |
525 args.AsValue()); | 534 args.AsValue()); |
526 | 535 |
527 // The main thread currently can't commit before we draw with the | 536 // The main thread currently can't commit before we draw with the |
528 // synchronous compositor, so never consider the BeginMainFrame fast. | 537 // synchronous compositor, so never consider the BeginMainFrame fast. |
529 state_machine_.SetCriticalBeginMainFrameToActivateIsFast(false); | 538 state_machine_.SetCriticalBeginMainFrameToActivateIsFast(false); |
530 begin_main_frame_args_ = args; | 539 begin_main_frame_args_ = args; |
531 begin_main_frame_args_.on_critical_path = !ImplLatencyTakesPriority(); | 540 begin_main_frame_args_.on_critical_path = !ImplLatencyTakesPriority(); |
532 | 541 |
533 BeginImplFrame(args); | 542 BeginImplFrame(args); |
| 543 compositor_timing_history_->WillFinishImplFrame( |
| 544 state_machine_.needs_redraw()); |
534 FinishImplFrame(); | 545 FinishImplFrame(); |
535 } | 546 } |
536 | 547 |
537 void Scheduler::FinishImplFrame() { | 548 void Scheduler::FinishImplFrame() { |
538 state_machine_.OnBeginImplFrameIdle(); | 549 state_machine_.OnBeginImplFrameIdle(); |
539 ProcessScheduledActions(); | 550 ProcessScheduledActions(); |
540 | 551 |
541 client_->DidFinishImplFrame(); | 552 client_->DidFinishImplFrame(); |
542 frame_source_->DidFinishFrame(begin_retro_frame_args_.size()); | 553 frame_source_->DidFinishFrame(begin_retro_frame_args_.size()); |
543 begin_impl_frame_tracker_.Finish(); | 554 begin_impl_frame_tracker_.Finish(); |
544 } | 555 } |
545 | 556 |
546 // BeginImplFrame starts a compositor frame that will wait up until a deadline | 557 // BeginImplFrame starts a compositor frame that will wait up until a deadline |
547 // for a BeginMainFrame+activation to complete before it times out and draws | 558 // for a BeginMainFrame+activation to complete before it times out and draws |
548 // any asynchronous animation and scroll/pinch updates. | 559 // any asynchronous animation and scroll/pinch updates. |
549 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { | 560 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { |
550 DCHECK_EQ(state_machine_.begin_impl_frame_state(), | 561 DCHECK_EQ(state_machine_.begin_impl_frame_state(), |
551 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 562 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
552 DCHECK(!BeginImplFrameDeadlinePending()); | 563 DCHECK(!BeginImplFrameDeadlinePending()); |
553 DCHECK(state_machine_.HasInitializedOutputSurface()); | 564 DCHECK(state_machine_.HasInitializedOutputSurface()); |
554 | 565 |
555 begin_impl_frame_tracker_.Start(args); | 566 begin_impl_frame_tracker_.Start(args); |
556 state_machine_.OnBeginImplFrame(); | 567 state_machine_.OnBeginImplFrame(); |
557 devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); | 568 devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); |
| 569 compositor_timing_history_->WillBeginImplFrame( |
| 570 state_machine_.NewActiveTreeLikely()); |
558 client_->WillBeginImplFrame(begin_impl_frame_tracker_.Current()); | 571 client_->WillBeginImplFrame(begin_impl_frame_tracker_.Current()); |
559 | 572 |
560 ProcessScheduledActions(); | 573 ProcessScheduledActions(); |
561 } | 574 } |
562 | 575 |
563 void Scheduler::ScheduleBeginImplFrameDeadline() { | 576 void Scheduler::ScheduleBeginImplFrameDeadline() { |
564 // The synchronous compositor does not post a deadline task. | 577 // The synchronous compositor does not post a deadline task. |
565 DCHECK(!settings_.using_synchronous_renderer_compositor); | 578 DCHECK(!settings_.using_synchronous_renderer_compositor); |
566 | 579 |
567 begin_impl_frame_deadline_task_.Cancel(); | 580 begin_impl_frame_deadline_task_.Cancel(); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 // the deadline separately. For example: | 646 // the deadline separately. For example: |
634 // * Sending the BeginMainFrame will not occur after the deadline in | 647 // * Sending the BeginMainFrame will not occur after the deadline in |
635 // order to wait for more user-input before starting the next commit. | 648 // order to wait for more user-input before starting the next commit. |
636 // * Creating a new OuputSurface will not occur during the deadline in | 649 // * Creating a new OuputSurface will not occur during the deadline in |
637 // order to allow the state machine to "settle" first. | 650 // order to allow the state machine to "settle" first. |
638 | 651 |
639 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed. | 652 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed. |
640 tracked_objects::ScopedTracker tracking_profile1( | 653 tracked_objects::ScopedTracker tracking_profile1( |
641 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 654 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
642 "461509 Scheduler::OnBeginImplFrameDeadline1")); | 655 "461509 Scheduler::OnBeginImplFrameDeadline1")); |
| 656 compositor_timing_history_->WillFinishImplFrame( |
| 657 state_machine_.needs_redraw()); |
643 state_machine_.OnBeginImplFrameDeadline(); | 658 state_machine_.OnBeginImplFrameDeadline(); |
644 ProcessScheduledActions(); | 659 ProcessScheduledActions(); |
645 FinishImplFrame(); | 660 FinishImplFrame(); |
646 } | 661 } |
647 | 662 |
648 void Scheduler::DrawAndSwapIfPossible() { | 663 void Scheduler::DrawAndSwapIfPossible() { |
| 664 bool drawing_with_new_active_tree = |
| 665 state_machine_.active_tree_needs_first_draw(); |
| 666 compositor_timing_history_->WillDraw(); |
649 state_machine_.WillDraw(); | 667 state_machine_.WillDraw(); |
650 compositor_timing_history_->WillDraw(); | |
651 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); | 668 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); |
652 compositor_timing_history_->DidDraw(); | |
653 state_machine_.DidDraw(result); | 669 state_machine_.DidDraw(result); |
| 670 compositor_timing_history_->DidDraw(drawing_with_new_active_tree); |
654 } | 671 } |
655 | 672 |
656 void Scheduler::DrawAndSwapForced() { | 673 void Scheduler::DrawAndSwapForced() { |
| 674 bool drawing_with_new_active_tree = |
| 675 state_machine_.active_tree_needs_first_draw(); |
| 676 compositor_timing_history_->WillDraw(); |
657 state_machine_.WillDraw(); | 677 state_machine_.WillDraw(); |
658 compositor_timing_history_->WillDraw(); | |
659 DrawResult result = client_->ScheduledActionDrawAndSwapForced(); | 678 DrawResult result = client_->ScheduledActionDrawAndSwapForced(); |
660 compositor_timing_history_->DidDraw(); | |
661 state_machine_.DidDraw(result); | 679 state_machine_.DidDraw(result); |
| 680 compositor_timing_history_->DidDraw(drawing_with_new_active_tree); |
662 } | 681 } |
663 | 682 |
664 void Scheduler::SetDeferCommits(bool defer_commits) { | 683 void Scheduler::SetDeferCommits(bool defer_commits) { |
665 TRACE_EVENT1("cc", "Scheduler::SetDeferCommits", | 684 TRACE_EVENT1("cc", "Scheduler::SetDeferCommits", |
666 "defer_commits", | 685 "defer_commits", |
667 defer_commits); | 686 defer_commits); |
668 state_machine_.SetDeferCommits(defer_commits); | 687 state_machine_.SetDeferCommits(defer_commits); |
669 ProcessScheduledActions(); | 688 ProcessScheduledActions(); |
670 } | 689 } |
671 | 690 |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 } | 905 } |
887 | 906 |
888 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 907 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
889 return (state_machine_.begin_main_frame_state() == | 908 return (state_machine_.begin_main_frame_state() == |
890 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || | 909 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || |
891 state_machine_.begin_main_frame_state() == | 910 state_machine_.begin_main_frame_state() == |
892 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); | 911 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); |
893 } | 912 } |
894 | 913 |
895 } // namespace cc | 914 } // namespace cc |
OLD | NEW |