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

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

Issue 2753843003: Create a new action triggered when a BeginMainFrame is not expected before vsync (Closed)
Patch Set: fix Sami's comments Created 3 years, 8 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/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 24 matching lines...) Expand all
35 BeginFrameArgs::kInvalidFrameNumber), 35 BeginFrameArgs::kInvalidFrameNumber),
36 last_begin_frame_sequence_number_compositor_frame_was_fresh_( 36 last_begin_frame_sequence_number_compositor_frame_was_fresh_(
37 BeginFrameArgs::kInvalidFrameNumber), 37 BeginFrameArgs::kInvalidFrameNumber),
38 commit_count_(0), 38 commit_count_(0),
39 current_frame_number_(0), 39 current_frame_number_(0),
40 last_frame_number_submit_performed_(-1), 40 last_frame_number_submit_performed_(-1),
41 last_frame_number_draw_performed_(-1), 41 last_frame_number_draw_performed_(-1),
42 last_frame_number_begin_main_frame_sent_(-1), 42 last_frame_number_begin_main_frame_sent_(-1),
43 last_frame_number_invalidate_compositor_frame_sink_performed_(-1), 43 last_frame_number_invalidate_compositor_frame_sink_performed_(-1),
44 draw_funnel_(false), 44 draw_funnel_(false),
45 send_begin_main_frame_funnel_(true), 45 did_send_begin_main_frame_for_current_frame_(true),
46 invalidate_compositor_frame_sink_funnel_(false), 46 invalidate_compositor_frame_sink_funnel_(false),
47 impl_side_invalidation_funnel_(false), 47 impl_side_invalidation_funnel_(false),
48 did_notify_begin_main_frame_not_sent_(true),
49 did_commit_during_frame_(false),
48 prepare_tiles_funnel_(0), 50 prepare_tiles_funnel_(0),
49 consecutive_checkerboard_animations_(0), 51 consecutive_checkerboard_animations_(0),
50 pending_submit_frames_(0), 52 pending_submit_frames_(0),
51 submit_frames_with_current_compositor_frame_sink_(0), 53 submit_frames_with_current_compositor_frame_sink_(0),
52 needs_redraw_(false), 54 needs_redraw_(false),
53 needs_prepare_tiles_(false), 55 needs_prepare_tiles_(false),
54 needs_begin_main_frame_(false), 56 needs_begin_main_frame_(false),
55 needs_one_begin_impl_frame_(false), 57 needs_one_begin_impl_frame_(false),
56 visible_(false), 58 visible_(false),
57 begin_frame_source_paused_(false), 59 begin_frame_source_paused_(false),
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 case ACTION_DRAW_ABORT: 189 case ACTION_DRAW_ABORT:
188 return "ACTION_DRAW_ABORT"; 190 return "ACTION_DRAW_ABORT";
189 case ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION: 191 case ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION:
190 return "ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION"; 192 return "ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION";
191 case ACTION_PREPARE_TILES: 193 case ACTION_PREPARE_TILES:
192 return "ACTION_PREPARE_TILES"; 194 return "ACTION_PREPARE_TILES";
193 case ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK: 195 case ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK:
194 return "ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK"; 196 return "ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK";
195 case ACTION_PERFORM_IMPL_SIDE_INVALIDATION: 197 case ACTION_PERFORM_IMPL_SIDE_INVALIDATION:
196 return "ACTION_PERFORM_IMPL_SIDE_INVALIDATION"; 198 return "ACTION_PERFORM_IMPL_SIDE_INVALIDATION";
199 case ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT:
200 return "ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT";
197 } 201 }
198 NOTREACHED(); 202 NOTREACHED();
199 return "???"; 203 return "???";
200 } 204 }
201 205
202 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 206 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
203 SchedulerStateMachine::AsValue() const { 207 SchedulerStateMachine::AsValue() const {
204 std::unique_ptr<base::trace_event::TracedValue> state( 208 std::unique_ptr<base::trace_event::TracedValue> state(
205 new base::trace_event::TracedValue()); 209 new base::trace_event::TracedValue());
206 AsValueInto(state.get()); 210 AsValueInto(state.get());
(...skipping 30 matching lines...) Expand all
237 state->SetInteger("last_begin_frame_sequence_number_begin_main_frame_sent", 241 state->SetInteger("last_begin_frame_sequence_number_begin_main_frame_sent",
238 last_begin_frame_sequence_number_begin_main_frame_sent_); 242 last_begin_frame_sequence_number_begin_main_frame_sent_);
239 state->SetInteger("last_begin_frame_sequence_number_pending_tree_was_fresh", 243 state->SetInteger("last_begin_frame_sequence_number_pending_tree_was_fresh",
240 last_begin_frame_sequence_number_pending_tree_was_fresh_); 244 last_begin_frame_sequence_number_pending_tree_was_fresh_);
241 state->SetInteger("last_begin_frame_sequence_number_active_tree_was_fresh", 245 state->SetInteger("last_begin_frame_sequence_number_active_tree_was_fresh",
242 last_begin_frame_sequence_number_active_tree_was_fresh_); 246 last_begin_frame_sequence_number_active_tree_was_fresh_);
243 state->SetInteger( 247 state->SetInteger(
244 "last_begin_frame_sequence_number_compositor_frame_was_fresh", 248 "last_begin_frame_sequence_number_compositor_frame_was_fresh",
245 last_begin_frame_sequence_number_compositor_frame_was_fresh_); 249 last_begin_frame_sequence_number_compositor_frame_was_fresh_);
246 state->SetBoolean("funnel: draw_funnel", draw_funnel_); 250 state->SetBoolean("funnel: draw_funnel", draw_funnel_);
247 state->SetBoolean("funnel: send_begin_main_frame_funnel", 251 state->SetBoolean("funnel: did_send_begin_main_frame",
248 send_begin_main_frame_funnel_); 252 did_send_begin_main_frame_for_current_frame_);
253 state->SetBoolean("funnel: did_notify_begin_main_frame_not_sent",
254 did_notify_begin_main_frame_not_sent_);
255 state->SetBoolean("funnel: did_commit_during_frame",
256 did_commit_during_frame_);
249 state->SetInteger("funnel: prepare_tiles_funnel", prepare_tiles_funnel_); 257 state->SetInteger("funnel: prepare_tiles_funnel", prepare_tiles_funnel_);
250 state->SetBoolean("funnel: invalidate_compositor_frame_sink_funnel", 258 state->SetBoolean("funnel: invalidate_compositor_frame_sink_funnel",
251 invalidate_compositor_frame_sink_funnel_); 259 invalidate_compositor_frame_sink_funnel_);
252 state->SetBoolean("funnel: impl_side_invalidation_funnel", 260 state->SetBoolean("funnel: impl_side_invalidation_funnel",
253 impl_side_invalidation_funnel_); 261 impl_side_invalidation_funnel_);
254 state->SetInteger("consecutive_checkerboard_animations", 262 state->SetInteger("consecutive_checkerboard_animations",
255 consecutive_checkerboard_animations_); 263 consecutive_checkerboard_animations_);
256 state->SetInteger("pending_submit_frames", pending_submit_frames_); 264 state->SetInteger("pending_submit_frames", pending_submit_frames_);
257 state->SetInteger("submit_frames_with_current_compositor_frame_sink", 265 state->SetInteger("submit_frames_with_current_compositor_frame_sink",
258 submit_frames_with_current_compositor_frame_sink_); 266 submit_frames_with_current_compositor_frame_sink_);
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 return false; 433 return false;
426 434
427 // If we want to force activation, do so ASAP. 435 // If we want to force activation, do so ASAP.
428 if (PendingActivationsShouldBeForced()) 436 if (PendingActivationsShouldBeForced())
429 return true; 437 return true;
430 438
431 // At this point, only activate if we are ready to activate. 439 // At this point, only activate if we are ready to activate.
432 return pending_tree_is_ready_for_activation_; 440 return pending_tree_is_ready_for_activation_;
433 } 441 }
434 442
443 bool SchedulerStateMachine::ShouldNotifyBeginMainFrameNotSent() const {
444 // This method returns true if most of the conditions for sending a
445 // BeginMainFrame are met, but one is not actually requested. This gives the
446 // main thread the chance to do something else.
447
448 // Don't notify if a BeginMainFrame has already been requested or is in
449 // progress.
450 if (needs_begin_main_frame_ ||
451 begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_IDLE)
452 return false;
453
454 // Only notify when we're visible.
455 if (!visible_)
456 return false;
457
458 // There are no BeginImplFrames while BeginFrameSource is paused, meaning
459 // the scheduler should send SendBeginMainFrameNotExpectedSoon instead,
460 // indicating a longer period of inactivity.
461 if (begin_frame_source_paused_)
462 return false;
463
464 // Do not notify that no BeginMainFrame was sent too many times in a single
465 // frame.
466 if (did_notify_begin_main_frame_not_sent_)
467 return false;
468
469 // Do not notify if a commit happened during this frame as the main thread
470 // will already be active and does not need to be woken up to make further
471 // actions. (This occurs if the main frame was scheduled but didn't complete
472 // before the vsync deadline).
473 if (did_commit_during_frame_)
474 return false;
475
476 return true;
477 }
478
435 bool SchedulerStateMachine::CouldSendBeginMainFrame() const { 479 bool SchedulerStateMachine::CouldSendBeginMainFrame() const {
436 if (!needs_begin_main_frame_) 480 if (!needs_begin_main_frame_)
437 return false; 481 return false;
438 482
439 // We can not perform commits if we are not visible. 483 // We can not perform commits if we are not visible.
440 if (!visible_) 484 if (!visible_)
441 return false; 485 return false;
442 486
443 // There are no BeginImplFrames while BeginFrameSource is paused, 487 // There are no BeginImplFrames while BeginFrameSource is paused,
444 // so should also stop BeginMainFrames. 488 // so should also stop BeginMainFrames.
445 if (begin_frame_source_paused_) 489 if (begin_frame_source_paused_)
446 return false; 490 return false;
447 491
448 // Do not make a new commits when it is deferred. 492 // Do not make a new commits when it is deferred.
449 if (defer_commits_) 493 if (defer_commits_)
450 return false; 494 return false;
451 495
452 return true; 496 return true;
453 } 497 }
454 498
455 bool SchedulerStateMachine::ShouldSendBeginMainFrame() const { 499 bool SchedulerStateMachine::ShouldSendBeginMainFrame() const {
456 if (!CouldSendBeginMainFrame()) 500 if (!CouldSendBeginMainFrame())
457 return false; 501 return false;
458 502
459 // Do not send begin main frame too many times in a single frame or before 503 // Do not send begin main frame too many times in a single frame or before
460 // the first BeginFrame. 504 // the first BeginFrame.
461 if (send_begin_main_frame_funnel_) 505 if (did_send_begin_main_frame_for_current_frame_)
462 return false; 506 return false;
463 507
464 // Only send BeginMainFrame when there isn't another commit pending already. 508 // Only send BeginMainFrame when there isn't another commit pending already.
465 // Other parts of the state machine indirectly defer the BeginMainFrame 509 // Other parts of the state machine indirectly defer the BeginMainFrame
466 // by transitioning to WAITING commit states rather than going 510 // by transitioning to WAITING commit states rather than going
467 // immediately to IDLE. 511 // immediately to IDLE.
468 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_IDLE) 512 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_IDLE)
469 return false; 513 return false;
470 514
471 // MFBA is disabled and we are waiting for previous activation. 515 // MFBA is disabled and we are waiting for previous activation.
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 if (ShouldPerformImplSideInvalidation()) 639 if (ShouldPerformImplSideInvalidation())
596 return ACTION_PERFORM_IMPL_SIDE_INVALIDATION; 640 return ACTION_PERFORM_IMPL_SIDE_INVALIDATION;
597 if (ShouldPrepareTiles()) 641 if (ShouldPrepareTiles())
598 return ACTION_PREPARE_TILES; 642 return ACTION_PREPARE_TILES;
599 if (ShouldSendBeginMainFrame()) 643 if (ShouldSendBeginMainFrame())
600 return ACTION_SEND_BEGIN_MAIN_FRAME; 644 return ACTION_SEND_BEGIN_MAIN_FRAME;
601 if (ShouldInvalidateCompositorFrameSink()) 645 if (ShouldInvalidateCompositorFrameSink())
602 return ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK; 646 return ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK;
603 if (ShouldBeginCompositorFrameSinkCreation()) 647 if (ShouldBeginCompositorFrameSinkCreation())
604 return ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION; 648 return ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION;
649 if (ShouldNotifyBeginMainFrameNotSent())
650 return ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT;
605 return ACTION_NONE; 651 return ACTION_NONE;
606 } 652 }
607 653
608 bool SchedulerStateMachine::ShouldPerformImplSideInvalidation() const { 654 bool SchedulerStateMachine::ShouldPerformImplSideInvalidation() const {
609 if (!needs_impl_side_invalidation_) 655 if (!needs_impl_side_invalidation_)
610 return false; 656 return false;
611 657
612 if (!CouldCreatePendingTree()) 658 if (!CouldCreatePendingTree())
613 return false; 659 return false;
614 660
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 if (!HasInitializedCompositorFrameSink()) 726 if (!HasInitializedCompositorFrameSink())
681 return false; 727 return false;
682 728
683 return true; 729 return true;
684 } 730 }
685 731
686 void SchedulerStateMachine::WillSendBeginMainFrame() { 732 void SchedulerStateMachine::WillSendBeginMainFrame() {
687 DCHECK(!has_pending_tree_ || settings_.main_frame_before_activation_enabled); 733 DCHECK(!has_pending_tree_ || settings_.main_frame_before_activation_enabled);
688 DCHECK(visible_); 734 DCHECK(visible_);
689 DCHECK(!begin_frame_source_paused_); 735 DCHECK(!begin_frame_source_paused_);
690 DCHECK(!send_begin_main_frame_funnel_); 736 DCHECK(!did_send_begin_main_frame_for_current_frame_);
691 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_SENT; 737 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_SENT;
692 needs_begin_main_frame_ = false; 738 needs_begin_main_frame_ = false;
693 send_begin_main_frame_funnel_ = true; 739 did_send_begin_main_frame_for_current_frame_ = true;
694 last_frame_number_begin_main_frame_sent_ = current_frame_number_; 740 last_frame_number_begin_main_frame_sent_ = current_frame_number_;
695 last_begin_frame_sequence_number_begin_main_frame_sent_ = 741 last_begin_frame_sequence_number_begin_main_frame_sent_ =
696 begin_frame_sequence_number_; 742 begin_frame_sequence_number_;
697 } 743 }
698 744
745 void SchedulerStateMachine::WillNotifyBeginMainFrameNotSent() {
746 DCHECK(visible_);
747 DCHECK(!begin_frame_source_paused_);
748 DCHECK(!did_notify_begin_main_frame_not_sent_);
749 did_notify_begin_main_frame_not_sent_ = true;
750 }
751
699 void SchedulerStateMachine::WillCommit(bool commit_has_no_updates) { 752 void SchedulerStateMachine::WillCommit(bool commit_has_no_updates) {
700 bool can_have_pending_tree = 753 bool can_have_pending_tree =
701 commit_has_no_updates && 754 commit_has_no_updates &&
702 (settings_.main_frame_before_activation_enabled || 755 (settings_.main_frame_before_activation_enabled ||
703 current_pending_tree_is_impl_side_); 756 current_pending_tree_is_impl_side_);
704 DCHECK(!has_pending_tree_ || can_have_pending_tree); 757 DCHECK(!has_pending_tree_ || can_have_pending_tree);
705 commit_count_++; 758 commit_count_++;
706 last_commit_had_no_updates_ = commit_has_no_updates; 759 last_commit_had_no_updates_ = commit_has_no_updates;
707 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE; 760 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE;
761 did_commit_during_frame_ = true;
708 762
709 if (commit_has_no_updates) { 763 if (commit_has_no_updates) {
710 // Pending tree might still exist from prior commit. 764 // Pending tree might still exist from prior commit.
711 if (has_pending_tree_) { 765 if (has_pending_tree_) {
712 DCHECK(can_have_pending_tree); 766 DCHECK(can_have_pending_tree);
713 last_begin_frame_sequence_number_pending_tree_was_fresh_ = 767 last_begin_frame_sequence_number_pending_tree_was_fresh_ =
714 last_begin_frame_sequence_number_begin_main_frame_sent_; 768 last_begin_frame_sequence_number_begin_main_frame_sent_;
715 } else { 769 } else {
716 if (last_begin_frame_sequence_number_compositor_frame_was_fresh_ == 770 if (last_begin_frame_sequence_number_compositor_frame_was_fresh_ ==
717 last_begin_frame_sequence_number_active_tree_was_fresh_) { 771 last_begin_frame_sequence_number_active_tree_was_fresh_) {
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 1098
1045 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME; 1099 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME;
1046 current_frame_number_++; 1100 current_frame_number_++;
1047 1101
1048 last_commit_had_no_updates_ = false; 1102 last_commit_had_no_updates_ = false;
1049 did_draw_in_last_frame_ = false; 1103 did_draw_in_last_frame_ = false;
1050 did_submit_in_last_frame_ = false; 1104 did_submit_in_last_frame_ = false;
1051 needs_one_begin_impl_frame_ = false; 1105 needs_one_begin_impl_frame_ = false;
1052 1106
1053 // Clear funnels for any actions we perform during the frame. 1107 // Clear funnels for any actions we perform during the frame.
1054 send_begin_main_frame_funnel_ = false; 1108 did_notify_begin_main_frame_not_sent_ = false;
1109 did_send_begin_main_frame_for_current_frame_ = false;
1110 did_commit_during_frame_ = false;
1055 invalidate_compositor_frame_sink_funnel_ = false; 1111 invalidate_compositor_frame_sink_funnel_ = false;
1056 impl_side_invalidation_funnel_ = false; 1112 impl_side_invalidation_funnel_ = false;
1057 1113
1058 // "Drain" the PrepareTiles funnel. 1114 // "Drain" the PrepareTiles funnel.
1059 if (prepare_tiles_funnel_ > 0) 1115 if (prepare_tiles_funnel_ > 0)
1060 prepare_tiles_funnel_--; 1116 prepare_tiles_funnel_--;
1061 } 1117 }
1062 1118
1063 void SchedulerStateMachine::OnBeginImplFrameDeadline() { 1119 void SchedulerStateMachine::OnBeginImplFrameDeadline() {
1064 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; 1120 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE;
(...skipping 17 matching lines...) Expand all
1082 skip_next_begin_main_frame_to_reduce_latency_ = false; 1138 skip_next_begin_main_frame_to_reduce_latency_ = false;
1083 1139
1084 // If a new or undrawn active tree is pending after the deadline, 1140 // If a new or undrawn active tree is pending after the deadline,
1085 // then the main thread is in a high latency mode. 1141 // then the main thread is in a high latency mode.
1086 main_thread_missed_last_deadline_ = 1142 main_thread_missed_last_deadline_ =
1087 CommitPending() || has_pending_tree_ || active_tree_needs_first_draw_; 1143 CommitPending() || has_pending_tree_ || active_tree_needs_first_draw_;
1088 1144
1089 // If we're entering a state where we won't get BeginFrames set all the 1145 // If we're entering a state where we won't get BeginFrames set all the
1090 // funnels so that we don't perform any actions that we shouldn't. 1146 // funnels so that we don't perform any actions that we shouldn't.
1091 if (!BeginFrameNeeded()) 1147 if (!BeginFrameNeeded())
1092 send_begin_main_frame_funnel_ = true; 1148 did_send_begin_main_frame_for_current_frame_ = true;
1093 1149
1094 // Synchronous compositor finishes BeginFrames before triggering their 1150 // Synchronous compositor finishes BeginFrames before triggering their
1095 // deadline. Therefore, we update sequence numbers when becoming idle, before 1151 // deadline. Therefore, we update sequence numbers when becoming idle, before
1096 // the Scheduler sends its BeginFrameAck. 1152 // the Scheduler sends its BeginFrameAck.
1097 if (settings_.using_synchronous_renderer_compositor) 1153 if (settings_.using_synchronous_renderer_compositor)
1098 UpdateBeginFrameSequenceNumbersForBeginFrameDeadline(); 1154 UpdateBeginFrameSequenceNumbersForBeginFrameDeadline();
1099 } 1155 }
1100 1156
1101 SchedulerStateMachine::BeginImplFrameDeadlineMode 1157 SchedulerStateMachine::BeginImplFrameDeadlineMode
1102 SchedulerStateMachine::CurrentBeginImplFrameDeadlineMode() const { 1158 SchedulerStateMachine::CurrentBeginImplFrameDeadlineMode() const {
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 case COMPOSITOR_FRAME_SINK_ACTIVE: 1395 case COMPOSITOR_FRAME_SINK_ACTIVE:
1340 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT: 1396 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT:
1341 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION: 1397 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION:
1342 return true; 1398 return true;
1343 } 1399 }
1344 NOTREACHED(); 1400 NOTREACHED();
1345 return false; 1401 return false;
1346 } 1402 }
1347 1403
1348 } // namespace cc 1404 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698