Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: cc/scheduler/scheduler_state_machine.cc

Issue 23907006: cc: Allow sending BeginMainFrame before draw or activation (Closed) Base URL: http://git.chromium.org/chromium/src.git@schedDeadline3
Patch Set: Fix smoothness mode Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } 80 }
81 81
82 const char* SchedulerStateMachine::CommitStateToString(CommitState state) { 82 const char* SchedulerStateMachine::CommitStateToString(CommitState state) {
83 switch (state) { 83 switch (state) {
84 case COMMIT_STATE_IDLE: 84 case COMMIT_STATE_IDLE:
85 return "COMMIT_STATE_IDLE"; 85 return "COMMIT_STATE_IDLE";
86 case COMMIT_STATE_FRAME_IN_PROGRESS: 86 case COMMIT_STATE_FRAME_IN_PROGRESS:
87 return "COMMIT_STATE_FRAME_IN_PROGRESS"; 87 return "COMMIT_STATE_FRAME_IN_PROGRESS";
88 case COMMIT_STATE_READY_TO_COMMIT: 88 case COMMIT_STATE_READY_TO_COMMIT:
89 return "COMMIT_STATE_READY_TO_COMMIT"; 89 return "COMMIT_STATE_READY_TO_COMMIT";
90 case COMMIT_STATE_WAITING_FOR_FIRST_DRAW:
91 return "COMMIT_STATE_WAITING_FOR_FIRST_DRAW";
92 } 90 }
93 NOTREACHED(); 91 NOTREACHED();
94 return "???"; 92 return "???";
95 } 93 }
96 94
97 const char* SchedulerStateMachine::TextureStateToString(TextureState state) { 95 const char* SchedulerStateMachine::TextureStateToString(TextureState state) {
98 switch (state) { 96 switch (state) {
99 case LAYER_TEXTURE_STATE_UNLOCKED: 97 case LAYER_TEXTURE_STATE_UNLOCKED:
100 return "LAYER_TEXTURE_STATE_UNLOCKED"; 98 return "LAYER_TEXTURE_STATE_UNLOCKED";
101 case LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD: 99 case LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD:
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 } 351 }
354 352
355 bool SchedulerStateMachine::ShouldDraw() const { 353 bool SchedulerStateMachine::ShouldDraw() const {
356 // After a readback, make sure not to draw again until we've replaced the 354 // After a readback, make sure not to draw again until we've replaced the
357 // readback commit with a real one. 355 // readback commit with a real one.
358 if (readback_state_ == READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT || 356 if (readback_state_ == READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT ||
359 readback_state_ == READBACK_STATE_WAITING_FOR_REPLACEMENT_ACTIVATION) 357 readback_state_ == READBACK_STATE_WAITING_FOR_REPLACEMENT_ACTIVATION)
360 return false; 358 return false;
361 359
362 // Draw immediately for readbacks to unblock the main thread quickly. 360 // Draw immediately for readbacks to unblock the main thread quickly.
363 if (readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK) { 361 if (readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK)
364 DCHECK_EQ(commit_state_, COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
365 return true; 362 return true;
366 }
367 363
368 // If we need to abort draws, we should do so ASAP since the draw could 364 // If we need to abort draws, we should do so ASAP since the draw could
369 // be blocking other important actions (like output surface initialization), 365 // be blocking other important actions (like output surface initialization),
370 // from occuring. If we are waiting for the first draw, then perfom the 366 // from occuring. If we are waiting for the first draw, then perfom the
371 // aborted draw to keep things moving. If we are not waiting for the first 367 // aborted draw to keep things moving. If we are not waiting for the first
372 // draw however, we don't want to abort for no reason. 368 // draw however, we don't want to abort for no reason.
373 if (PendingDrawsShouldBeAborted()) 369 if (PendingDrawsShouldBeAborted())
374 return active_tree_needs_first_draw_; 370 return active_tree_needs_first_draw_;
375 371
376 // After this line, we only want to swap once per frame. 372 // After this line, we only want to swap once per frame.
377 if (HasSwappedThisFrame()) 373 if (HasSwappedThisFrame())
378 return false; 374 return false;
379 375
380 // Except for the cases above, do not draw outside of the BeginImplFrame 376 // Except for the cases above, do not draw outside of the BeginImplFrame
381 // deadline. 377 // deadline.
382 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) 378 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE)
383 return false; 379 return false;
384 380
385 // Only handle forced redraws due to timeouts on the regular deadline. 381 // Only handle forced redraws due to timeouts on the regular deadline.
386 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) { 382 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW)
387 DCHECK_EQ(commit_state_, COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
388 return true; 383 return true;
389 }
390 384
391 return needs_redraw_; 385 return needs_redraw_;
392 } 386 }
393 387
394 bool SchedulerStateMachine::ShouldAcquireLayerTexturesForMainThread() const { 388 bool SchedulerStateMachine::ShouldAcquireLayerTexturesForMainThread() const {
395 if (!main_thread_needs_layer_textures_) 389 if (!main_thread_needs_layer_textures_)
396 return false; 390 return false;
397 if (texture_state_ == LAYER_TEXTURE_STATE_UNLOCKED) 391 if (texture_state_ == LAYER_TEXTURE_STATE_UNLOCKED)
398 return true; 392 return true;
399 DCHECK_EQ(texture_state_, LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD); 393 DCHECK_EQ(texture_state_, LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 } 438 }
445 439
446 bool SchedulerStateMachine::ShouldSendBeginMainFrame() const { 440 bool SchedulerStateMachine::ShouldSendBeginMainFrame() const {
447 if (!needs_commit_) 441 if (!needs_commit_)
448 return false; 442 return false;
449 443
450 // Only send BeginMainFrame when there isn't another commit pending already. 444 // Only send BeginMainFrame when there isn't another commit pending already.
451 if (commit_state_ != COMMIT_STATE_IDLE) 445 if (commit_state_ != COMMIT_STATE_IDLE)
452 return false; 446 return false;
453 447
454 // We can't accept a commit if we have a pending tree. 448 // Starting the commit while we still have a pending tree will block the
455 if (has_pending_tree_) 449 // main thread until the pending tree activates.
450 // Disabled when smoothness takes priority to reduce CPU contention.
451 if (has_pending_tree_ && (!settings_.start_commit_before_activate_enabled ||
452 smoothness_takes_priority_))
453 return false;
454
455 // If we are not impl-side-painting, starting the commit before the active
456 // tree has drawn will block the main thread until the first draw occurs.
457 // If we are impl-side-painting however, we will not block the main thread
458 // by starting the commit before the active tree has drawn since the pending
459 // tree is free to accept the commit.
460 // Disabled when smoothness takes priority to reduce CPU contention.
461 if (active_tree_needs_first_draw_ &&
462 (!settings_.start_commit_before_draw_enabled ||
463 smoothness_takes_priority_))
456 return false; 464 return false;
457 465
458 // We want to handle readback commits immediately to unblock the main thread. 466 // We want to handle readback commits immediately to unblock the main thread.
459 // Note: This BeginMainFrame will correspond to the replacement commit that 467 // Note: This BeginMainFrame will correspond to the replacement commit that
460 // comes after the readback commit itself, so we only send the BeginMainFrame 468 // comes after the readback commit itself, so we only send the BeginMainFrame
461 // if a commit isn't already pending behind the readback. 469 // if a commit isn't already pending behind the readback.
462 if (readback_state_ == READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME) 470 if (readback_state_ == READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME)
463 return !CommitPending(); 471 return !CommitPending();
464 472
465 // We do not need commits if we are not visible, unless there's a 473 // We do not need commits if we are not visible, unless there's a
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 if (!HasInitializedOutputSurface()) 508 if (!HasInitializedOutputSurface())
501 return false; 509 return false;
502 510
503 if (skip_begin_main_frame_to_reduce_latency_) 511 if (skip_begin_main_frame_to_reduce_latency_)
504 return false; 512 return false;
505 513
506 return true; 514 return true;
507 } 515 }
508 516
509 bool SchedulerStateMachine::ShouldCommit() const { 517 bool SchedulerStateMachine::ShouldCommit() const {
510 return commit_state_ == COMMIT_STATE_READY_TO_COMMIT; 518 if (commit_state_ != COMMIT_STATE_READY_TO_COMMIT)
519 return false;
520
521 // We must not finish the commit until the pending tree is free.
522 if (has_pending_tree_) {
523 DCHECK(settings_.start_commit_before_activate_enabled);
524 return false;
525 }
526
527 // If not impl-side-painting, we must not finish the commit until the
528 // previous commit has been drawn.
529 if (active_tree_needs_first_draw_ && !settings_.impl_side_painting) {
530 DCHECK(settings_.start_commit_before_draw_enabled);
531 return false;
532 }
533
534 return true;
511 } 535 }
512 536
513 bool SchedulerStateMachine::IsCommitStateWaiting() const { 537 bool SchedulerStateMachine::IsCommitStateWaiting() const {
514 return commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS; 538 return commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS;
515 } 539 }
516 540
517 bool SchedulerStateMachine::ShouldManageTiles() const { 541 bool SchedulerStateMachine::ShouldManageTiles() const {
518 // ManageTiles only really needs to be called immediately after commit 542 // ManageTiles only really needs to be called immediately after commit
519 // and then periodically after that. Use a funnel to make sure we average 543 // and then periodically after that. Use a funnel to make sure we average
520 // one ManageTiles per BeginImplFrame in the long run. 544 // one ManageTiles per BeginImplFrame in the long run.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 case ACTION_UPDATE_VISIBLE_TILES: 597 case ACTION_UPDATE_VISIBLE_TILES:
574 last_frame_number_update_visible_tiles_was_called_ = 598 last_frame_number_update_visible_tiles_was_called_ =
575 current_frame_number_; 599 current_frame_number_;
576 return; 600 return;
577 601
578 case ACTION_ACTIVATE_PENDING_TREE: 602 case ACTION_ACTIVATE_PENDING_TREE:
579 UpdateStateOnActivation(); 603 UpdateStateOnActivation();
580 return; 604 return;
581 605
582 case ACTION_SEND_BEGIN_MAIN_FRAME: 606 case ACTION_SEND_BEGIN_MAIN_FRAME:
583 DCHECK(!has_pending_tree_); 607 DCHECK(!has_pending_tree_ ||
608 settings_.start_commit_before_activate_enabled);
609 DCHECK(!active_tree_needs_first_draw_ ||
610 settings_.start_commit_before_draw_enabled);
584 DCHECK(visible_ || 611 DCHECK(visible_ ||
585 readback_state_ == READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME); 612 readback_state_ == READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME);
586 commit_state_ = COMMIT_STATE_FRAME_IN_PROGRESS; 613 commit_state_ = COMMIT_STATE_FRAME_IN_PROGRESS;
587 needs_commit_ = false; 614 needs_commit_ = false;
588 if (readback_state_ == READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME) 615 if (readback_state_ == READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME)
589 readback_state_ = READBACK_STATE_WAITING_FOR_COMMIT; 616 readback_state_ = READBACK_STATE_WAITING_FOR_COMMIT;
590 last_frame_number_begin_main_frame_sent_ = 617 last_frame_number_begin_main_frame_sent_ =
591 current_frame_number_; 618 current_frame_number_;
592 return; 619 return;
593 620
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 657
631 case ACTION_MANAGE_TILES: 658 case ACTION_MANAGE_TILES:
632 UpdateStateOnManageTiles(); 659 UpdateStateOnManageTiles();
633 return; 660 return;
634 } 661 }
635 } 662 }
636 663
637 void SchedulerStateMachine::UpdateStateOnCommit(bool commit_was_aborted) { 664 void SchedulerStateMachine::UpdateStateOnCommit(bool commit_was_aborted) {
638 commit_count_++; 665 commit_count_++;
639 666
667 // Transition directly to idle.
668 commit_state_ = COMMIT_STATE_IDLE;
669
640 // If we are impl-side-painting but the commit was aborted, then we behave 670 // If we are impl-side-painting but the commit was aborted, then we behave
641 // mostly as if we are not impl-side-painting since there is no pending tree. 671 // mostly as if we are not impl-side-painting since there is no pending tree.
642 has_pending_tree_ = settings_.impl_side_painting && !commit_was_aborted; 672 has_pending_tree_ = settings_.impl_side_painting && !commit_was_aborted;
643 673
644 // Update state related to readbacks. 674 // Update state related to readbacks.
645 if (readback_state_ == READBACK_STATE_WAITING_FOR_COMMIT) { 675 if (readback_state_ == READBACK_STATE_WAITING_FOR_COMMIT) {
646 // Update the state if this is the readback commit. 676 // Update the state if this is the readback commit.
647 readback_state_ = has_pending_tree_ 677 readback_state_ = has_pending_tree_
648 ? READBACK_STATE_WAITING_FOR_ACTIVATION 678 ? READBACK_STATE_WAITING_FOR_ACTIVATION
649 : READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK; 679 : READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK;
(...skipping 25 matching lines...) Expand all
675 if (output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT) { 705 if (output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT) {
676 if (has_pending_tree_) { 706 if (has_pending_tree_) {
677 output_surface_state_ = OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION; 707 output_surface_state_ = OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION;
678 } else { 708 } else {
679 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; 709 output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
680 needs_redraw_ = true; 710 needs_redraw_ = true;
681 } 711 }
682 } 712 }
683 } 713 }
684 714
685 // Update the commit state. We expect and wait for a draw if the commit
686 // was not aborted or if we are in a readback or forced draw.
687 if (!commit_was_aborted) {
688 DCHECK(commit_state_ == COMMIT_STATE_READY_TO_COMMIT);
689 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
690 } else if (readback_state_ != READBACK_STATE_IDLE ||
691 forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE) {
692 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
693 } else {
694 commit_state_ = COMMIT_STATE_IDLE;
695 }
696
697 // Update state if we have a new active tree to draw, or if the active tree 715 // Update state if we have a new active tree to draw, or if the active tree
698 // was unchanged but we need to do a readback or forced draw. 716 // was unchanged but we need to do a readback or forced draw.
699 if (!has_pending_tree_ && 717 if (!has_pending_tree_ &&
700 (!commit_was_aborted || 718 (!commit_was_aborted ||
701 readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK || 719 readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK ||
702 forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW)) { 720 forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW)) {
703 needs_redraw_ = true; 721 needs_redraw_ = true;
704 active_tree_needs_first_draw_ = true; 722 active_tree_needs_first_draw_ = true;
705 } 723 }
706 724
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 active_tree_needs_first_draw_ = true; 756 active_tree_needs_first_draw_ = true;
739 needs_redraw_ = true; 757 needs_redraw_ = true;
740 } 758 }
741 759
742 void SchedulerStateMachine::UpdateStateOnDraw(bool did_swap) { 760 void SchedulerStateMachine::UpdateStateOnDraw(bool did_swap) {
743 DCHECK(readback_state_ != READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT && 761 DCHECK(readback_state_ != READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT &&
744 readback_state_ != READBACK_STATE_WAITING_FOR_REPLACEMENT_ACTIVATION) 762 readback_state_ != READBACK_STATE_WAITING_FOR_REPLACEMENT_ACTIVATION)
745 << *AsValue(); 763 << *AsValue();
746 764
747 if (readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK) { 765 if (readback_state_ == READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK) {
748 // The draw correspons to a readback commit. 766 // The draw corresponds to a readback commit.
749 DCHECK_EQ(commit_state_, COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
750 // We are blocking commits from the main thread until after this draw, so 767 // We are blocking commits from the main thread until after this draw, so
751 // we should not have a pending tree. 768 // we should not have a pending tree.
752 DCHECK(!has_pending_tree_); 769 DCHECK(!has_pending_tree_);
753 // We transition to COMMIT_STATE_FRAME_IN_PROGRESS because there is a 770 // We transition to COMMIT_STATE_FRAME_IN_PROGRESS because there is a
754 // pending BeginMainFrame behind the readback request. 771 // pending BeginMainFrame behind the readback request.
755 commit_state_ = COMMIT_STATE_FRAME_IN_PROGRESS; 772 commit_state_ = COMMIT_STATE_FRAME_IN_PROGRESS;
756 readback_state_ = READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT; 773 readback_state_ = READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT;
757 } else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) { 774 } else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) {
758 DCHECK_EQ(commit_state_, COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
759 commit_state_ = COMMIT_STATE_IDLE;
760 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; 775 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE;
761 } else if (commit_state_ == COMMIT_STATE_WAITING_FOR_FIRST_DRAW &&
762 !has_pending_tree_) {
763 commit_state_ = COMMIT_STATE_IDLE;
764 } 776 }
765 777
766 if (texture_state_ == LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD) 778 if (texture_state_ == LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD)
767 texture_state_ = LAYER_TEXTURE_STATE_UNLOCKED; 779 texture_state_ = LAYER_TEXTURE_STATE_UNLOCKED;
768 780
769 needs_redraw_ = false; 781 needs_redraw_ = false;
770 draw_if_possible_failed_ = false; 782 draw_if_possible_failed_ = false;
771 active_tree_needs_first_draw_ = false; 783 active_tree_needs_first_draw_ = false;
772 784
773 if (did_swap) 785 if (did_swap)
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 return true; 957 return true;
946 958
947 // Prioritize impl-thread draws in smoothness mode. 959 // Prioritize impl-thread draws in smoothness mode.
948 if (smoothness_takes_priority_) 960 if (smoothness_takes_priority_)
949 return true; 961 return true;
950 962
951 return false; 963 return false;
952 } 964 }
953 965
954 bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const { 966 bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const {
967 // If a commit is pending before the previous commit has been drawn, we
968 // are definitely in a high latency mode.
969 if (CommitPending() && (active_tree_needs_first_draw_ || has_pending_tree_))
970 return true;
971
955 // If we just sent a BeginMainFrame and haven't hit the deadline yet, the main 972 // If we just sent a BeginMainFrame and haven't hit the deadline yet, the main
956 // thread is in a low latency mode. 973 // thread is in a low latency mode.
957 if (last_frame_number_begin_main_frame_sent_ == current_frame_number_ && 974 if (last_frame_number_begin_main_frame_sent_ == current_frame_number_ &&
958 (begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING || 975 (begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING ||
959 begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME)) 976 begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME))
960 return false; 977 return false;
961 978
962 // If there's a commit in progress it must either be from the previous frame 979 // If there's a commit in progress it must either be from the previous frame
963 // or it started after the impl thread's deadline. In either case the main 980 // or it started after the impl thread's deadline. In either case the main
964 // thread is in high latency mode. 981 // thread is in high latency mode.
965 if (commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS || 982 if (CommitPending())
966 commit_state_ == COMMIT_STATE_READY_TO_COMMIT)
967 return true; 983 return true;
968 984
969 // Similarly, if there's a pending tree the main thread is in high latency 985 // Similarly, if there's a pending tree the main thread is in high latency
970 // mode, because either 986 // mode, because either
971 // it's from the previous frame 987 // it's from the previous frame
972 // or 988 // or
973 // we're currently drawing the active tree and the pending tree will thus 989 // we're currently drawing the active tree and the pending tree will thus
974 // only be drawn in the next frame. 990 // only be drawn in the next frame.
975 if (has_pending_tree_) 991 if (has_pending_tree_)
976 return true; 992 return true;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1065 // BeginMainFrame behind the readback request. In that case, we can skip 1081 // BeginMainFrame behind the readback request. In that case, we can skip
1066 // READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME and go directly to 1082 // READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME and go directly to
1067 // READBACK_STATE_WAITING_FOR_COMMIT 1083 // READBACK_STATE_WAITING_FOR_COMMIT
1068 if (commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS) 1084 if (commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS)
1069 readback_state_ = READBACK_STATE_WAITING_FOR_COMMIT; 1085 readback_state_ = READBACK_STATE_WAITING_FOR_COMMIT;
1070 else 1086 else
1071 readback_state_ = READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME; 1087 readback_state_ = READBACK_STATE_NEEDS_BEGIN_MAIN_FRAME;
1072 } 1088 }
1073 1089
1074 void SchedulerStateMachine::FinishCommit() { 1090 void SchedulerStateMachine::FinishCommit() {
1075 DCHECK(commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS) << *AsValue(); 1091 DCHECK(commit_state_ != COMMIT_STATE_IDLE) << *AsValue();
1076 commit_state_ = COMMIT_STATE_READY_TO_COMMIT; 1092 commit_state_ = COMMIT_STATE_READY_TO_COMMIT;
1077 } 1093 }
1078 1094
1079 void SchedulerStateMachine::BeginMainFrameAborted(bool did_handle) { 1095 void SchedulerStateMachine::BeginMainFrameAborted(bool did_handle) {
1080 DCHECK_EQ(commit_state_, COMMIT_STATE_FRAME_IN_PROGRESS); 1096 DCHECK_EQ(commit_state_, COMMIT_STATE_FRAME_IN_PROGRESS);
1081 if (did_handle) { 1097 if (did_handle) {
1082 bool commit_was_aborted = true; 1098 bool commit_was_aborted = true;
1083 UpdateStateOnCommit(commit_was_aborted); 1099 UpdateStateOnCommit(commit_was_aborted);
1084 } else { 1100 } else {
1085 DCHECK_NE(readback_state_, READBACK_STATE_WAITING_FOR_COMMIT); 1101 DCHECK_NE(readback_state_, READBACK_STATE_WAITING_FOR_COMMIT);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 case OUTPUT_SURFACE_ACTIVE: 1145 case OUTPUT_SURFACE_ACTIVE:
1130 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: 1146 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT:
1131 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: 1147 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION:
1132 return true; 1148 return true;
1133 } 1149 }
1134 NOTREACHED(); 1150 NOTREACHED();
1135 return false; 1151 return false;
1136 } 1152 }
1137 1153
1138 } // namespace cc 1154 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698