| 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" |
| 11 #include "base/values.h" | 11 #include "base/values.h" |
| 12 #include "ui/gfx/frame_time.h" | 12 #include "ui/gfx/frame_time.h" |
| 13 | 13 |
| 14 namespace cc { | 14 namespace cc { |
| 15 | 15 |
| 16 SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) | 16 SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) |
| 17 : settings_(settings), | 17 : settings_(settings), |
| 18 output_surface_state_(OUTPUT_SURFACE_LOST), | 18 output_surface_state_(OUTPUT_SURFACE_LOST), |
| 19 begin_impl_frame_state_(BEGIN_IMPL_FRAME_STATE_IDLE), | 19 begin_impl_frame_state_(BEGIN_IMPL_FRAME_STATE_IDLE), |
| 20 commit_state_(COMMIT_STATE_IDLE), | 20 commit_state_(COMMIT_STATE_IDLE), |
| 21 texture_state_(LAYER_TEXTURE_STATE_UNLOCKED), | |
| 22 forced_redraw_state_(FORCED_REDRAW_STATE_IDLE), | 21 forced_redraw_state_(FORCED_REDRAW_STATE_IDLE), |
| 23 readback_state_(READBACK_STATE_IDLE), | 22 readback_state_(READBACK_STATE_IDLE), |
| 24 commit_count_(0), | 23 commit_count_(0), |
| 25 current_frame_number_(0), | 24 current_frame_number_(0), |
| 26 last_frame_number_swap_performed_(-1), | 25 last_frame_number_swap_performed_(-1), |
| 27 last_frame_number_begin_main_frame_sent_(-1), | 26 last_frame_number_begin_main_frame_sent_(-1), |
| 28 last_frame_number_update_visible_tiles_was_called_(-1), | 27 last_frame_number_update_visible_tiles_was_called_(-1), |
| 29 manage_tiles_funnel_(0), | 28 manage_tiles_funnel_(0), |
| 30 consecutive_checkerboard_animations_(0), | 29 consecutive_checkerboard_animations_(0), |
| 31 needs_redraw_(false), | 30 needs_redraw_(false), |
| 32 needs_manage_tiles_(false), | 31 needs_manage_tiles_(false), |
| 33 swap_used_incomplete_tile_(false), | 32 swap_used_incomplete_tile_(false), |
| 34 needs_commit_(false), | 33 needs_commit_(false), |
| 35 main_thread_needs_layer_textures_(false), | |
| 36 inside_poll_for_anticipated_draw_triggers_(false), | 34 inside_poll_for_anticipated_draw_triggers_(false), |
| 37 visible_(false), | 35 visible_(false), |
| 38 can_start_(false), | 36 can_start_(false), |
| 39 can_draw_(false), | 37 can_draw_(false), |
| 40 has_pending_tree_(false), | 38 has_pending_tree_(false), |
| 41 pending_tree_is_ready_for_activation_(false), | 39 pending_tree_is_ready_for_activation_(false), |
| 42 active_tree_needs_first_draw_(false), | 40 active_tree_needs_first_draw_(false), |
| 43 draw_if_possible_failed_(false), | 41 draw_if_possible_failed_(false), |
| 44 did_create_and_initialize_first_output_surface_(false), | 42 did_create_and_initialize_first_output_surface_(false), |
| 45 smoothness_takes_priority_(false), | 43 smoothness_takes_priority_(false), |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 return "COMMIT_STATE_READY_TO_COMMIT"; | 92 return "COMMIT_STATE_READY_TO_COMMIT"; |
| 95 case COMMIT_STATE_WAITING_FOR_ACTIVATION: | 93 case COMMIT_STATE_WAITING_FOR_ACTIVATION: |
| 96 return "COMMIT_STATE_WAITING_FOR_ACTIVATION"; | 94 return "COMMIT_STATE_WAITING_FOR_ACTIVATION"; |
| 97 case COMMIT_STATE_WAITING_FOR_FIRST_DRAW: | 95 case COMMIT_STATE_WAITING_FOR_FIRST_DRAW: |
| 98 return "COMMIT_STATE_WAITING_FOR_FIRST_DRAW"; | 96 return "COMMIT_STATE_WAITING_FOR_FIRST_DRAW"; |
| 99 } | 97 } |
| 100 NOTREACHED(); | 98 NOTREACHED(); |
| 101 return "???"; | 99 return "???"; |
| 102 } | 100 } |
| 103 | 101 |
| 104 const char* SchedulerStateMachine::TextureStateToString(TextureState state) { | |
| 105 switch (state) { | |
| 106 case LAYER_TEXTURE_STATE_UNLOCKED: | |
| 107 return "LAYER_TEXTURE_STATE_UNLOCKED"; | |
| 108 case LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD: | |
| 109 return "LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD"; | |
| 110 case LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD: | |
| 111 return "LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD"; | |
| 112 } | |
| 113 NOTREACHED(); | |
| 114 return "???"; | |
| 115 } | |
| 116 | |
| 117 const char* SchedulerStateMachine::SynchronousReadbackStateToString( | 102 const char* SchedulerStateMachine::SynchronousReadbackStateToString( |
| 118 SynchronousReadbackState state) { | 103 SynchronousReadbackState state) { |
| 119 switch (state) { | 104 switch (state) { |
| 120 case READBACK_STATE_IDLE: | 105 case READBACK_STATE_IDLE: |
| 121 return "READBACK_STATE_IDLE"; | 106 return "READBACK_STATE_IDLE"; |
| 122 case READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME: | 107 case READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME: |
| 123 return "READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME"; | 108 return "READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME"; |
| 124 case READBACK_STATE_WAITING_FOR_COMMIT: | 109 case READBACK_STATE_WAITING_FOR_COMMIT: |
| 125 return "READBACK_STATE_WAITING_FOR_COMMIT"; | 110 return "READBACK_STATE_WAITING_FOR_COMMIT"; |
| 126 case READBACK_STATE_WAITING_FOR_ACTIVATION: | 111 case READBACK_STATE_WAITING_FOR_ACTIVATION: |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 case ACTION_DRAW_AND_SWAP_IF_POSSIBLE: | 152 case ACTION_DRAW_AND_SWAP_IF_POSSIBLE: |
| 168 return "ACTION_DRAW_AND_SWAP_IF_POSSIBLE"; | 153 return "ACTION_DRAW_AND_SWAP_IF_POSSIBLE"; |
| 169 case ACTION_DRAW_AND_SWAP_FORCED: | 154 case ACTION_DRAW_AND_SWAP_FORCED: |
| 170 return "ACTION_DRAW_AND_SWAP_FORCED"; | 155 return "ACTION_DRAW_AND_SWAP_FORCED"; |
| 171 case ACTION_DRAW_AND_SWAP_ABORT: | 156 case ACTION_DRAW_AND_SWAP_ABORT: |
| 172 return "ACTION_DRAW_AND_SWAP_ABORT"; | 157 return "ACTION_DRAW_AND_SWAP_ABORT"; |
| 173 case ACTION_DRAW_AND_READBACK: | 158 case ACTION_DRAW_AND_READBACK: |
| 174 return "ACTION_DRAW_AND_READBACK"; | 159 return "ACTION_DRAW_AND_READBACK"; |
| 175 case ACTION_BEGIN_OUTPUT_SURFACE_CREATION: | 160 case ACTION_BEGIN_OUTPUT_SURFACE_CREATION: |
| 176 return "ACTION_BEGIN_OUTPUT_SURFACE_CREATION"; | 161 return "ACTION_BEGIN_OUTPUT_SURFACE_CREATION"; |
| 177 case ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD: | |
| 178 return "ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD"; | |
| 179 case ACTION_MANAGE_TILES: | 162 case ACTION_MANAGE_TILES: |
| 180 return "ACTION_MANAGE_TILES"; | 163 return "ACTION_MANAGE_TILES"; |
| 181 } | 164 } |
| 182 NOTREACHED(); | 165 NOTREACHED(); |
| 183 return "???"; | 166 return "???"; |
| 184 } | 167 } |
| 185 | 168 |
| 186 scoped_ptr<base::Value> SchedulerStateMachine::AsValue() const { | 169 scoped_ptr<base::Value> SchedulerStateMachine::AsValue() const { |
| 187 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); | 170 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); |
| 188 | 171 |
| 189 scoped_ptr<base::DictionaryValue> major_state(new base::DictionaryValue); | 172 scoped_ptr<base::DictionaryValue> major_state(new base::DictionaryValue); |
| 190 major_state->SetString("next_action", ActionToString(NextAction())); | 173 major_state->SetString("next_action", ActionToString(NextAction())); |
| 191 major_state->SetString("begin_impl_frame_state", | 174 major_state->SetString("begin_impl_frame_state", |
| 192 BeginImplFrameStateToString(begin_impl_frame_state_)); | 175 BeginImplFrameStateToString(begin_impl_frame_state_)); |
| 193 major_state->SetString("commit_state", CommitStateToString(commit_state_)); | 176 major_state->SetString("commit_state", CommitStateToString(commit_state_)); |
| 194 major_state->SetString("texture_state_", | |
| 195 TextureStateToString(texture_state_)); | |
| 196 major_state->SetString("output_surface_state_", | 177 major_state->SetString("output_surface_state_", |
| 197 OutputSurfaceStateToString(output_surface_state_)); | 178 OutputSurfaceStateToString(output_surface_state_)); |
| 198 major_state->SetString( | 179 major_state->SetString( |
| 199 "forced_redraw_state", | 180 "forced_redraw_state", |
| 200 ForcedRedrawOnTimeoutStateToString(forced_redraw_state_)); | 181 ForcedRedrawOnTimeoutStateToString(forced_redraw_state_)); |
| 201 major_state->SetString("readback_state", | 182 major_state->SetString("readback_state", |
| 202 SynchronousReadbackStateToString(readback_state_)); | 183 SynchronousReadbackStateToString(readback_state_)); |
| 203 state->Set("major_state", major_state.release()); | 184 state->Set("major_state", major_state.release()); |
| 204 | 185 |
| 205 scoped_ptr<base::DictionaryValue> timestamps_state(new base::DictionaryValue); | 186 scoped_ptr<base::DictionaryValue> timestamps_state(new base::DictionaryValue); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 last_frame_number_update_visible_tiles_was_called_); | 228 last_frame_number_update_visible_tiles_was_called_); |
| 248 | 229 |
| 249 minor_state->SetInteger("manage_tiles_funnel", manage_tiles_funnel_); | 230 minor_state->SetInteger("manage_tiles_funnel", manage_tiles_funnel_); |
| 250 minor_state->SetInteger("consecutive_checkerboard_animations", | 231 minor_state->SetInteger("consecutive_checkerboard_animations", |
| 251 consecutive_checkerboard_animations_); | 232 consecutive_checkerboard_animations_); |
| 252 minor_state->SetBoolean("needs_redraw", needs_redraw_); | 233 minor_state->SetBoolean("needs_redraw", needs_redraw_); |
| 253 minor_state->SetBoolean("needs_manage_tiles", needs_manage_tiles_); | 234 minor_state->SetBoolean("needs_manage_tiles", needs_manage_tiles_); |
| 254 minor_state->SetBoolean("swap_used_incomplete_tile", | 235 minor_state->SetBoolean("swap_used_incomplete_tile", |
| 255 swap_used_incomplete_tile_); | 236 swap_used_incomplete_tile_); |
| 256 minor_state->SetBoolean("needs_commit", needs_commit_); | 237 minor_state->SetBoolean("needs_commit", needs_commit_); |
| 257 minor_state->SetBoolean("main_thread_needs_layer_textures", | |
| 258 main_thread_needs_layer_textures_); | |
| 259 minor_state->SetBoolean("visible", visible_); | 238 minor_state->SetBoolean("visible", visible_); |
| 260 minor_state->SetBoolean("can_start", can_start_); | 239 minor_state->SetBoolean("can_start", can_start_); |
| 261 minor_state->SetBoolean("can_draw", can_draw_); | 240 minor_state->SetBoolean("can_draw", can_draw_); |
| 262 minor_state->SetBoolean("has_pending_tree", has_pending_tree_); | 241 minor_state->SetBoolean("has_pending_tree", has_pending_tree_); |
| 263 minor_state->SetBoolean("pending_tree_is_ready_for_activation", | 242 minor_state->SetBoolean("pending_tree_is_ready_for_activation", |
| 264 pending_tree_is_ready_for_activation_); | 243 pending_tree_is_ready_for_activation_); |
| 265 minor_state->SetBoolean("active_tree_needs_first_draw", | 244 minor_state->SetBoolean("active_tree_needs_first_draw", |
| 266 active_tree_needs_first_draw_); | 245 active_tree_needs_first_draw_); |
| 267 minor_state->SetBoolean("draw_if_possible_failed", draw_if_possible_failed_); | 246 minor_state->SetBoolean("draw_if_possible_failed", draw_if_possible_failed_); |
| 268 minor_state->SetBoolean("did_create_and_initialize_first_output_surface", | 247 minor_state->SetBoolean("did_create_and_initialize_first_output_surface", |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { | 289 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { |
| 311 // These are all the cases where we normally cannot or do not want to draw | 290 // These are all the cases where we normally cannot or do not want to draw |
| 312 // but, if needs_redraw_ is true and we do not draw to make forward progress, | 291 // but, if needs_redraw_ is true and we do not draw to make forward progress, |
| 313 // we might deadlock with the main thread. | 292 // we might deadlock with the main thread. |
| 314 // This should be a superset of PendingActivationsShouldBeForced() since | 293 // This should be a superset of PendingActivationsShouldBeForced() since |
| 315 // activation of the pending tree is blocked by drawing of the active tree and | 294 // activation of the pending tree is blocked by drawing of the active tree and |
| 316 // the main thread might be blocked on activation of the most recent commit. | 295 // the main thread might be blocked on activation of the most recent commit. |
| 317 if (PendingActivationsShouldBeForced()) | 296 if (PendingActivationsShouldBeForced()) |
| 318 return true; | 297 return true; |
| 319 | 298 |
| 320 // Impl thread should not draw anymore when texture is acquired by main thread | |
| 321 // because texture is controlled under main thread. | |
| 322 if (texture_state_ == LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD) | |
| 323 return true; | |
| 324 | |
| 325 // Additional states where we should abort draws. | 299 // Additional states where we should abort draws. |
| 326 // Note: We don't force activation in these cases because doing so would | 300 // Note: We don't force activation in these cases because doing so would |
| 327 // result in checkerboarding on resize, becoming visible, etc. | 301 // result in checkerboarding on resize, becoming visible, etc. |
| 328 if (!can_draw_) | 302 if (!can_draw_) |
| 329 return true; | 303 return true; |
| 330 if (!visible_) | 304 if (!visible_) |
| 331 return true; | 305 return true; |
| 332 return false; | 306 return false; |
| 333 } | 307 } |
| 334 | 308 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) | 373 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) |
| 400 return false; | 374 return false; |
| 401 | 375 |
| 402 // Only handle forced redraws due to timeouts on the regular deadline. | 376 // Only handle forced redraws due to timeouts on the regular deadline. |
| 403 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) | 377 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) |
| 404 return true; | 378 return true; |
| 405 | 379 |
| 406 return needs_redraw_; | 380 return needs_redraw_; |
| 407 } | 381 } |
| 408 | 382 |
| 409 bool SchedulerStateMachine::ShouldAcquireLayerTexturesForMainThread() const { | |
| 410 if (!main_thread_needs_layer_textures_) | |
| 411 return false; | |
| 412 if (texture_state_ == LAYER_TEXTURE_STATE_UNLOCKED) | |
| 413 return true; | |
| 414 DCHECK_EQ(texture_state_, LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD); | |
| 415 return false; | |
| 416 } | |
| 417 | |
| 418 bool SchedulerStateMachine::ShouldActivatePendingTree() const { | 383 bool SchedulerStateMachine::ShouldActivatePendingTree() const { |
| 419 // There is nothing to activate. | 384 // There is nothing to activate. |
| 420 if (!has_pending_tree_) | 385 if (!has_pending_tree_) |
| 421 return false; | 386 return false; |
| 422 | 387 |
| 423 // We should not activate a second tree before drawing the first one. | 388 // We should not activate a second tree before drawing the first one. |
| 424 // Even if we need to force activation of the pending tree, we should abort | 389 // Even if we need to force activation of the pending tree, we should abort |
| 425 // drawing the active tree first. | 390 // drawing the active tree first. |
| 426 if (active_tree_needs_first_draw_) | 391 if (active_tree_needs_first_draw_) |
| 427 return false; | 392 return false; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 // Limiting to once per-frame is not enough, since we only want to | 509 // Limiting to once per-frame is not enough, since we only want to |
| 545 // manage tiles _after_ draws. Polling for draw triggers and | 510 // manage tiles _after_ draws. Polling for draw triggers and |
| 546 // begin-frame are mutually exclusive, so we limit to these two cases. | 511 // begin-frame are mutually exclusive, so we limit to these two cases. |
| 547 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE && | 512 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE && |
| 548 !inside_poll_for_anticipated_draw_triggers_) | 513 !inside_poll_for_anticipated_draw_triggers_) |
| 549 return false; | 514 return false; |
| 550 return needs_manage_tiles_; | 515 return needs_manage_tiles_; |
| 551 } | 516 } |
| 552 | 517 |
| 553 SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const { | 518 SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const { |
| 554 if (ShouldAcquireLayerTexturesForMainThread()) | |
| 555 return ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD; | |
| 556 if (ShouldUpdateVisibleTiles()) | 519 if (ShouldUpdateVisibleTiles()) |
| 557 return ACTION_UPDATE_VISIBLE_TILES; | 520 return ACTION_UPDATE_VISIBLE_TILES; |
| 558 if (ShouldActivatePendingTree()) | 521 if (ShouldActivatePendingTree()) |
| 559 return ACTION_ACTIVATE_PENDING_TREE; | 522 return ACTION_ACTIVATE_PENDING_TREE; |
| 560 if (ShouldCommit()) | 523 if (ShouldCommit()) |
| 561 return ACTION_COMMIT; | 524 return ACTION_COMMIT; |
| 562 if (ShouldDraw()) { | 525 if (ShouldDraw()) { |
| 563 if (readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK) | 526 if (readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK) |
| 564 return ACTION_DRAW_AND_READBACK; | 527 return ACTION_DRAW_AND_READBACK; |
| 565 else if (PendingDrawsShouldBeAborted()) | 528 else if (PendingDrawsShouldBeAborted()) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 576 if (ShouldBeginOutputSurfaceCreation()) | 539 if (ShouldBeginOutputSurfaceCreation()) |
| 577 return ACTION_BEGIN_OUTPUT_SURFACE_CREATION; | 540 return ACTION_BEGIN_OUTPUT_SURFACE_CREATION; |
| 578 return ACTION_NONE; | 541 return ACTION_NONE; |
| 579 } | 542 } |
| 580 | 543 |
| 581 void SchedulerStateMachine::CheckInvariants() { | 544 void SchedulerStateMachine::CheckInvariants() { |
| 582 // We should never try to perform a draw for readback and forced draw due to | 545 // We should never try to perform a draw for readback and forced draw due to |
| 583 // timeout simultaneously. | 546 // timeout simultaneously. |
| 584 DCHECK(!(forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW && | 547 DCHECK(!(forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW && |
| 585 readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK)); | 548 readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK)); |
| 586 | |
| 587 // Main thread should never have the texture locked when there is a pending | |
| 588 // tree or active tree is not drawn for the first time. | |
| 589 if (has_pending_tree_ || active_tree_needs_first_draw_) | |
| 590 DCHECK(texture_state_ != LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD); | |
| 591 } | 549 } |
| 592 | 550 |
| 593 void SchedulerStateMachine::UpdateState(Action action) { | 551 void SchedulerStateMachine::UpdateState(Action action) { |
| 594 switch (action) { | 552 switch (action) { |
| 595 case ACTION_NONE: | 553 case ACTION_NONE: |
| 596 return; | 554 return; |
| 597 | 555 |
| 598 case ACTION_UPDATE_VISIBLE_TILES: | 556 case ACTION_UPDATE_VISIBLE_TILES: |
| 599 last_frame_number_update_visible_tiles_was_called_ = | 557 last_frame_number_update_visible_tiles_was_called_ = |
| 600 current_frame_number_; | 558 current_frame_number_; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 output_surface_state_ = OUTPUT_SURFACE_CREATING; | 602 output_surface_state_ = OUTPUT_SURFACE_CREATING; |
| 645 | 603 |
| 646 // The following DCHECKs make sure we are in the proper quiescent state. | 604 // The following DCHECKs make sure we are in the proper quiescent state. |
| 647 // The pipeline should be flushed entirely before we start output | 605 // The pipeline should be flushed entirely before we start output |
| 648 // surface creation to avoid complicated corner cases. | 606 // surface creation to avoid complicated corner cases. |
| 649 DCHECK_EQ(commit_state_, COMMIT_STATE_IDLE); | 607 DCHECK_EQ(commit_state_, COMMIT_STATE_IDLE); |
| 650 DCHECK(!has_pending_tree_); | 608 DCHECK(!has_pending_tree_); |
| 651 DCHECK(!active_tree_needs_first_draw_); | 609 DCHECK(!active_tree_needs_first_draw_); |
| 652 return; | 610 return; |
| 653 | 611 |
| 654 case ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD: | |
| 655 texture_state_ = LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD; | |
| 656 main_thread_needs_layer_textures_ = false; | |
| 657 return; | |
| 658 | |
| 659 case ACTION_MANAGE_TILES: | 612 case ACTION_MANAGE_TILES: |
| 660 UpdateStateOnManageTiles(); | 613 UpdateStateOnManageTiles(); |
| 661 return; | 614 return; |
| 662 } | 615 } |
| 663 } | 616 } |
| 664 | 617 |
| 665 void SchedulerStateMachine::UpdateStateOnCommit(bool commit_was_aborted) { | 618 void SchedulerStateMachine::UpdateStateOnCommit(bool commit_was_aborted) { |
| 666 commit_count_++; | 619 commit_count_++; |
| 667 | 620 |
| 668 if (commit_was_aborted || settings_.main_frame_before_activation_enabled) { | 621 if (commit_was_aborted || settings_.main_frame_before_activation_enabled) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 needs_redraw_ = true; | 682 needs_redraw_ = true; |
| 730 active_tree_needs_first_draw_ = true; | 683 active_tree_needs_first_draw_ = true; |
| 731 } | 684 } |
| 732 | 685 |
| 733 // This post-commit work is common to both completed and aborted commits. | 686 // This post-commit work is common to both completed and aborted commits. |
| 734 pending_tree_is_ready_for_activation_ = false; | 687 pending_tree_is_ready_for_activation_ = false; |
| 735 | 688 |
| 736 if (draw_if_possible_failed_) | 689 if (draw_if_possible_failed_) |
| 737 last_frame_number_swap_performed_ = -1; | 690 last_frame_number_swap_performed_ = -1; |
| 738 | 691 |
| 739 // If we are planing to draw with the new commit, lock the layer textures for | |
| 740 // use on the impl thread. Otherwise, leave them unlocked. | |
| 741 if (has_pending_tree_ || needs_redraw_) | |
| 742 texture_state_ = LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD; | |
| 743 else | |
| 744 texture_state_ = LAYER_TEXTURE_STATE_UNLOCKED; | |
| 745 | |
| 746 if (continuous_painting_) | 692 if (continuous_painting_) |
| 747 needs_commit_ = true; | 693 needs_commit_ = true; |
| 748 } | 694 } |
| 749 | 695 |
| 750 void SchedulerStateMachine::UpdateStateOnActivation() { | 696 void SchedulerStateMachine::UpdateStateOnActivation() { |
| 751 if (commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION) | 697 if (commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION) |
| 752 commit_state_ = COMMIT_STATE_IDLE; | 698 commit_state_ = COMMIT_STATE_IDLE; |
| 753 | 699 |
| 754 if (output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION) | 700 if (output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION) |
| 755 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; | 701 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 798 // pending BeginMainFrame behind the readback request. | 744 // pending BeginMainFrame behind the readback request. |
| 799 commit_state_ = COMMIT_STATE_BEGIN_MAIN_FRAME_SENT; | 745 commit_state_ = COMMIT_STATE_BEGIN_MAIN_FRAME_SENT; |
| 800 readback_state_ = READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT; | 746 readback_state_ = READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT; |
| 801 } else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) { | 747 } else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) { |
| 802 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; | 748 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; |
| 803 } | 749 } |
| 804 | 750 |
| 805 if (commit_state_ == COMMIT_STATE_WAITING_FOR_FIRST_DRAW) | 751 if (commit_state_ == COMMIT_STATE_WAITING_FOR_FIRST_DRAW) |
| 806 commit_state_ = COMMIT_STATE_IDLE; | 752 commit_state_ = COMMIT_STATE_IDLE; |
| 807 | 753 |
| 808 if (texture_state_ == LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD) | |
| 809 texture_state_ = LAYER_TEXTURE_STATE_UNLOCKED; | |
| 810 | |
| 811 needs_redraw_ = false; | 754 needs_redraw_ = false; |
| 812 draw_if_possible_failed_ = false; | 755 draw_if_possible_failed_ = false; |
| 813 active_tree_needs_first_draw_ = false; | 756 active_tree_needs_first_draw_ = false; |
| 814 | 757 |
| 815 if (did_swap) | 758 if (did_swap) |
| 816 last_frame_number_swap_performed_ = current_frame_number_; | 759 last_frame_number_swap_performed_ = current_frame_number_; |
| 817 } | 760 } |
| 818 | 761 |
| 819 void SchedulerStateMachine::UpdateStateOnManageTiles() { | 762 void SchedulerStateMachine::UpdateStateOnManageTiles() { |
| 820 needs_manage_tiles_ = false; | 763 needs_manage_tiles_ = false; |
| 821 } | 764 } |
| 822 | 765 |
| 823 void SchedulerStateMachine::SetMainThreadNeedsLayerTextures() { | |
| 824 DCHECK(!main_thread_needs_layer_textures_); | |
| 825 DCHECK_NE(texture_state_, LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD); | |
| 826 main_thread_needs_layer_textures_ = true; | |
| 827 } | |
| 828 | |
| 829 void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() { | 766 void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() { |
| 830 skip_next_begin_main_frame_to_reduce_latency_ = true; | 767 skip_next_begin_main_frame_to_reduce_latency_ = true; |
| 831 } | 768 } |
| 832 | 769 |
| 833 bool SchedulerStateMachine::BeginImplFrameNeeded() const { | 770 bool SchedulerStateMachine::BeginImplFrameNeeded() const { |
| 834 // Proactive BeginImplFrames are bad for the synchronous compositor because we | 771 // Proactive BeginImplFrames are bad for the synchronous compositor because we |
| 835 // have to draw when we get the BeginImplFrame and could end up drawing many | 772 // have to draw when we get the BeginImplFrame and could end up drawing many |
| 836 // duplicate frames if our new frame isn't ready in time. | 773 // duplicate frames if our new frame isn't ready in time. |
| 837 // To poll for state with the synchronous compositor without having to draw, | 774 // To poll for state with the synchronous compositor without having to draw, |
| 838 // we rely on ShouldPollForAnticipatedDrawTriggers instead. | 775 // we rely on ShouldPollForAnticipatedDrawTriggers instead. |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1222 case OUTPUT_SURFACE_ACTIVE: | 1159 case OUTPUT_SURFACE_ACTIVE: |
| 1223 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: | 1160 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: |
| 1224 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: | 1161 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: |
| 1225 return true; | 1162 return true; |
| 1226 } | 1163 } |
| 1227 NOTREACHED(); | 1164 NOTREACHED(); |
| 1228 return false; | 1165 return false; |
| 1229 } | 1166 } |
| 1230 | 1167 |
| 1231 } // namespace cc | 1168 } // namespace cc |
| OLD | NEW |