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/debug/trace_event_argument.h" | 8 #include "base/debug/trace_event_argument.h" |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/values.h" | 12 #include "base/values.h" |
13 #include "ui/gfx/frame_time.h" | 13 #include "ui/gfx/frame_time.h" |
14 | 14 |
15 namespace cc { | 15 namespace cc { |
16 | 16 |
17 SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) | 17 SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) |
18 : settings_(settings), | 18 : settings_(settings), |
19 output_surface_state_(OUTPUT_SURFACE_LOST), | 19 output_surface_state_(OUTPUT_SURFACE_LOST), |
20 begin_impl_frame_state_(BEGIN_IMPL_FRAME_STATE_IDLE), | 20 begin_impl_frame_state_(BEGIN_IMPL_FRAME_STATE_IDLE), |
21 commit_state_(COMMIT_STATE_IDLE), | 21 commit_state_(COMMIT_STATE_IDLE), |
22 forced_redraw_state_(FORCED_REDRAW_STATE_IDLE), | 22 forced_redraw_state_(FORCED_REDRAW_STATE_IDLE), |
23 commit_count_(0), | 23 commit_count_(0), |
24 current_frame_number_(0), | 24 current_frame_number_(0), |
25 last_frame_number_animate_performed_(-1), | 25 last_frame_number_animate_performed_(-1), |
26 last_frame_number_swap_performed_(-1), | 26 last_frame_number_swap_performed_(-1), |
27 last_frame_number_swap_requested_(-1), | 27 last_frame_number_swap_requested_(-1), |
28 last_frame_number_begin_main_frame_sent_(-1), | 28 last_frame_number_begin_main_frame_sent_(-1), |
29 last_frame_number_update_visible_tiles_was_called_(-1), | |
30 manage_tiles_funnel_(0), | 29 manage_tiles_funnel_(0), |
31 consecutive_checkerboard_animations_(0), | 30 consecutive_checkerboard_animations_(0), |
32 max_pending_swaps_(1), | 31 max_pending_swaps_(1), |
33 pending_swaps_(0), | 32 pending_swaps_(0), |
34 needs_redraw_(false), | 33 needs_redraw_(false), |
35 needs_animate_(false), | 34 needs_animate_(false), |
36 needs_manage_tiles_(false), | 35 needs_manage_tiles_(false), |
37 swap_used_incomplete_tile_(false), | |
38 needs_commit_(false), | 36 needs_commit_(false), |
39 inside_poll_for_anticipated_draw_triggers_(false), | 37 inside_poll_for_anticipated_draw_triggers_(false), |
40 visible_(false), | 38 visible_(false), |
41 can_start_(false), | 39 can_start_(false), |
42 can_draw_(false), | 40 can_draw_(false), |
43 has_pending_tree_(false), | 41 has_pending_tree_(false), |
44 pending_tree_is_ready_for_activation_(false), | 42 pending_tree_is_ready_for_activation_(false), |
45 active_tree_needs_first_draw_(false), | 43 active_tree_needs_first_draw_(false), |
46 did_commit_after_animating_(false), | 44 did_commit_after_animating_(false), |
47 did_create_and_initialize_first_output_surface_(false), | 45 did_create_and_initialize_first_output_surface_(false), |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 const char* SchedulerStateMachine::ActionToString(Action action) { | 120 const char* SchedulerStateMachine::ActionToString(Action action) { |
123 switch (action) { | 121 switch (action) { |
124 case ACTION_NONE: | 122 case ACTION_NONE: |
125 return "ACTION_NONE"; | 123 return "ACTION_NONE"; |
126 case ACTION_ANIMATE: | 124 case ACTION_ANIMATE: |
127 return "ACTION_ANIMATE"; | 125 return "ACTION_ANIMATE"; |
128 case ACTION_SEND_BEGIN_MAIN_FRAME: | 126 case ACTION_SEND_BEGIN_MAIN_FRAME: |
129 return "ACTION_SEND_BEGIN_MAIN_FRAME"; | 127 return "ACTION_SEND_BEGIN_MAIN_FRAME"; |
130 case ACTION_COMMIT: | 128 case ACTION_COMMIT: |
131 return "ACTION_COMMIT"; | 129 return "ACTION_COMMIT"; |
132 case ACTION_UPDATE_VISIBLE_TILES: | |
133 return "ACTION_UPDATE_VISIBLE_TILES"; | |
134 case ACTION_ACTIVATE_SYNC_TREE: | 130 case ACTION_ACTIVATE_SYNC_TREE: |
135 return "ACTION_ACTIVATE_SYNC_TREE"; | 131 return "ACTION_ACTIVATE_SYNC_TREE"; |
136 case ACTION_DRAW_AND_SWAP_IF_POSSIBLE: | 132 case ACTION_DRAW_AND_SWAP_IF_POSSIBLE: |
137 return "ACTION_DRAW_AND_SWAP_IF_POSSIBLE"; | 133 return "ACTION_DRAW_AND_SWAP_IF_POSSIBLE"; |
138 case ACTION_DRAW_AND_SWAP_FORCED: | 134 case ACTION_DRAW_AND_SWAP_FORCED: |
139 return "ACTION_DRAW_AND_SWAP_FORCED"; | 135 return "ACTION_DRAW_AND_SWAP_FORCED"; |
140 case ACTION_DRAW_AND_SWAP_ABORT: | 136 case ACTION_DRAW_AND_SWAP_ABORT: |
141 return "ACTION_DRAW_AND_SWAP_ABORT"; | 137 return "ACTION_DRAW_AND_SWAP_ABORT"; |
142 case ACTION_BEGIN_OUTPUT_SURFACE_CREATION: | 138 case ACTION_BEGIN_OUTPUT_SURFACE_CREATION: |
143 return "ACTION_BEGIN_OUTPUT_SURFACE_CREATION"; | 139 return "ACTION_BEGIN_OUTPUT_SURFACE_CREATION"; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 state->SetInteger("current_frame_number", current_frame_number_); | 195 state->SetInteger("current_frame_number", current_frame_number_); |
200 | 196 |
201 state->SetInteger("last_frame_number_animate_performed", | 197 state->SetInteger("last_frame_number_animate_performed", |
202 last_frame_number_animate_performed_); | 198 last_frame_number_animate_performed_); |
203 state->SetInteger("last_frame_number_swap_performed", | 199 state->SetInteger("last_frame_number_swap_performed", |
204 last_frame_number_swap_performed_); | 200 last_frame_number_swap_performed_); |
205 state->SetInteger("last_frame_number_swap_requested", | 201 state->SetInteger("last_frame_number_swap_requested", |
206 last_frame_number_swap_requested_); | 202 last_frame_number_swap_requested_); |
207 state->SetInteger("last_frame_number_begin_main_frame_sent", | 203 state->SetInteger("last_frame_number_begin_main_frame_sent", |
208 last_frame_number_begin_main_frame_sent_); | 204 last_frame_number_begin_main_frame_sent_); |
209 state->SetInteger("last_frame_number_update_visible_tiles_was_called", | |
210 last_frame_number_update_visible_tiles_was_called_); | |
211 | 205 |
212 state->SetInteger("manage_tiles_funnel", manage_tiles_funnel_); | 206 state->SetInteger("manage_tiles_funnel", manage_tiles_funnel_); |
213 state->SetInteger("consecutive_checkerboard_animations", | 207 state->SetInteger("consecutive_checkerboard_animations", |
214 consecutive_checkerboard_animations_); | 208 consecutive_checkerboard_animations_); |
215 state->SetInteger("max_pending_swaps_", max_pending_swaps_); | 209 state->SetInteger("max_pending_swaps_", max_pending_swaps_); |
216 state->SetInteger("pending_swaps_", pending_swaps_); | 210 state->SetInteger("pending_swaps_", pending_swaps_); |
217 state->SetBoolean("needs_redraw", needs_redraw_); | 211 state->SetBoolean("needs_redraw", needs_redraw_); |
218 state->SetBoolean("needs_animate_", needs_animate_); | 212 state->SetBoolean("needs_animate_", needs_animate_); |
219 state->SetBoolean("needs_manage_tiles", needs_manage_tiles_); | 213 state->SetBoolean("needs_manage_tiles", needs_manage_tiles_); |
220 state->SetBoolean("swap_used_incomplete_tile", swap_used_incomplete_tile_); | |
221 state->SetBoolean("needs_commit", needs_commit_); | 214 state->SetBoolean("needs_commit", needs_commit_); |
222 state->SetBoolean("visible", visible_); | 215 state->SetBoolean("visible", visible_); |
223 state->SetBoolean("can_start", can_start_); | 216 state->SetBoolean("can_start", can_start_); |
224 state->SetBoolean("can_draw", can_draw_); | 217 state->SetBoolean("can_draw", can_draw_); |
225 state->SetBoolean("has_pending_tree", has_pending_tree_); | 218 state->SetBoolean("has_pending_tree", has_pending_tree_); |
226 state->SetBoolean("pending_tree_is_ready_for_activation", | 219 state->SetBoolean("pending_tree_is_ready_for_activation", |
227 pending_tree_is_ready_for_activation_); | 220 pending_tree_is_ready_for_activation_); |
228 state->SetBoolean("active_tree_needs_first_draw", | 221 state->SetBoolean("active_tree_needs_first_draw", |
229 active_tree_needs_first_draw_); | 222 active_tree_needs_first_draw_); |
230 state->SetBoolean("did_commit_after_animating", did_commit_after_animating_); | 223 state->SetBoolean("did_commit_after_animating", did_commit_after_animating_); |
(...skipping 27 matching lines...) Expand all Loading... |
258 | 251 |
259 bool SchedulerStateMachine::HasAnimatedThisFrame() const { | 252 bool SchedulerStateMachine::HasAnimatedThisFrame() const { |
260 return last_frame_number_animate_performed_ == current_frame_number_; | 253 return last_frame_number_animate_performed_ == current_frame_number_; |
261 } | 254 } |
262 | 255 |
263 bool SchedulerStateMachine::HasSentBeginMainFrameThisFrame() const { | 256 bool SchedulerStateMachine::HasSentBeginMainFrameThisFrame() const { |
264 return current_frame_number_ == | 257 return current_frame_number_ == |
265 last_frame_number_begin_main_frame_sent_; | 258 last_frame_number_begin_main_frame_sent_; |
266 } | 259 } |
267 | 260 |
268 bool SchedulerStateMachine::HasUpdatedVisibleTilesThisFrame() const { | |
269 return current_frame_number_ == | |
270 last_frame_number_update_visible_tiles_was_called_; | |
271 } | |
272 | |
273 bool SchedulerStateMachine::HasSwappedThisFrame() const { | 261 bool SchedulerStateMachine::HasSwappedThisFrame() const { |
274 return current_frame_number_ == last_frame_number_swap_performed_; | 262 return current_frame_number_ == last_frame_number_swap_performed_; |
275 } | 263 } |
276 | 264 |
277 bool SchedulerStateMachine::HasRequestedSwapThisFrame() const { | 265 bool SchedulerStateMachine::HasRequestedSwapThisFrame() const { |
278 return current_frame_number_ == last_frame_number_swap_requested_; | 266 return current_frame_number_ == last_frame_number_swap_requested_; |
279 } | 267 } |
280 | 268 |
281 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { | 269 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { |
282 // These are all the cases where we normally cannot or do not want to draw | 270 // These are all the cases where we normally cannot or do not want to draw |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 return false; | 375 return false; |
388 | 376 |
389 // If we want to force activation, do so ASAP. | 377 // If we want to force activation, do so ASAP. |
390 if (PendingActivationsShouldBeForced()) | 378 if (PendingActivationsShouldBeForced()) |
391 return true; | 379 return true; |
392 | 380 |
393 // At this point, only activate if we are ready to activate. | 381 // At this point, only activate if we are ready to activate. |
394 return pending_tree_is_ready_for_activation_; | 382 return pending_tree_is_ready_for_activation_; |
395 } | 383 } |
396 | 384 |
397 bool SchedulerStateMachine::ShouldUpdateVisibleTiles() const { | |
398 if (!settings_.impl_side_painting) | |
399 return false; | |
400 if (HasUpdatedVisibleTilesThisFrame()) | |
401 return false; | |
402 | |
403 // We don't want to update visible tiles right after drawing. | |
404 if (HasRequestedSwapThisFrame()) | |
405 return false; | |
406 | |
407 // There's no reason to check for tiles if we don't have an output surface. | |
408 if (!HasInitializedOutputSurface()) | |
409 return false; | |
410 | |
411 // We should not check for visible tiles until we've entered the deadline so | |
412 // we check as late as possible and give the tiles more time to initialize. | |
413 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) | |
414 return false; | |
415 | |
416 // If the last swap drew with checkerboard or missing tiles, we should | |
417 // poll for any new visible tiles so we can be notified to draw again | |
418 // when there are. | |
419 if (swap_used_incomplete_tile_) | |
420 return true; | |
421 | |
422 return false; | |
423 } | |
424 | |
425 bool SchedulerStateMachine::ShouldAnimate() const { | 385 bool SchedulerStateMachine::ShouldAnimate() const { |
426 // If a commit occurred after our last call, we need to do animation again. | 386 // If a commit occurred after our last call, we need to do animation again. |
427 if (HasAnimatedThisFrame() && !did_commit_after_animating_) | 387 if (HasAnimatedThisFrame() && !did_commit_after_animating_) |
428 return false; | 388 return false; |
429 | 389 |
430 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING && | 390 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING && |
431 begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) | 391 begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) |
432 return false; | 392 return false; |
433 | 393 |
434 return needs_redraw_ || needs_animate_; | 394 return needs_redraw_ || needs_animate_; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 // Limiting to once per-frame is not enough, since we only want to | 487 // Limiting to once per-frame is not enough, since we only want to |
528 // manage tiles _after_ draws. Polling for draw triggers and | 488 // manage tiles _after_ draws. Polling for draw triggers and |
529 // begin-frame are mutually exclusive, so we limit to these two cases. | 489 // begin-frame are mutually exclusive, so we limit to these two cases. |
530 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE && | 490 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE && |
531 !inside_poll_for_anticipated_draw_triggers_) | 491 !inside_poll_for_anticipated_draw_triggers_) |
532 return false; | 492 return false; |
533 return needs_manage_tiles_; | 493 return needs_manage_tiles_; |
534 } | 494 } |
535 | 495 |
536 SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const { | 496 SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const { |
537 if (ShouldUpdateVisibleTiles()) | |
538 return ACTION_UPDATE_VISIBLE_TILES; | |
539 if (ShouldActivatePendingTree()) | 497 if (ShouldActivatePendingTree()) |
540 return ACTION_ACTIVATE_SYNC_TREE; | 498 return ACTION_ACTIVATE_SYNC_TREE; |
541 if (ShouldCommit()) | 499 if (ShouldCommit()) |
542 return ACTION_COMMIT; | 500 return ACTION_COMMIT; |
543 if (ShouldAnimate()) | 501 if (ShouldAnimate()) |
544 return ACTION_ANIMATE; | 502 return ACTION_ANIMATE; |
545 if (ShouldDraw()) { | 503 if (ShouldDraw()) { |
546 if (PendingDrawsShouldBeAborted()) | 504 if (PendingDrawsShouldBeAborted()) |
547 return ACTION_DRAW_AND_SWAP_ABORT; | 505 return ACTION_DRAW_AND_SWAP_ABORT; |
548 else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) | 506 else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) |
549 return ACTION_DRAW_AND_SWAP_FORCED; | 507 return ACTION_DRAW_AND_SWAP_FORCED; |
550 else | 508 else |
551 return ACTION_DRAW_AND_SWAP_IF_POSSIBLE; | 509 return ACTION_DRAW_AND_SWAP_IF_POSSIBLE; |
552 } | 510 } |
553 if (ShouldManageTiles()) | 511 if (ShouldManageTiles()) |
554 return ACTION_MANAGE_TILES; | 512 return ACTION_MANAGE_TILES; |
555 if (ShouldSendBeginMainFrame()) | 513 if (ShouldSendBeginMainFrame()) |
556 return ACTION_SEND_BEGIN_MAIN_FRAME; | 514 return ACTION_SEND_BEGIN_MAIN_FRAME; |
557 if (ShouldBeginOutputSurfaceCreation()) | 515 if (ShouldBeginOutputSurfaceCreation()) |
558 return ACTION_BEGIN_OUTPUT_SURFACE_CREATION; | 516 return ACTION_BEGIN_OUTPUT_SURFACE_CREATION; |
559 return ACTION_NONE; | 517 return ACTION_NONE; |
560 } | 518 } |
561 | 519 |
562 void SchedulerStateMachine::UpdateState(Action action) { | 520 void SchedulerStateMachine::UpdateState(Action action) { |
563 switch (action) { | 521 switch (action) { |
564 case ACTION_NONE: | 522 case ACTION_NONE: |
565 return; | 523 return; |
566 | 524 |
567 case ACTION_UPDATE_VISIBLE_TILES: | |
568 last_frame_number_update_visible_tiles_was_called_ = | |
569 current_frame_number_; | |
570 return; | |
571 | |
572 case ACTION_ACTIVATE_SYNC_TREE: | 525 case ACTION_ACTIVATE_SYNC_TREE: |
573 UpdateStateOnActivation(); | 526 UpdateStateOnActivation(); |
574 return; | 527 return; |
575 | 528 |
576 case ACTION_ANIMATE: | 529 case ACTION_ANIMATE: |
577 last_frame_number_animate_performed_ = current_frame_number_; | 530 last_frame_number_animate_performed_ = current_frame_number_; |
578 needs_animate_ = false; | 531 needs_animate_ = false; |
579 did_commit_after_animating_ = false; | 532 did_commit_after_animating_ = false; |
580 // TODO(skyostil): Instead of assuming this, require the client to tell | 533 // TODO(skyostil): Instead of assuming this, require the client to tell |
581 // us. | 534 // us. |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 // The output surface is the provider of BeginImplFrames, so we are not going | 713 // The output surface is the provider of BeginImplFrames, so we are not going |
761 // to get them even if we ask for them. | 714 // to get them even if we ask for them. |
762 if (!HasInitializedOutputSurface()) | 715 if (!HasInitializedOutputSurface()) |
763 return false; | 716 return false; |
764 | 717 |
765 // The forced draw respects our normal draw scheduling, so we need to | 718 // The forced draw respects our normal draw scheduling, so we need to |
766 // request a BeginImplFrame for it. | 719 // request a BeginImplFrame for it. |
767 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) | 720 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) |
768 return true; | 721 return true; |
769 | 722 |
770 // We need to draw a more complete frame than we did the last BeginImplFrame, | |
771 // so request another BeginImplFrame in anticipation that we will have | |
772 // additional visible tiles. | |
773 if (swap_used_incomplete_tile_) | |
774 return true; | |
775 | |
776 return needs_animate_ || needs_redraw_; | 723 return needs_animate_ || needs_redraw_; |
777 } | 724 } |
778 | 725 |
779 // These are cases where we are very likely to draw soon, but might not | 726 // These are cases where we are very likely to draw soon, but might not |
780 // actually have a new frame to draw when we receive the next BeginImplFrame. | 727 // actually have a new frame to draw when we receive the next BeginImplFrame. |
781 // Proactively requesting the BeginImplFrame helps hide the round trip latency | 728 // Proactively requesting the BeginImplFrame helps hide the round trip latency |
782 // of the SetNeedsBeginFrame request that has to go to the Browser. | 729 // of the SetNeedsBeginFrame request that has to go to the Browser. |
783 bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { | 730 bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { |
784 // The output surface is the provider of BeginImplFrames, | 731 // The output surface is the provider of BeginImplFrames, |
785 // so we are not going to get them even if we ask for them. | 732 // so we are not going to get them even if we ask for them. |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 max_pending_swaps_ = max; | 903 max_pending_swaps_ = max; |
957 } | 904 } |
958 | 905 |
959 void SchedulerStateMachine::DidSwapBuffers() { | 906 void SchedulerStateMachine::DidSwapBuffers() { |
960 pending_swaps_++; | 907 pending_swaps_++; |
961 DCHECK_LE(pending_swaps_, max_pending_swaps_); | 908 DCHECK_LE(pending_swaps_, max_pending_swaps_); |
962 | 909 |
963 last_frame_number_swap_performed_ = current_frame_number_; | 910 last_frame_number_swap_performed_ = current_frame_number_; |
964 } | 911 } |
965 | 912 |
966 void SchedulerStateMachine::SetSwapUsedIncompleteTile( | |
967 bool used_incomplete_tile) { | |
968 swap_used_incomplete_tile_ = used_incomplete_tile; | |
969 } | |
970 | |
971 void SchedulerStateMachine::DidSwapBuffersComplete() { | 913 void SchedulerStateMachine::DidSwapBuffersComplete() { |
972 DCHECK_GT(pending_swaps_, 0); | 914 DCHECK_GT(pending_swaps_, 0); |
973 pending_swaps_--; | 915 pending_swaps_--; |
974 } | 916 } |
975 | 917 |
976 void SchedulerStateMachine::SetImplLatencyTakesPriority( | 918 void SchedulerStateMachine::SetImplLatencyTakesPriority( |
977 bool impl_latency_takes_priority) { | 919 bool impl_latency_takes_priority) { |
978 impl_latency_takes_priority_ = impl_latency_takes_priority; | 920 impl_latency_takes_priority_ = impl_latency_takes_priority; |
979 } | 921 } |
980 | 922 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 static_cast<int>(begin_impl_frame_state_), | 1043 static_cast<int>(begin_impl_frame_state_), |
1102 static_cast<int>(commit_state_), | 1044 static_cast<int>(commit_state_), |
1103 has_pending_tree_ ? 'T' : 'F', | 1045 has_pending_tree_ ? 'T' : 'F', |
1104 pending_tree_is_ready_for_activation_ ? 'T' : 'F', | 1046 pending_tree_is_ready_for_activation_ ? 'T' : 'F', |
1105 active_tree_needs_first_draw_ ? 'T' : 'F', | 1047 active_tree_needs_first_draw_ ? 'T' : 'F', |
1106 max_pending_swaps_, | 1048 max_pending_swaps_, |
1107 pending_swaps_); | 1049 pending_swaps_); |
1108 } | 1050 } |
1109 | 1051 |
1110 } // namespace cc | 1052 } // namespace cc |
OLD | NEW |