| 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 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 state_machine_.SetSkipNextBeginMainFrameToReduceLatency(); | 389 state_machine_.SetSkipNextBeginMainFrameToReduceLatency(); |
| 390 } else if (ShouldRecoverImplLatency(adjusted_args, | 390 } else if (ShouldRecoverImplLatency(adjusted_args, |
| 391 can_activate_before_deadline)) { | 391 can_activate_before_deadline)) { |
| 392 TRACE_EVENT_INSTANT0("cc", "SkipBeginImplFrameToReduceLatency", | 392 TRACE_EVENT_INSTANT0("cc", "SkipBeginImplFrameToReduceLatency", |
| 393 TRACE_EVENT_SCOPE_THREAD); | 393 TRACE_EVENT_SCOPE_THREAD); |
| 394 if (begin_frame_source_) | 394 if (begin_frame_source_) |
| 395 begin_frame_source_->DidFinishFrame(this, 0); | 395 begin_frame_source_->DidFinishFrame(this, 0); |
| 396 return; | 396 return; |
| 397 } | 397 } |
| 398 | 398 |
| 399 state_machine_.SetBeginFrameAllowsLatencyOptimizations( |
| 400 adjusted_args.allow_latency_optimizations); |
| 401 |
| 399 BeginImplFrame(adjusted_args); | 402 BeginImplFrame(adjusted_args); |
| 400 } | 403 } |
| 401 | 404 |
| 402 void Scheduler::BeginImplFrameSynchronous(const BeginFrameArgs& args) { | 405 void Scheduler::BeginImplFrameSynchronous(const BeginFrameArgs& args) { |
| 403 TRACE_EVENT1("cc,benchmark", "Scheduler::BeginImplFrame", "args", | 406 TRACE_EVENT1("cc,benchmark", "Scheduler::BeginImplFrame", "args", |
| 404 args.AsValue()); | 407 args.AsValue()); |
| 405 | 408 |
| 406 // The main thread currently can't commit before we draw with the | 409 // The main thread currently can't commit before we draw with the |
| 407 // synchronous compositor, so never consider the BeginMainFrame fast. | 410 // synchronous compositor, so never consider the BeginMainFrame fast. |
| 408 state_machine_.SetCriticalBeginMainFrameToActivateIsFast(false); | 411 state_machine_.SetCriticalBeginMainFrameToActivateIsFast(false); |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 | 692 |
| 690 // The main thread is in a low latency mode and there's no need to recover. | 693 // The main thread is in a low latency mode and there's no need to recover. |
| 691 if (!state_machine_.main_thread_missed_last_deadline()) | 694 if (!state_machine_.main_thread_missed_last_deadline()) |
| 692 return false; | 695 return false; |
| 693 | 696 |
| 694 // When prioritizing impl thread latency, we currently put the | 697 // When prioritizing impl thread latency, we currently put the |
| 695 // main thread in a high latency mode. Don't try to fight it. | 698 // main thread in a high latency mode. Don't try to fight it. |
| 696 if (state_machine_.ImplLatencyTakesPriority()) | 699 if (state_machine_.ImplLatencyTakesPriority()) |
| 697 return false; | 700 return false; |
| 698 | 701 |
| 702 // If the args explicitly forbid it, we shouldn't skip BeginMainFrames. |
| 703 if (!args.allow_latency_optimizations) |
| 704 return false; |
| 705 |
| 699 return can_activate_before_deadline; | 706 return can_activate_before_deadline; |
| 700 } | 707 } |
| 701 | 708 |
| 702 bool Scheduler::ShouldRecoverImplLatency( | 709 bool Scheduler::ShouldRecoverImplLatency( |
| 703 const BeginFrameArgs& args, | 710 const BeginFrameArgs& args, |
| 704 bool can_activate_before_deadline) const { | 711 bool can_activate_before_deadline) const { |
| 705 DCHECK(!settings_.using_synchronous_renderer_compositor); | 712 DCHECK(!settings_.using_synchronous_renderer_compositor); |
| 706 | 713 |
| 707 if (!settings_.enable_latency_recovery) | 714 if (!settings_.enable_latency_recovery) |
| 708 return false; | 715 return false; |
| 709 | 716 |
| 710 // Disable impl thread latency recovery when using the unthrottled | 717 // Disable impl thread latency recovery when using the unthrottled |
| 711 // begin frame source since we will always get a BeginFrame before | 718 // begin frame source since we will always get a BeginFrame before |
| 712 // the swap ack and our heuristics below will not work. | 719 // the swap ack and our heuristics below will not work. |
| 713 if (begin_frame_source_ && !begin_frame_source_->IsThrottled()) | 720 if (begin_frame_source_ && !begin_frame_source_->IsThrottled()) |
| 714 return false; | 721 return false; |
| 715 | 722 |
| 716 // If we are swap throttled at the BeginFrame, that means the impl thread is | 723 // If we are swap throttled at the BeginFrame, that means the impl thread is |
| 717 // very likely in a high latency mode. | 724 // very likely in a high latency mode. |
| 718 bool impl_thread_is_likely_high_latency = state_machine_.IsDrawThrottled(); | 725 bool impl_thread_is_likely_high_latency = state_machine_.IsDrawThrottled(); |
| 719 if (!impl_thread_is_likely_high_latency) | 726 if (!impl_thread_is_likely_high_latency) |
| 720 return false; | 727 return false; |
| 721 | 728 |
| 729 // If the args explicitly forbid it, we shouldn't skip BeginFrames. |
| 730 if (!args.allow_latency_optimizations) |
| 731 return false; |
| 732 |
| 722 // The deadline may be in the past if our draw time is too long. | 733 // The deadline may be in the past if our draw time is too long. |
| 723 bool can_draw_before_deadline = args.frame_time < args.deadline; | 734 bool can_draw_before_deadline = args.frame_time < args.deadline; |
| 724 | 735 |
| 725 // When prioritizing impl thread latency, the deadline doesn't wait | 736 // When prioritizing impl thread latency, the deadline doesn't wait |
| 726 // for the main thread. | 737 // for the main thread. |
| 727 if (state_machine_.ImplLatencyTakesPriority()) | 738 if (state_machine_.ImplLatencyTakesPriority()) |
| 728 return can_draw_before_deadline; | 739 return can_draw_before_deadline; |
| 729 | 740 |
| 730 // If we only have impl-side updates, the deadline doesn't wait for | 741 // If we only have impl-side updates, the deadline doesn't wait for |
| 731 // the main thread. | 742 // the main thread. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 751 } | 762 } |
| 752 | 763 |
| 753 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 764 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
| 754 return (state_machine_.begin_main_frame_state() == | 765 return (state_machine_.begin_main_frame_state() == |
| 755 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || | 766 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT || |
| 756 state_machine_.begin_main_frame_state() == | 767 state_machine_.begin_main_frame_state() == |
| 757 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); | 768 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); |
| 758 } | 769 } |
| 759 | 770 |
| 760 } // namespace cc | 771 } // namespace cc |
| OLD | NEW |