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/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { | 303 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { |
304 // These are all the cases where we normally cannot or do not want to draw | 304 // These are all the cases where we normally cannot or do not want to draw |
305 // but, if needs_redraw_ is true and we do not draw to make forward progress, | 305 // but, if needs_redraw_ is true and we do not draw to make forward progress, |
306 // we might deadlock with the main thread. | 306 // we might deadlock with the main thread. |
307 // This should be a superset of PendingActivationsShouldBeForced() since | 307 // This should be a superset of PendingActivationsShouldBeForced() since |
308 // activation of the pending tree is blocked by drawing of the active tree and | 308 // activation of the pending tree is blocked by drawing of the active tree and |
309 // the main thread might be blocked on activation of the most recent commit. | 309 // the main thread might be blocked on activation of the most recent commit. |
310 if (PendingActivationsShouldBeForced()) | 310 if (PendingActivationsShouldBeForced()) |
311 return true; | 311 return true; |
312 | 312 |
| 313 // Impl thread should not draw anymore when texture is acquired by main thread |
| 314 // because texture is controlled under main thread. |
| 315 if (texture_state_ == LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD) |
| 316 return true; |
| 317 |
313 // Additional states where we should abort draws. | 318 // Additional states where we should abort draws. |
314 // Note: We don't force activation in these cases because doing so would | 319 // Note: We don't force activation in these cases because doing so would |
315 // result in checkerboarding on resize, becoming visible, etc. | 320 // result in checkerboarding on resize, becoming visible, etc. |
316 if (!can_draw_) | 321 if (!can_draw_) |
317 return true; | 322 return true; |
318 if (!visible_) | 323 if (!visible_) |
319 return true; | 324 return true; |
320 return false; | 325 return false; |
321 } | 326 } |
322 | 327 |
323 bool SchedulerStateMachine::PendingActivationsShouldBeForced() const { | 328 bool SchedulerStateMachine::PendingActivationsShouldBeForced() const { |
324 // These are all the cases where, if we do not force activations to make | 329 // These are all the cases where, if we do not force activations to make |
325 // forward progress, we might deadlock with the main thread. | 330 // forward progress, we might deadlock with the main thread. |
326 | 331 |
327 // The impl thread cannot lock layer textures unless the pending | |
328 // tree can be activated to unblock the commit. | |
329 if (texture_state_ == LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD) | |
330 return true; | |
331 | |
332 // There is no output surface to trigger our activations. | 332 // There is no output surface to trigger our activations. |
333 if (output_surface_state_ == OUTPUT_SURFACE_LOST) | 333 if (output_surface_state_ == OUTPUT_SURFACE_LOST) |
334 return true; | 334 return true; |
335 | 335 |
336 return false; | 336 return false; |
337 } | 337 } |
338 | 338 |
339 bool SchedulerStateMachine::ShouldBeginOutputSurfaceCreation() const { | 339 bool SchedulerStateMachine::ShouldBeginOutputSurfaceCreation() const { |
340 // Don't try to initialize too early. | 340 // Don't try to initialize too early. |
341 if (!can_start_) | 341 if (!can_start_) |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 if (ShouldBeginOutputSurfaceCreation()) | 561 if (ShouldBeginOutputSurfaceCreation()) |
562 return ACTION_BEGIN_OUTPUT_SURFACE_CREATION; | 562 return ACTION_BEGIN_OUTPUT_SURFACE_CREATION; |
563 return ACTION_NONE; | 563 return ACTION_NONE; |
564 } | 564 } |
565 | 565 |
566 void SchedulerStateMachine::CheckInvariants() { | 566 void SchedulerStateMachine::CheckInvariants() { |
567 // We should never try to perform a draw for readback and forced draw due to | 567 // We should never try to perform a draw for readback and forced draw due to |
568 // timeout simultaneously. | 568 // timeout simultaneously. |
569 DCHECK(!(forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW && | 569 DCHECK(!(forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW && |
570 readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK)); | 570 readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK)); |
| 571 |
| 572 // Main thread should never have the texture locked when there is a pending |
| 573 // tree or active tree is not drawn for the first time. |
| 574 if (has_pending_tree_ || active_tree_needs_first_draw_) |
| 575 DCHECK(texture_state_ != LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD); |
571 } | 576 } |
572 | 577 |
573 void SchedulerStateMachine::UpdateState(Action action) { | 578 void SchedulerStateMachine::UpdateState(Action action) { |
574 switch (action) { | 579 switch (action) { |
575 case ACTION_NONE: | 580 case ACTION_NONE: |
576 return; | 581 return; |
577 | 582 |
578 case ACTION_UPDATE_VISIBLE_TILES: | 583 case ACTION_UPDATE_VISIBLE_TILES: |
579 last_frame_number_update_visible_tiles_was_called_ = | 584 last_frame_number_update_visible_tiles_was_called_ = |
580 current_frame_number_; | 585 current_frame_number_; |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1157 case OUTPUT_SURFACE_ACTIVE: | 1162 case OUTPUT_SURFACE_ACTIVE: |
1158 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: | 1163 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: |
1159 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: | 1164 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: |
1160 return true; | 1165 return true; |
1161 } | 1166 } |
1162 NOTREACHED(); | 1167 NOTREACHED(); |
1163 return false; | 1168 return false; |
1164 } | 1169 } |
1165 | 1170 |
1166 } // namespace cc | 1171 } // namespace cc |
OLD | NEW |