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_state_machine.h" | 5 #include "cc/scheduler/scheduler_state_machine.h" |
6 | 6 |
7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 | 360 |
361 // Do not queue too many swaps. | 361 // Do not queue too many swaps. |
362 if (SwapThrottled()) | 362 if (SwapThrottled()) |
363 return false; | 363 return false; |
364 | 364 |
365 // Except for the cases above, do not draw outside of the BeginImplFrame | 365 // Except for the cases above, do not draw outside of the BeginImplFrame |
366 // deadline. | 366 // deadline. |
367 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) | 367 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) |
368 return false; | 368 return false; |
369 | 369 |
| 370 if (wait_for_ready_to_draw_) |
| 371 return false; |
| 372 |
370 // Only handle forced redraws due to timeouts on the regular deadline. | 373 // Only handle forced redraws due to timeouts on the regular deadline. |
371 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) | 374 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) |
372 return true; | 375 return true; |
373 | 376 |
374 return needs_redraw_; | 377 return needs_redraw_; |
375 } | 378 } |
376 | 379 |
377 bool SchedulerStateMachine::ShouldActivatePendingTree() const { | 380 bool SchedulerStateMachine::ShouldActivatePendingTree() const { |
378 // There is nothing to activate. | 381 // There is nothing to activate. |
379 if (!has_pending_tree_) | 382 if (!has_pending_tree_) |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 bool SchedulerStateMachine::ShouldCommit() const { | 480 bool SchedulerStateMachine::ShouldCommit() const { |
478 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT) | 481 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT) |
479 return false; | 482 return false; |
480 | 483 |
481 // We must not finish the commit until the pending tree is free. | 484 // We must not finish the commit until the pending tree is free. |
482 if (has_pending_tree_) { | 485 if (has_pending_tree_) { |
483 DCHECK(settings_.main_frame_before_activation_enabled); | 486 DCHECK(settings_.main_frame_before_activation_enabled); |
484 return false; | 487 return false; |
485 } | 488 } |
486 | 489 |
| 490 // Active tree resources might still be in use until the Display draws. |
| 491 if (settings_.commit_to_active_tree && SwapThrottled()) |
| 492 return false; |
| 493 |
487 // If we only have an active tree, it is incorrect to replace it | 494 // If we only have an active tree, it is incorrect to replace it |
488 // before we've drawn it. | 495 // before we've drawn it. |
489 DCHECK(!settings_.commit_to_active_tree || !active_tree_needs_first_draw_); | 496 DCHECK(!settings_.commit_to_active_tree || !active_tree_needs_first_draw_); |
490 | 497 |
491 return true; | 498 return true; |
492 } | 499 } |
493 | 500 |
494 bool SchedulerStateMachine::ShouldPrepareTiles() const { | 501 bool SchedulerStateMachine::ShouldPrepareTiles() const { |
495 // PrepareTiles only really needs to be called immediately after commit | 502 // PrepareTiles only really needs to be called immediately after commit |
496 // and then periodically after that. Use a funnel to make sure we average | 503 // and then periodically after that. Use a funnel to make sure we average |
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 } | 1029 } |
1023 | 1030 |
1024 void SchedulerStateMachine::SetNeedsOneBeginImplFrame() { | 1031 void SchedulerStateMachine::SetNeedsOneBeginImplFrame() { |
1025 needs_one_begin_impl_frame_ = true; | 1032 needs_one_begin_impl_frame_ = true; |
1026 } | 1033 } |
1027 | 1034 |
1028 void SchedulerStateMachine::NotifyReadyToCommit() { | 1035 void SchedulerStateMachine::NotifyReadyToCommit() { |
1029 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED) | 1036 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED) |
1030 << AsValue()->ToString(); | 1037 << AsValue()->ToString(); |
1031 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT; | 1038 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT; |
1032 // In commit_to_active_tree mode, commit should happen right after | |
1033 // BeginFrame, meaning when this function is called, next action should be | |
1034 // commit. | |
1035 if (settings_.commit_to_active_tree) | |
1036 DCHECK(ShouldCommit()); | |
1037 } | 1039 } |
1038 | 1040 |
1039 void SchedulerStateMachine::BeginMainFrameAborted(CommitEarlyOutReason reason) { | 1041 void SchedulerStateMachine::BeginMainFrameAborted(CommitEarlyOutReason reason) { |
1040 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED); | 1042 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED); |
1041 | 1043 |
1042 // If the main thread aborted, it doesn't matter if the main thread missed | 1044 // If the main thread aborted, it doesn't matter if the main thread missed |
1043 // the last deadline since it didn't have an update anyway. | 1045 // the last deadline since it didn't have an update anyway. |
1044 main_thread_missed_last_deadline_ = false; | 1046 main_thread_missed_last_deadline_ = false; |
1045 | 1047 |
1046 switch (reason) { | 1048 switch (reason) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1110 case COMPOSITOR_FRAME_SINK_ACTIVE: | 1112 case COMPOSITOR_FRAME_SINK_ACTIVE: |
1111 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT: | 1113 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT: |
1112 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION: | 1114 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION: |
1113 return true; | 1115 return true; |
1114 } | 1116 } |
1115 NOTREACHED(); | 1117 NOTREACHED(); |
1116 return false; | 1118 return false; |
1117 } | 1119 } |
1118 | 1120 |
1119 } // namespace cc | 1121 } // namespace cc |
OLD | NEW |