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

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

Issue 2409923002: cc: Rename SwapBuffers on CompositorFrameSink to SubmitCompositorFrame (Closed)
Patch Set: swap-to-submit: . Created 4 years, 2 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"
11 #include "base/trace_event/trace_event_argument.h" 11 #include "base/trace_event/trace_event_argument.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 13
14 namespace cc { 14 namespace cc {
15 15
16 namespace { 16 namespace {
17 // Surfaces and CompositorTimingHistory don't support more than 1 pending swap. 17 // Surfaces and CompositorTimingHistory don't support more than 1 pending swap.
18 const int kMaxPendingSwaps = 1; 18 const int kMaxPendingSubmitFrames = 1;
19 } // namespace 19 } // namespace
20 20
21 SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) 21 SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
22 : settings_(settings), 22 : settings_(settings),
23 compositor_frame_sink_state_(COMPOSITOR_FRAME_SINK_NONE), 23 compositor_frame_sink_state_(COMPOSITOR_FRAME_SINK_NONE),
24 begin_impl_frame_state_(BEGIN_IMPL_FRAME_STATE_IDLE), 24 begin_impl_frame_state_(BEGIN_IMPL_FRAME_STATE_IDLE),
25 begin_main_frame_state_(BEGIN_MAIN_FRAME_STATE_IDLE), 25 begin_main_frame_state_(BEGIN_MAIN_FRAME_STATE_IDLE),
26 forced_redraw_state_(FORCED_REDRAW_STATE_IDLE), 26 forced_redraw_state_(FORCED_REDRAW_STATE_IDLE),
27 commit_count_(0), 27 commit_count_(0),
28 current_frame_number_(0), 28 current_frame_number_(0),
29 last_frame_number_swap_performed_(-1), 29 last_frame_number_submit_performed_(-1),
30 last_frame_number_draw_performed_(-1), 30 last_frame_number_draw_performed_(-1),
31 last_frame_number_begin_main_frame_sent_(-1), 31 last_frame_number_begin_main_frame_sent_(-1),
32 last_frame_number_invalidate_compositor_frame_sink_performed_(-1), 32 last_frame_number_invalidate_compositor_frame_sink_performed_(-1),
33 draw_funnel_(false), 33 draw_funnel_(false),
34 send_begin_main_frame_funnel_(true), 34 send_begin_main_frame_funnel_(true),
35 invalidate_compositor_frame_sink_funnel_(false), 35 invalidate_compositor_frame_sink_funnel_(false),
36 prepare_tiles_funnel_(0), 36 prepare_tiles_funnel_(0),
37 consecutive_checkerboard_animations_(0), 37 consecutive_checkerboard_animations_(0),
38 pending_swaps_(0), 38 pending_submit_frames_(0),
39 swaps_with_current_compositor_frame_sink_(0), 39 submit_frames_with_current_compositor_frame_sink_(0),
40 needs_redraw_(false), 40 needs_redraw_(false),
41 needs_prepare_tiles_(false), 41 needs_prepare_tiles_(false),
42 needs_begin_main_frame_(false), 42 needs_begin_main_frame_(false),
43 needs_one_begin_impl_frame_(false), 43 needs_one_begin_impl_frame_(false),
44 visible_(false), 44 visible_(false),
45 begin_frame_source_paused_(false), 45 begin_frame_source_paused_(false),
46 resourceless_draw_(false), 46 resourceless_draw_(false),
47 can_draw_(false), 47 can_draw_(false),
48 has_pending_tree_(false), 48 has_pending_tree_(false),
49 pending_tree_is_ready_for_activation_(false), 49 pending_tree_is_ready_for_activation_(false),
50 active_tree_needs_first_draw_(false), 50 active_tree_needs_first_draw_(false),
51 did_create_and_initialize_first_compositor_frame_sink_(false), 51 did_create_and_initialize_first_compositor_frame_sink_(false),
52 tree_priority_(NEW_CONTENT_TAKES_PRIORITY), 52 tree_priority_(NEW_CONTENT_TAKES_PRIORITY),
53 scroll_handler_state_( 53 scroll_handler_state_(
54 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER), 54 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER),
55 critical_begin_main_frame_to_activate_is_fast_(true), 55 critical_begin_main_frame_to_activate_is_fast_(true),
56 main_thread_missed_last_deadline_(false), 56 main_thread_missed_last_deadline_(false),
57 skip_next_begin_main_frame_to_reduce_latency_(false), 57 skip_next_begin_main_frame_to_reduce_latency_(false),
58 defer_commits_(false), 58 defer_commits_(false),
59 video_needs_begin_frames_(false), 59 video_needs_begin_frames_(false),
60 last_commit_had_no_updates_(false), 60 last_commit_had_no_updates_(false),
61 wait_for_ready_to_draw_(false), 61 wait_for_ready_to_draw_(false),
62 did_draw_in_last_frame_(false), 62 did_draw_in_last_frame_(false),
63 did_swap_in_last_frame_(false) {} 63 did_submit_in_last_frame_(false) {}
64 64
65 const char* SchedulerStateMachine::CompositorFrameSinkStateToString( 65 const char* SchedulerStateMachine::CompositorFrameSinkStateToString(
66 CompositorFrameSinkState state) { 66 CompositorFrameSinkState state) {
67 switch (state) { 67 switch (state) {
68 case COMPOSITOR_FRAME_SINK_NONE: 68 case COMPOSITOR_FRAME_SINK_NONE:
69 return "COMPOSITOR_FRAME_SINK_NONE"; 69 return "COMPOSITOR_FRAME_SINK_NONE";
70 case COMPOSITOR_FRAME_SINK_ACTIVE: 70 case COMPOSITOR_FRAME_SINK_ACTIVE:
71 return "COMPOSITOR_FRAME_SINK_ACTIVE"; 71 return "COMPOSITOR_FRAME_SINK_ACTIVE";
72 case COMPOSITOR_FRAME_SINK_CREATING: 72 case COMPOSITOR_FRAME_SINK_CREATING:
73 return "COMPOSITOR_FRAME_SINK_CREATING"; 73 return "COMPOSITOR_FRAME_SINK_CREATING";
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 const char* SchedulerStateMachine::ActionToString(Action action) { 158 const char* SchedulerStateMachine::ActionToString(Action action) {
159 switch (action) { 159 switch (action) {
160 case ACTION_NONE: 160 case ACTION_NONE:
161 return "ACTION_NONE"; 161 return "ACTION_NONE";
162 case ACTION_SEND_BEGIN_MAIN_FRAME: 162 case ACTION_SEND_BEGIN_MAIN_FRAME:
163 return "ACTION_SEND_BEGIN_MAIN_FRAME"; 163 return "ACTION_SEND_BEGIN_MAIN_FRAME";
164 case ACTION_COMMIT: 164 case ACTION_COMMIT:
165 return "ACTION_COMMIT"; 165 return "ACTION_COMMIT";
166 case ACTION_ACTIVATE_SYNC_TREE: 166 case ACTION_ACTIVATE_SYNC_TREE:
167 return "ACTION_ACTIVATE_SYNC_TREE"; 167 return "ACTION_ACTIVATE_SYNC_TREE";
168 case ACTION_DRAW_AND_SWAP_IF_POSSIBLE: 168 case ACTION_DRAW_IF_POSSIBLE:
169 return "ACTION_DRAW_AND_SWAP_IF_POSSIBLE"; 169 return "ACTION_DRAW_IF_POSSIBLE";
170 case ACTION_DRAW_AND_SWAP_FORCED: 170 case ACTION_DRAW_FORCED:
171 return "ACTION_DRAW_AND_SWAP_FORCED"; 171 return "ACTION_DRAW_FORCED";
172 case ACTION_DRAW_AND_SWAP_ABORT: 172 case ACTION_DRAW_ABORT:
173 return "ACTION_DRAW_AND_SWAP_ABORT"; 173 return "ACTION_DRAW_ABORT";
174 case ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION: 174 case ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION:
175 return "ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION"; 175 return "ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION";
176 case ACTION_PREPARE_TILES: 176 case ACTION_PREPARE_TILES:
177 return "ACTION_PREPARE_TILES"; 177 return "ACTION_PREPARE_TILES";
178 case ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK: 178 case ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK:
179 return "ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK"; 179 return "ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK";
180 } 180 }
181 NOTREACHED(); 181 NOTREACHED();
182 return "???"; 182 return "???";
183 } 183 }
(...skipping 17 matching lines...) Expand all
201 state->SetString( 201 state->SetString(
202 "compositor_frame_sink_state_", 202 "compositor_frame_sink_state_",
203 CompositorFrameSinkStateToString(compositor_frame_sink_state_)); 203 CompositorFrameSinkStateToString(compositor_frame_sink_state_));
204 state->SetString("forced_redraw_state", 204 state->SetString("forced_redraw_state",
205 ForcedRedrawOnTimeoutStateToString(forced_redraw_state_)); 205 ForcedRedrawOnTimeoutStateToString(forced_redraw_state_));
206 state->EndDictionary(); 206 state->EndDictionary();
207 207
208 state->BeginDictionary("minor_state"); 208 state->BeginDictionary("minor_state");
209 state->SetInteger("commit_count", commit_count_); 209 state->SetInteger("commit_count", commit_count_);
210 state->SetInteger("current_frame_number", current_frame_number_); 210 state->SetInteger("current_frame_number", current_frame_number_);
211 state->SetInteger("last_frame_number_swap_performed", 211 state->SetInteger("last_frame_number_submit_performed",
212 last_frame_number_swap_performed_); 212 last_frame_number_submit_performed_);
213 state->SetInteger("last_frame_number_draw_performed", 213 state->SetInteger("last_frame_number_draw_performed",
214 last_frame_number_draw_performed_); 214 last_frame_number_draw_performed_);
215 state->SetInteger("last_frame_number_begin_main_frame_sent", 215 state->SetInteger("last_frame_number_begin_main_frame_sent",
216 last_frame_number_begin_main_frame_sent_); 216 last_frame_number_begin_main_frame_sent_);
217 state->SetBoolean("funnel: draw_funnel", draw_funnel_); 217 state->SetBoolean("funnel: draw_funnel", draw_funnel_);
218 state->SetBoolean("funnel: send_begin_main_frame_funnel", 218 state->SetBoolean("funnel: send_begin_main_frame_funnel",
219 send_begin_main_frame_funnel_); 219 send_begin_main_frame_funnel_);
220 state->SetInteger("funnel: prepare_tiles_funnel", prepare_tiles_funnel_); 220 state->SetInteger("funnel: prepare_tiles_funnel", prepare_tiles_funnel_);
221 state->SetBoolean("funnel: invalidate_compositor_frame_sink_funnel", 221 state->SetBoolean("funnel: invalidate_compositor_frame_sink_funnel",
222 invalidate_compositor_frame_sink_funnel_); 222 invalidate_compositor_frame_sink_funnel_);
223 state->SetInteger("consecutive_checkerboard_animations", 223 state->SetInteger("consecutive_checkerboard_animations",
224 consecutive_checkerboard_animations_); 224 consecutive_checkerboard_animations_);
225 state->SetInteger("pending_swaps_", pending_swaps_); 225 state->SetInteger("pending_submit_frames_", pending_submit_frames_);
226 state->SetInteger("swaps_with_current_compositor_frame_sink", 226 state->SetInteger("submit_frames_with_current_compositor_frame_sink",
227 swaps_with_current_compositor_frame_sink_); 227 submit_frames_with_current_compositor_frame_sink_);
228 state->SetBoolean("needs_redraw", needs_redraw_); 228 state->SetBoolean("needs_redraw", needs_redraw_);
229 state->SetBoolean("needs_prepare_tiles", needs_prepare_tiles_); 229 state->SetBoolean("needs_prepare_tiles", needs_prepare_tiles_);
230 state->SetBoolean("needs_begin_main_frame", needs_begin_main_frame_); 230 state->SetBoolean("needs_begin_main_frame", needs_begin_main_frame_);
231 state->SetBoolean("needs_one_begin_impl_frame", needs_one_begin_impl_frame_); 231 state->SetBoolean("needs_one_begin_impl_frame", needs_one_begin_impl_frame_);
232 state->SetBoolean("visible", visible_); 232 state->SetBoolean("visible", visible_);
233 state->SetBoolean("begin_frame_source_paused", begin_frame_source_paused_); 233 state->SetBoolean("begin_frame_source_paused", begin_frame_source_paused_);
234 state->SetBoolean("can_draw", can_draw_); 234 state->SetBoolean("can_draw", can_draw_);
235 state->SetBoolean("resourceless_draw", resourceless_draw_); 235 state->SetBoolean("resourceless_draw", resourceless_draw_);
236 state->SetBoolean("has_pending_tree", has_pending_tree_); 236 state->SetBoolean("has_pending_tree", has_pending_tree_);
237 state->SetBoolean("pending_tree_is_ready_for_activation", 237 state->SetBoolean("pending_tree_is_ready_for_activation",
238 pending_tree_is_ready_for_activation_); 238 pending_tree_is_ready_for_activation_);
239 state->SetBoolean("active_tree_needs_first_draw", 239 state->SetBoolean("active_tree_needs_first_draw",
240 active_tree_needs_first_draw_); 240 active_tree_needs_first_draw_);
241 state->SetBoolean("wait_for_ready_to_draw", wait_for_ready_to_draw_); 241 state->SetBoolean("wait_for_ready_to_draw", wait_for_ready_to_draw_);
242 state->SetBoolean("did_create_and_initialize_first_compositor_frame_sink", 242 state->SetBoolean("did_create_and_initialize_first_compositor_frame_sink",
243 did_create_and_initialize_first_compositor_frame_sink_); 243 did_create_and_initialize_first_compositor_frame_sink_);
244 state->SetString("tree_priority", TreePriorityToString(tree_priority_)); 244 state->SetString("tree_priority", TreePriorityToString(tree_priority_));
245 state->SetString("scroll_handler_state", 245 state->SetString("scroll_handler_state",
246 ScrollHandlerStateToString(scroll_handler_state_)); 246 ScrollHandlerStateToString(scroll_handler_state_));
247 state->SetBoolean("critical_begin_main_frame_to_activate_is_fast_", 247 state->SetBoolean("critical_begin_main_frame_to_activate_is_fast_",
248 critical_begin_main_frame_to_activate_is_fast_); 248 critical_begin_main_frame_to_activate_is_fast_);
249 state->SetBoolean("main_thread_missed_last_deadline", 249 state->SetBoolean("main_thread_missed_last_deadline",
250 main_thread_missed_last_deadline_); 250 main_thread_missed_last_deadline_);
251 state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency", 251 state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency",
252 skip_next_begin_main_frame_to_reduce_latency_); 252 skip_next_begin_main_frame_to_reduce_latency_);
253 state->SetBoolean("video_needs_begin_frames", video_needs_begin_frames_); 253 state->SetBoolean("video_needs_begin_frames", video_needs_begin_frames_);
254 state->SetBoolean("defer_commits", defer_commits_); 254 state->SetBoolean("defer_commits", defer_commits_);
255 state->SetBoolean("last_commit_had_no_updates", last_commit_had_no_updates_); 255 state->SetBoolean("last_commit_had_no_updates", last_commit_had_no_updates_);
256 state->SetBoolean("did_draw_in_last_frame", did_draw_in_last_frame_); 256 state->SetBoolean("did_draw_in_last_frame", did_draw_in_last_frame_);
257 state->SetBoolean("did_swap_in_last_frame", did_swap_in_last_frame_); 257 state->SetBoolean("did_submit_in_last_frame", did_submit_in_last_frame_);
258 state->EndDictionary(); 258 state->EndDictionary();
259 } 259 }
260 260
261 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { 261 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const {
262 // Normally when |visible_| is false or |begin_frame_source_paused_| is true, 262 // Normally when |visible_| is false or |begin_frame_source_paused_| is true,
263 // pending activations will be forced and draws will be aborted. However, 263 // pending activations will be forced and draws will be aborted. However,
264 // when the embedder is Android WebView, software draws could be scheduled by 264 // when the embedder is Android WebView, software draws could be scheduled by
265 // the Android OS at any time and draws should not be aborted in this case. 265 // the Android OS at any time and draws should not be aborted in this case.
266 bool is_compositor_frame_sink_lost = 266 bool is_compositor_frame_sink_lost =
267 (compositor_frame_sink_state_ == COMPOSITOR_FRAME_SINK_NONE); 267 (compositor_frame_sink_state_ == COMPOSITOR_FRAME_SINK_NONE);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 // Do not draw too many times in a single frame. It's okay that we don't check 347 // Do not draw too many times in a single frame. It's okay that we don't check
348 // this before checking for aborted draws because aborted draws do not request 348 // this before checking for aborted draws because aborted draws do not request
349 // a swap. 349 // a swap.
350 if (draw_funnel_) 350 if (draw_funnel_)
351 return false; 351 return false;
352 352
353 // Don't draw if we are waiting on the first commit after a surface. 353 // Don't draw if we are waiting on the first commit after a surface.
354 if (compositor_frame_sink_state_ != COMPOSITOR_FRAME_SINK_ACTIVE) 354 if (compositor_frame_sink_state_ != COMPOSITOR_FRAME_SINK_ACTIVE)
355 return false; 355 return false;
356 356
357 // Do not queue too many swaps. 357 // Do not queue too many swaps.
sunnyps 2016/10/14 01:08:47 nit: swaps -> draws
358 if (SwapThrottled()) 358 if (IsDrawThrottled())
359 return false; 359 return false;
360 360
361 // Except for the cases above, do not draw outside of the BeginImplFrame 361 // Except for the cases above, do not draw outside of the BeginImplFrame
362 // deadline. 362 // deadline.
363 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) 363 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE)
364 return false; 364 return false;
365 365
366 // Wait for active tree to be rasterized before drawing in browser compositor. 366 // Wait for active tree to be rasterized before drawing in browser compositor.
367 if (wait_for_ready_to_draw_) { 367 if (wait_for_ready_to_draw_) {
368 DCHECK(settings_.commit_to_active_tree); 368 DCHECK(settings_.commit_to_active_tree);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 // Other parts of the state machine indirectly defer the BeginMainFrame 433 // Other parts of the state machine indirectly defer the BeginMainFrame
434 // by transitioning to WAITING commit states rather than going 434 // by transitioning to WAITING commit states rather than going
435 // immediately to IDLE. 435 // immediately to IDLE.
436 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_IDLE) 436 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_IDLE)
437 return false; 437 return false;
438 438
439 // MFBA is disabled and we are waiting for previous activation. 439 // MFBA is disabled and we are waiting for previous activation.
440 if (!settings_.main_frame_before_activation_enabled && has_pending_tree_) 440 if (!settings_.main_frame_before_activation_enabled && has_pending_tree_)
441 return false; 441 return false;
442 442
443 // We are waiting for previous frame to be drawn, swapped and acked. 443 // We are waiting for previous frame to be drawn, swapped and acked.
sunnyps 2016/10/14 01:08:47 nit: swapped -> submitted
444 if (settings_.commit_to_active_tree && 444 if (settings_.commit_to_active_tree &&
445 (active_tree_needs_first_draw_ || SwapThrottled())) { 445 (active_tree_needs_first_draw_ || IsDrawThrottled())) {
446 return false; 446 return false;
447 } 447 }
448 448
449 // Don't send BeginMainFrame early if we are prioritizing the active tree 449 // Don't send BeginMainFrame early if we are prioritizing the active tree
450 // because of ImplLatencyTakesPriority. 450 // because of ImplLatencyTakesPriority.
451 if (ImplLatencyTakesPriority() && 451 if (ImplLatencyTakesPriority() &&
452 (has_pending_tree_ || active_tree_needs_first_draw_)) { 452 (has_pending_tree_ || active_tree_needs_first_draw_)) {
453 return false; 453 return false;
454 } 454 }
455 455
(...skipping 10 matching lines...) Expand all
466 466
467 // We need a new commit for the forced redraw. This honors the 467 // We need a new commit for the forced redraw. This honors the
468 // single commit per interval because the result will be swapped to screen. 468 // single commit per interval because the result will be swapped to screen.
469 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_COMMIT) 469 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_COMMIT)
470 return true; 470 return true;
471 471
472 // We shouldn't normally accept commits if there isn't an CompositorFrameSink. 472 // We shouldn't normally accept commits if there isn't an CompositorFrameSink.
473 if (!HasInitializedCompositorFrameSink()) 473 if (!HasInitializedCompositorFrameSink())
474 return false; 474 return false;
475 475
476 if (!settings_.main_frame_while_swap_throttled_enabled) { 476 if (!settings_.main_frame_while_submit_frame_throttled_enabled) {
477 // SwapAck throttle the BeginMainFrames unless we just swapped to 477 // Throttle the BeginMainFrames on CompositorFrameAck unless we just
478 // potentially improve impl-thread latency over main-thread throughput. 478 // submitted a frame to potentially improve impl-thread latency over
479 // main-thread throughput.
479 // TODO(brianderson): Remove this restriction to improve throughput or 480 // TODO(brianderson): Remove this restriction to improve throughput or
480 // make it conditional on ImplLatencyTakesPriority. 481 // make it conditional on ImplLatencyTakesPriority.
481 bool just_swapped_in_deadline = 482 bool just_submitted_in_deadline =
482 begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE && 483 begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE &&
483 did_swap_in_last_frame_; 484 did_submit_in_last_frame_;
484 if (SwapThrottled() && !just_swapped_in_deadline) 485 if (IsDrawThrottled() && !just_submitted_in_deadline)
485 return false; 486 return false;
486 } 487 }
487 488
488 if (skip_next_begin_main_frame_to_reduce_latency_) 489 if (skip_next_begin_main_frame_to_reduce_latency_)
489 return false; 490 return false;
490 491
491 return true; 492 return true;
492 } 493 }
493 494
494 bool SchedulerStateMachine::ShouldCommit() const { 495 bool SchedulerStateMachine::ShouldCommit() const {
495 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT) 496 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT)
496 return false; 497 return false;
497 498
498 // We must not finish the commit until the pending tree is free. 499 // We must not finish the commit until the pending tree is free.
499 if (has_pending_tree_) { 500 if (has_pending_tree_) {
500 DCHECK(settings_.main_frame_before_activation_enabled); 501 DCHECK(settings_.main_frame_before_activation_enabled);
501 return false; 502 return false;
502 } 503 }
503 504
504 // If we only have an active tree, it is incorrect to replace it before we've 505 // If we only have an active tree, it is incorrect to replace it before we've
505 // drawn it. 506 // drawn it.
506 DCHECK(!settings_.commit_to_active_tree || !active_tree_needs_first_draw_); 507 DCHECK(!settings_.commit_to_active_tree || !active_tree_needs_first_draw_);
507 508
508 // In browser compositor commit reclaims any resources submitted during draw. 509 // In browser compositor commit reclaims any resources submitted during draw.
509 DCHECK(!settings_.commit_to_active_tree || !SwapThrottled()); 510 DCHECK(!settings_.commit_to_active_tree || !IsDrawThrottled());
510 511
511 return true; 512 return true;
512 } 513 }
513 514
514 bool SchedulerStateMachine::ShouldPrepareTiles() const { 515 bool SchedulerStateMachine::ShouldPrepareTiles() const {
515 // PrepareTiles only really needs to be called immediately after commit 516 // PrepareTiles only really needs to be called immediately after commit
516 // and then periodically after that. Use a funnel to make sure we average 517 // and then periodically after that. Use a funnel to make sure we average
517 // one PrepareTiles per BeginImplFrame in the long run. 518 // one PrepareTiles per BeginImplFrame in the long run.
518 if (prepare_tiles_funnel_ > 0) 519 if (prepare_tiles_funnel_ > 0)
519 return false; 520 return false;
(...skipping 25 matching lines...) Expand all
545 return needs_redraw_ || needs_prepare_tiles_; 546 return needs_redraw_ || needs_prepare_tiles_;
546 } 547 }
547 548
548 SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const { 549 SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const {
549 if (ShouldActivatePendingTree()) 550 if (ShouldActivatePendingTree())
550 return ACTION_ACTIVATE_SYNC_TREE; 551 return ACTION_ACTIVATE_SYNC_TREE;
551 if (ShouldCommit()) 552 if (ShouldCommit())
552 return ACTION_COMMIT; 553 return ACTION_COMMIT;
553 if (ShouldDraw()) { 554 if (ShouldDraw()) {
554 if (PendingDrawsShouldBeAborted()) 555 if (PendingDrawsShouldBeAborted())
555 return ACTION_DRAW_AND_SWAP_ABORT; 556 return ACTION_DRAW_ABORT;
556 else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) 557 else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW)
557 return ACTION_DRAW_AND_SWAP_FORCED; 558 return ACTION_DRAW_FORCED;
558 else 559 else
559 return ACTION_DRAW_AND_SWAP_IF_POSSIBLE; 560 return ACTION_DRAW_IF_POSSIBLE;
560 } 561 }
561 if (ShouldPrepareTiles()) 562 if (ShouldPrepareTiles())
562 return ACTION_PREPARE_TILES; 563 return ACTION_PREPARE_TILES;
563 if (ShouldSendBeginMainFrame()) 564 if (ShouldSendBeginMainFrame())
564 return ACTION_SEND_BEGIN_MAIN_FRAME; 565 return ACTION_SEND_BEGIN_MAIN_FRAME;
565 if (ShouldInvalidateCompositorFrameSink()) 566 if (ShouldInvalidateCompositorFrameSink())
566 return ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK; 567 return ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK;
567 if (ShouldBeginCompositorFrameSinkCreation()) 568 if (ShouldBeginCompositorFrameSinkCreation())
568 return ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION; 569 return ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION;
569 return ACTION_NONE; 570 return ACTION_NONE;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 case DRAW_ABORTED_CANT_DRAW: 653 case DRAW_ABORTED_CANT_DRAW:
653 case DRAW_ABORTED_CONTEXT_LOST: 654 case DRAW_ABORTED_CONTEXT_LOST:
654 NOTREACHED() << "Invalid return DrawResult:" << draw_result; 655 NOTREACHED() << "Invalid return DrawResult:" << draw_result;
655 break; 656 break;
656 case DRAW_ABORTED_DRAINING_PIPELINE: 657 case DRAW_ABORTED_DRAINING_PIPELINE:
657 case DRAW_SUCCESS: 658 case DRAW_SUCCESS:
658 consecutive_checkerboard_animations_ = 0; 659 consecutive_checkerboard_animations_ = 0;
659 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; 660 forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE;
660 break; 661 break;
661 case DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: 662 case DRAW_ABORTED_CHECKERBOARD_ANIMATIONS:
662 DCHECK(!did_swap_in_last_frame_); 663 DCHECK(!did_submit_in_last_frame_);
663 needs_begin_main_frame_ = true; 664 needs_begin_main_frame_ = true;
664 needs_redraw_ = true; 665 needs_redraw_ = true;
665 consecutive_checkerboard_animations_++; 666 consecutive_checkerboard_animations_++;
666 667
667 if (consecutive_checkerboard_animations_ >= 668 if (consecutive_checkerboard_animations_ >=
668 settings_.maximum_number_of_failed_draws_before_draw_is_forced && 669 settings_.maximum_number_of_failed_draws_before_draw_is_forced &&
669 forced_redraw_state_ == FORCED_REDRAW_STATE_IDLE && 670 forced_redraw_state_ == FORCED_REDRAW_STATE_IDLE &&
670 settings_.timeout_and_draw_when_animation_checkerboards) { 671 settings_.timeout_and_draw_when_animation_checkerboards) {
671 // We need to force a draw, but it doesn't make sense to do this until 672 // We need to force a draw, but it doesn't make sense to do this until
672 // we've committed and have new textures. 673 // we've committed and have new textures.
673 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; 674 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT;
674 } 675 }
675 break; 676 break;
676 case DRAW_ABORTED_MISSING_HIGH_RES_CONTENT: 677 case DRAW_ABORTED_MISSING_HIGH_RES_CONTENT:
677 DCHECK(!did_swap_in_last_frame_); 678 DCHECK(!did_submit_in_last_frame_);
678 // It's not clear whether this missing content is because of missing 679 // It's not clear whether this missing content is because of missing
679 // pictures (which requires a commit) or because of memory pressure 680 // pictures (which requires a commit) or because of memory pressure
680 // removing textures (which might not). To be safe, request a commit 681 // removing textures (which might not). To be safe, request a commit
681 // anyway. 682 // anyway.
682 needs_begin_main_frame_ = true; 683 needs_begin_main_frame_ = true;
683 break; 684 break;
684 } 685 }
685 } 686 }
686 687
687 void SchedulerStateMachine::WillDraw() { 688 void SchedulerStateMachine::WillDraw() {
688 DCHECK(!draw_funnel_); 689 DCHECK(!draw_funnel_);
689 WillDrawInternal(); 690 WillDrawInternal();
690 } 691 }
691 692
692 void SchedulerStateMachine::DidDraw(DrawResult draw_result) { 693 void SchedulerStateMachine::DidDraw(DrawResult draw_result) {
693 DidDrawInternal(draw_result); 694 DidDrawInternal(draw_result);
694 } 695 }
695 696
696 void SchedulerStateMachine::AbortDrawAndSwap() { 697 void SchedulerStateMachine::AbortDraw() {
697 // Pretend like the draw was successful. 698 // Pretend like the draw was successful.
698 // Note: We may abort at any time and cannot DCHECK that 699 // Note: We may abort at any time and cannot DCHECK that
699 // we haven't drawn in or swapped in the last frame here. 700 // we haven't drawn in or swapped in the last frame here.
700 WillDrawInternal(); 701 WillDrawInternal();
701 DidDrawInternal(DRAW_ABORTED_DRAINING_PIPELINE); 702 DidDrawInternal(DRAW_ABORTED_DRAINING_PIPELINE);
702 } 703 }
703 704
704 void SchedulerStateMachine::WillPrepareTiles() { 705 void SchedulerStateMachine::WillPrepareTiles() {
705 needs_prepare_tiles_ = false; 706 needs_prepare_tiles_ = false;
706 } 707 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 // If the pending tree activates quickly, we'll want a BeginImplFrame soon 802 // If the pending tree activates quickly, we'll want a BeginImplFrame soon
802 // to draw the new active tree. 803 // to draw the new active tree.
803 if (has_pending_tree_) 804 if (has_pending_tree_)
804 return true; 805 return true;
805 806
806 // Changing priorities may allow us to activate (given the new priorities), 807 // Changing priorities may allow us to activate (given the new priorities),
807 // which may result in a new frame. 808 // which may result in a new frame.
808 if (needs_prepare_tiles_) 809 if (needs_prepare_tiles_)
809 return true; 810 return true;
810 811
811 // If we just tried to DrawAndSwap, it's likely that we are going to produce 812 // If we just tried to draw, it's likely that we are going to produce another
812 // another frame soon. This helps avoid negative glitches in our 813 // frame soon. This helps avoid negative glitches in our SetNeedsBeginFrame
813 // SetNeedsBeginFrame requests, which may propagate to the BeginImplFrame 814 // requests, which may propagate to the BeginImplFrame provider and get
814 // provider and get sampled at an inopportune time, delaying the next 815 // sampled at an inopportune time, delaying the next BeginImplFrame.
815 // BeginImplFrame.
816 if (did_draw_in_last_frame_) 816 if (did_draw_in_last_frame_)
817 return true; 817 return true;
818 818
819 // If the last commit was aborted because of early out (no updates), we should 819 // If the last commit was aborted because of early out (no updates), we should
820 // still want a begin frame in case there is a commit coming again. 820 // still want a begin frame in case there is a commit coming again.
821 if (last_commit_had_no_updates_) 821 if (last_commit_had_no_updates_)
822 return true; 822 return true;
823 823
824 return false; 824 return false;
825 } 825 }
826 826
827 void SchedulerStateMachine::OnBeginImplFrame() { 827 void SchedulerStateMachine::OnBeginImplFrame() {
828 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME; 828 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME;
829 current_frame_number_++; 829 current_frame_number_++;
830 830
831 last_commit_had_no_updates_ = false; 831 last_commit_had_no_updates_ = false;
832 did_draw_in_last_frame_ = false; 832 did_draw_in_last_frame_ = false;
833 did_swap_in_last_frame_ = false; 833 did_submit_in_last_frame_ = false;
834 needs_one_begin_impl_frame_ = false; 834 needs_one_begin_impl_frame_ = false;
835 835
836 // Clear funnels for any actions we perform during the frame. 836 // Clear funnels for any actions we perform during the frame.
837 send_begin_main_frame_funnel_ = false; 837 send_begin_main_frame_funnel_ = false;
838 invalidate_compositor_frame_sink_funnel_ = false; 838 invalidate_compositor_frame_sink_funnel_ = false;
839 839
840 // "Drain" the PrepareTiles funnel. 840 // "Drain" the PrepareTiles funnel.
841 if (prepare_tiles_funnel_ > 0) 841 if (prepare_tiles_funnel_ > 0)
842 prepare_tiles_funnel_--; 842 prepare_tiles_funnel_--;
843 } 843 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 return BEGIN_IMPL_FRAME_DEADLINE_MODE_LATE; 892 return BEGIN_IMPL_FRAME_DEADLINE_MODE_LATE;
893 } 893 }
894 } 894 }
895 895
896 bool SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately() 896 bool SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately()
897 const { 897 const {
898 // If we just forced activation, we should end the deadline right now. 898 // If we just forced activation, we should end the deadline right now.
899 if (PendingActivationsShouldBeForced() && !has_pending_tree_) 899 if (PendingActivationsShouldBeForced() && !has_pending_tree_)
900 return true; 900 return true;
901 901
902 // SwapAck throttle the deadline since we wont draw and swap anyway. 902 // Throttle the deadline on CompositorFrameAck since we wont draw and submit
903 if (SwapThrottled()) 903 // anyway.
904 if (IsDrawThrottled())
904 return false; 905 return false;
905 906
906 if (active_tree_needs_first_draw_) 907 if (active_tree_needs_first_draw_)
907 return true; 908 return true;
908 909
909 if (!needs_redraw_) 910 if (!needs_redraw_)
910 return false; 911 return false;
911 912
912 // This is used to prioritize impl-thread draws when the main thread isn't 913 // This is used to prioritize impl-thread draws when the main thread isn't
913 // producing anything, e.g., after an aborted commit. We also check that we 914 // producing anything, e.g., after an aborted commit. We also check that we
914 // don't have a pending tree -- otherwise we should give it a chance to 915 // don't have a pending tree -- otherwise we should give it a chance to
915 // activate. 916 // activate.
916 // TODO(skyostil): Revisit this when we have more accurate deadline estimates. 917 // TODO(skyostil): Revisit this when we have more accurate deadline estimates.
917 if (!CommitPending() && !has_pending_tree_) 918 if (!CommitPending() && !has_pending_tree_)
918 return true; 919 return true;
919 920
920 // Prioritize impl-thread draws in ImplLatencyTakesPriority mode. 921 // Prioritize impl-thread draws in ImplLatencyTakesPriority mode.
921 if (ImplLatencyTakesPriority()) 922 if (ImplLatencyTakesPriority())
922 return true; 923 return true;
923 924
924 return false; 925 return false;
925 } 926 }
926 927
927 bool SchedulerStateMachine::SwapThrottled() const { 928 bool SchedulerStateMachine::IsDrawThrottled() const {
928 return pending_swaps_ >= kMaxPendingSwaps; 929 return pending_submit_frames_ >= kMaxPendingSubmitFrames;
929 } 930 }
930 931
931 void SchedulerStateMachine::SetVisible(bool visible) { 932 void SchedulerStateMachine::SetVisible(bool visible) {
932 if (visible_ == visible) 933 if (visible_ == visible)
933 return; 934 return;
934 935
935 visible_ = visible; 936 visible_ = visible;
936 937
937 if (visible) 938 if (visible)
938 main_thread_missed_last_deadline_ = false; 939 main_thread_missed_last_deadline_ = false;
(...skipping 28 matching lines...) Expand all
967 has_pending_tree_; 968 has_pending_tree_;
968 return has_impl_updates && !main_updates_expected; 969 return has_impl_updates && !main_updates_expected;
969 } 970 }
970 971
971 void SchedulerStateMachine::SetNeedsPrepareTiles() { 972 void SchedulerStateMachine::SetNeedsPrepareTiles() {
972 if (!needs_prepare_tiles_) { 973 if (!needs_prepare_tiles_) {
973 TRACE_EVENT0("cc", "SchedulerStateMachine::SetNeedsPrepareTiles"); 974 TRACE_EVENT0("cc", "SchedulerStateMachine::SetNeedsPrepareTiles");
974 needs_prepare_tiles_ = true; 975 needs_prepare_tiles_ = true;
975 } 976 }
976 } 977 }
977 void SchedulerStateMachine::DidSwapBuffers() { 978 void SchedulerStateMachine::DidSubmitCompositorFrame() {
978 TRACE_EVENT_ASYNC_BEGIN1("cc", "Scheduler:pending_swaps", this, 979 TRACE_EVENT_ASYNC_BEGIN1("cc", "Scheduler:pending_submit_frames", this,
979 "pending_frames", pending_swaps_); 980 "pending_frames", pending_submit_frames_);
980 DCHECK_LT(pending_swaps_, kMaxPendingSwaps); 981 DCHECK_LT(pending_submit_frames_, kMaxPendingSubmitFrames);
981 982
982 pending_swaps_++; 983 pending_submit_frames_++;
983 swaps_with_current_compositor_frame_sink_++; 984 submit_frames_with_current_compositor_frame_sink_++;
984 985
985 did_swap_in_last_frame_ = true; 986 did_submit_in_last_frame_ = true;
986 last_frame_number_swap_performed_ = current_frame_number_; 987 last_frame_number_submit_performed_ = current_frame_number_;
987 } 988 }
988 989
989 void SchedulerStateMachine::DidSwapBuffersComplete() { 990 void SchedulerStateMachine::DidReceiveCompositorFrameAck() {
990 TRACE_EVENT_ASYNC_END1("cc", "Scheduler:pending_swaps", this, 991 TRACE_EVENT_ASYNC_END1("cc", "Scheduler:pending_submit_frames", this,
991 "pending_frames", pending_swaps_); 992 "pending_frames", pending_submit_frames_);
992 pending_swaps_--; 993 pending_submit_frames_--;
993 } 994 }
994 995
995 void SchedulerStateMachine::SetTreePrioritiesAndScrollState( 996 void SchedulerStateMachine::SetTreePrioritiesAndScrollState(
996 TreePriority tree_priority, 997 TreePriority tree_priority,
997 ScrollHandlerState scroll_handler_state) { 998 ScrollHandlerState scroll_handler_state) {
998 tree_priority_ = tree_priority; 999 tree_priority_ = tree_priority;
999 scroll_handler_state_ = scroll_handler_state; 1000 scroll_handler_state_ = scroll_handler_state;
1000 } 1001 }
1001 1002
1002 void SchedulerStateMachine::SetCriticalBeginMainFrameToActivateIsFast( 1003 void SchedulerStateMachine::SetCriticalBeginMainFrameToActivateIsFast(
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 void SchedulerStateMachine::DidCreateAndInitializeCompositorFrameSink() { 1086 void SchedulerStateMachine::DidCreateAndInitializeCompositorFrameSink() {
1086 DCHECK_EQ(compositor_frame_sink_state_, COMPOSITOR_FRAME_SINK_CREATING); 1087 DCHECK_EQ(compositor_frame_sink_state_, COMPOSITOR_FRAME_SINK_CREATING);
1087 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT; 1088 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT;
1088 1089
1089 if (did_create_and_initialize_first_compositor_frame_sink_) { 1090 if (did_create_and_initialize_first_compositor_frame_sink_) {
1090 // TODO(boliu): See if we can remove this when impl-side painting is always 1091 // TODO(boliu): See if we can remove this when impl-side painting is always
1091 // on. Does anything on the main thread need to update after recreate? 1092 // on. Does anything on the main thread need to update after recreate?
1092 needs_begin_main_frame_ = true; 1093 needs_begin_main_frame_ = true;
1093 } 1094 }
1094 did_create_and_initialize_first_compositor_frame_sink_ = true; 1095 did_create_and_initialize_first_compositor_frame_sink_ = true;
1095 pending_swaps_ = 0; 1096 pending_submit_frames_ = 0;
1096 swaps_with_current_compositor_frame_sink_ = 0; 1097 submit_frames_with_current_compositor_frame_sink_ = 0;
1097 main_thread_missed_last_deadline_ = false; 1098 main_thread_missed_last_deadline_ = false;
1098 } 1099 }
1099 1100
1100 void SchedulerStateMachine::NotifyBeginMainFrameStarted() { 1101 void SchedulerStateMachine::NotifyBeginMainFrameStarted() {
1101 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_SENT); 1102 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_SENT);
1102 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_STARTED; 1103 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_STARTED;
1103 } 1104 }
1104 1105
1105 bool SchedulerStateMachine::HasInitializedCompositorFrameSink() const { 1106 bool SchedulerStateMachine::HasInitializedCompositorFrameSink() const {
1106 switch (compositor_frame_sink_state_) { 1107 switch (compositor_frame_sink_state_) {
1107 case COMPOSITOR_FRAME_SINK_NONE: 1108 case COMPOSITOR_FRAME_SINK_NONE:
1108 case COMPOSITOR_FRAME_SINK_CREATING: 1109 case COMPOSITOR_FRAME_SINK_CREATING:
1109 return false; 1110 return false;
1110 1111
1111 case COMPOSITOR_FRAME_SINK_ACTIVE: 1112 case COMPOSITOR_FRAME_SINK_ACTIVE:
1112 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT: 1113 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT:
1113 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION: 1114 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION:
1114 return true; 1115 return true;
1115 } 1116 }
1116 NOTREACHED(); 1117 NOTREACHED();
1117 return false; 1118 return false;
1118 } 1119 }
1119 1120
1120 } // namespace cc 1121 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698