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

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

Issue 2337913003: Fork cc::OutputSurface into cc::CompositorFrameSink. (Closed)
Patch Set: cfsfork: android-vulkan Created 4 years, 3 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 kMaxPendingSwaps = 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 output_surface_state_(OUTPUT_SURFACE_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_swap_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_output_surface_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_output_surface_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_swaps_(0),
39 swaps_with_current_output_surface_(0), 39 swaps_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_output_surface_(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_swap_in_last_frame_(false) {}
64 64
65 const char* SchedulerStateMachine::OutputSurfaceStateToString( 65 const char* SchedulerStateMachine::CompositorFrameSinkStateToString(
66 OutputSurfaceState state) { 66 CompositorFrameSinkState state) {
67 switch (state) { 67 switch (state) {
68 case OUTPUT_SURFACE_NONE: 68 case COMPOSITOR_FRAME_SINK_NONE:
69 return "OUTPUT_SURFACE_NONE"; 69 return "COMPOSITOR_FRAME_SINK_NONE";
70 case OUTPUT_SURFACE_ACTIVE: 70 case COMPOSITOR_FRAME_SINK_ACTIVE:
71 return "OUTPUT_SURFACE_ACTIVE"; 71 return "COMPOSITOR_FRAME_SINK_ACTIVE";
72 case OUTPUT_SURFACE_CREATING: 72 case COMPOSITOR_FRAME_SINK_CREATING:
73 return "OUTPUT_SURFACE_CREATING"; 73 return "COMPOSITOR_FRAME_SINK_CREATING";
74 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: 74 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT:
75 return "OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT"; 75 return "COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT";
76 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: 76 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION:
77 return "OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION"; 77 return "COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION";
78 } 78 }
79 NOTREACHED(); 79 NOTREACHED();
80 return "???"; 80 return "???";
81 } 81 }
82 82
83 const char* SchedulerStateMachine::BeginImplFrameStateToString( 83 const char* SchedulerStateMachine::BeginImplFrameStateToString(
84 BeginImplFrameState state) { 84 BeginImplFrameState state) {
85 switch (state) { 85 switch (state) {
86 case BEGIN_IMPL_FRAME_STATE_IDLE: 86 case BEGIN_IMPL_FRAME_STATE_IDLE:
87 return "BEGIN_IMPL_FRAME_STATE_IDLE"; 87 return "BEGIN_IMPL_FRAME_STATE_IDLE";
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 case ACTION_COMMIT: 168 case ACTION_COMMIT:
169 return "ACTION_COMMIT"; 169 return "ACTION_COMMIT";
170 case ACTION_ACTIVATE_SYNC_TREE: 170 case ACTION_ACTIVATE_SYNC_TREE:
171 return "ACTION_ACTIVATE_SYNC_TREE"; 171 return "ACTION_ACTIVATE_SYNC_TREE";
172 case ACTION_DRAW_AND_SWAP_IF_POSSIBLE: 172 case ACTION_DRAW_AND_SWAP_IF_POSSIBLE:
173 return "ACTION_DRAW_AND_SWAP_IF_POSSIBLE"; 173 return "ACTION_DRAW_AND_SWAP_IF_POSSIBLE";
174 case ACTION_DRAW_AND_SWAP_FORCED: 174 case ACTION_DRAW_AND_SWAP_FORCED:
175 return "ACTION_DRAW_AND_SWAP_FORCED"; 175 return "ACTION_DRAW_AND_SWAP_FORCED";
176 case ACTION_DRAW_AND_SWAP_ABORT: 176 case ACTION_DRAW_AND_SWAP_ABORT:
177 return "ACTION_DRAW_AND_SWAP_ABORT"; 177 return "ACTION_DRAW_AND_SWAP_ABORT";
178 case ACTION_BEGIN_OUTPUT_SURFACE_CREATION: 178 case ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION:
179 return "ACTION_BEGIN_OUTPUT_SURFACE_CREATION"; 179 return "ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION";
180 case ACTION_PREPARE_TILES: 180 case ACTION_PREPARE_TILES:
181 return "ACTION_PREPARE_TILES"; 181 return "ACTION_PREPARE_TILES";
182 case ACTION_INVALIDATE_OUTPUT_SURFACE: 182 case ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK:
183 return "ACTION_INVALIDATE_OUTPUT_SURFACE"; 183 return "ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK";
184 } 184 }
185 NOTREACHED(); 185 NOTREACHED();
186 return "???"; 186 return "???";
187 } 187 }
188 188
189 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 189 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
190 SchedulerStateMachine::AsValue() const { 190 SchedulerStateMachine::AsValue() const {
191 std::unique_ptr<base::trace_event::TracedValue> state( 191 std::unique_ptr<base::trace_event::TracedValue> state(
192 new base::trace_event::TracedValue()); 192 new base::trace_event::TracedValue());
193 AsValueInto(state.get()); 193 AsValueInto(state.get());
194 return std::move(state); 194 return std::move(state);
195 } 195 }
196 196
197 void SchedulerStateMachine::AsValueInto( 197 void SchedulerStateMachine::AsValueInto(
198 base::trace_event::TracedValue* state) const { 198 base::trace_event::TracedValue* state) const {
199 state->BeginDictionary("major_state"); 199 state->BeginDictionary("major_state");
200 state->SetString("next_action", ActionToString(NextAction())); 200 state->SetString("next_action", ActionToString(NextAction()));
201 state->SetString("begin_impl_frame_state", 201 state->SetString("begin_impl_frame_state",
202 BeginImplFrameStateToString(begin_impl_frame_state_)); 202 BeginImplFrameStateToString(begin_impl_frame_state_));
203 state->SetString("begin_main_frame_state", 203 state->SetString("begin_main_frame_state",
204 BeginMainFrameStateToString(begin_main_frame_state_)); 204 BeginMainFrameStateToString(begin_main_frame_state_));
205 state->SetString("output_surface_state_", 205 state->SetString(
206 OutputSurfaceStateToString(output_surface_state_)); 206 "compositor_frame_sink_state_",
207 CompositorFrameSinkStateToString(compositor_frame_sink_state_));
207 state->SetString("forced_redraw_state", 208 state->SetString("forced_redraw_state",
208 ForcedRedrawOnTimeoutStateToString(forced_redraw_state_)); 209 ForcedRedrawOnTimeoutStateToString(forced_redraw_state_));
209 state->EndDictionary(); 210 state->EndDictionary();
210 211
211 state->BeginDictionary("minor_state"); 212 state->BeginDictionary("minor_state");
212 state->SetInteger("commit_count", commit_count_); 213 state->SetInteger("commit_count", commit_count_);
213 state->SetInteger("current_frame_number", current_frame_number_); 214 state->SetInteger("current_frame_number", current_frame_number_);
214 state->SetInteger("last_frame_number_swap_performed", 215 state->SetInteger("last_frame_number_swap_performed",
215 last_frame_number_swap_performed_); 216 last_frame_number_swap_performed_);
216 state->SetInteger("last_frame_number_draw_performed", 217 state->SetInteger("last_frame_number_draw_performed",
217 last_frame_number_draw_performed_); 218 last_frame_number_draw_performed_);
218 state->SetInteger("last_frame_number_begin_main_frame_sent", 219 state->SetInteger("last_frame_number_begin_main_frame_sent",
219 last_frame_number_begin_main_frame_sent_); 220 last_frame_number_begin_main_frame_sent_);
220 state->SetBoolean("funnel: draw_funnel", draw_funnel_); 221 state->SetBoolean("funnel: draw_funnel", draw_funnel_);
221 state->SetBoolean("funnel: send_begin_main_frame_funnel", 222 state->SetBoolean("funnel: send_begin_main_frame_funnel",
222 send_begin_main_frame_funnel_); 223 send_begin_main_frame_funnel_);
223 state->SetInteger("funnel: prepare_tiles_funnel", prepare_tiles_funnel_); 224 state->SetInteger("funnel: prepare_tiles_funnel", prepare_tiles_funnel_);
224 state->SetBoolean("funnel: invalidate_output_surface_funnel", 225 state->SetBoolean("funnel: invalidate_compositor_frame_sink_funnel",
225 invalidate_output_surface_funnel_); 226 invalidate_compositor_frame_sink_funnel_);
226 state->SetInteger("consecutive_checkerboard_animations", 227 state->SetInteger("consecutive_checkerboard_animations",
227 consecutive_checkerboard_animations_); 228 consecutive_checkerboard_animations_);
228 state->SetInteger("pending_swaps_", pending_swaps_); 229 state->SetInteger("pending_swaps_", pending_swaps_);
229 state->SetInteger("swaps_with_current_output_surface", 230 state->SetInteger("swaps_with_current_compositor_frame_sink",
230 swaps_with_current_output_surface_); 231 swaps_with_current_compositor_frame_sink_);
231 state->SetBoolean("needs_redraw", needs_redraw_); 232 state->SetBoolean("needs_redraw", needs_redraw_);
232 state->SetBoolean("needs_prepare_tiles", needs_prepare_tiles_); 233 state->SetBoolean("needs_prepare_tiles", needs_prepare_tiles_);
233 state->SetBoolean("needs_begin_main_frame", needs_begin_main_frame_); 234 state->SetBoolean("needs_begin_main_frame", needs_begin_main_frame_);
234 state->SetBoolean("needs_one_begin_impl_frame", needs_one_begin_impl_frame_); 235 state->SetBoolean("needs_one_begin_impl_frame", needs_one_begin_impl_frame_);
235 state->SetBoolean("visible", visible_); 236 state->SetBoolean("visible", visible_);
236 state->SetBoolean("begin_frame_source_paused", begin_frame_source_paused_); 237 state->SetBoolean("begin_frame_source_paused", begin_frame_source_paused_);
237 state->SetBoolean("can_draw", can_draw_); 238 state->SetBoolean("can_draw", can_draw_);
238 state->SetBoolean("resourceless_draw", resourceless_draw_); 239 state->SetBoolean("resourceless_draw", resourceless_draw_);
239 state->SetBoolean("has_pending_tree", has_pending_tree_); 240 state->SetBoolean("has_pending_tree", has_pending_tree_);
240 state->SetBoolean("pending_tree_is_ready_for_activation", 241 state->SetBoolean("pending_tree_is_ready_for_activation",
241 pending_tree_is_ready_for_activation_); 242 pending_tree_is_ready_for_activation_);
242 state->SetBoolean("active_tree_needs_first_draw", 243 state->SetBoolean("active_tree_needs_first_draw",
243 active_tree_needs_first_draw_); 244 active_tree_needs_first_draw_);
244 state->SetBoolean("wait_for_ready_to_draw", wait_for_ready_to_draw_); 245 state->SetBoolean("wait_for_ready_to_draw", wait_for_ready_to_draw_);
245 state->SetBoolean("did_create_and_initialize_first_output_surface", 246 state->SetBoolean("did_create_and_initialize_first_compositor_frame_sink",
246 did_create_and_initialize_first_output_surface_); 247 did_create_and_initialize_first_compositor_frame_sink_);
247 state->SetString("tree_priority", TreePriorityToString(tree_priority_)); 248 state->SetString("tree_priority", TreePriorityToString(tree_priority_));
248 state->SetString("scroll_handler_state", 249 state->SetString("scroll_handler_state",
249 ScrollHandlerStateToString(scroll_handler_state_)); 250 ScrollHandlerStateToString(scroll_handler_state_));
250 state->SetBoolean("critical_begin_main_frame_to_activate_is_fast_", 251 state->SetBoolean("critical_begin_main_frame_to_activate_is_fast_",
251 critical_begin_main_frame_to_activate_is_fast_); 252 critical_begin_main_frame_to_activate_is_fast_);
252 state->SetBoolean("main_thread_missed_last_deadline", 253 state->SetBoolean("main_thread_missed_last_deadline",
253 main_thread_missed_last_deadline_); 254 main_thread_missed_last_deadline_);
254 state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency", 255 state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency",
255 skip_next_begin_main_frame_to_reduce_latency_); 256 skip_next_begin_main_frame_to_reduce_latency_);
256 state->SetBoolean("video_needs_begin_frames", video_needs_begin_frames_); 257 state->SetBoolean("video_needs_begin_frames", video_needs_begin_frames_);
257 state->SetBoolean("defer_commits", defer_commits_); 258 state->SetBoolean("defer_commits", defer_commits_);
258 state->SetBoolean("last_commit_had_no_updates", last_commit_had_no_updates_); 259 state->SetBoolean("last_commit_had_no_updates", last_commit_had_no_updates_);
259 state->SetBoolean("did_draw_in_last_frame", did_draw_in_last_frame_); 260 state->SetBoolean("did_draw_in_last_frame", did_draw_in_last_frame_);
260 state->SetBoolean("did_swap_in_last_frame", did_swap_in_last_frame_); 261 state->SetBoolean("did_swap_in_last_frame", did_swap_in_last_frame_);
261 state->EndDictionary(); 262 state->EndDictionary();
262 } 263 }
263 264
264 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { 265 bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const {
265 // Normally when |visible_| is false or |begin_frame_source_paused_| is true, 266 // Normally when |visible_| is false or |begin_frame_source_paused_| is true,
266 // pending activations will be forced and draws will be aborted. However, 267 // pending activations will be forced and draws will be aborted. However,
267 // when the embedder is Android WebView, software draws could be scheduled by 268 // when the embedder is Android WebView, software draws could be scheduled by
268 // the Android OS at any time and draws should not be aborted in this case. 269 // the Android OS at any time and draws should not be aborted in this case.
269 bool is_output_surface_lost = (output_surface_state_ == OUTPUT_SURFACE_NONE); 270 bool is_compositor_frame_sink_lost =
271 (compositor_frame_sink_state_ == COMPOSITOR_FRAME_SINK_NONE);
270 if (resourceless_draw_) 272 if (resourceless_draw_)
271 return is_output_surface_lost || !can_draw_; 273 return is_compositor_frame_sink_lost || !can_draw_;
272 274
273 // These are all the cases where we normally cannot or do not want to draw 275 // These are all the cases where we normally cannot or do not want to draw
274 // but, if needs_redraw_ is true and we do not draw to make forward progress, 276 // but, if needs_redraw_ is true and we do not draw to make forward progress,
275 // we might deadlock with the main thread. 277 // we might deadlock with the main thread.
276 // This should be a superset of PendingActivationsShouldBeForced() since 278 // This should be a superset of PendingActivationsShouldBeForced() since
277 // activation of the pending tree is blocked by drawing of the active tree and 279 // activation of the pending tree is blocked by drawing of the active tree and
278 // the main thread might be blocked on activation of the most recent commit. 280 // the main thread might be blocked on activation of the most recent commit.
279 return is_output_surface_lost || !can_draw_ || !visible_ || 281 return is_compositor_frame_sink_lost || !can_draw_ || !visible_ ||
280 begin_frame_source_paused_; 282 begin_frame_source_paused_;
281 } 283 }
282 284
283 bool SchedulerStateMachine::PendingActivationsShouldBeForced() const { 285 bool SchedulerStateMachine::PendingActivationsShouldBeForced() const {
284 // There is no output surface to trigger our activations. 286 // There is no output surface to trigger our activations.
285 // If we do not force activations to make forward progress, we might deadlock 287 // If we do not force activations to make forward progress, we might deadlock
286 // with the main thread. 288 // with the main thread.
287 if (output_surface_state_ == OUTPUT_SURFACE_NONE) 289 if (compositor_frame_sink_state_ == COMPOSITOR_FRAME_SINK_NONE)
288 return true; 290 return true;
289 291
290 // If we're not visible, we should force activation. 292 // If we're not visible, we should force activation.
291 // Since we set RequiresHighResToDraw when becoming visible, we ensure that we 293 // Since we set RequiresHighResToDraw when becoming visible, we ensure that we
292 // don't checkerboard until all visible resources are done. Furthermore, if we 294 // don't checkerboard until all visible resources are done. Furthermore, if we
293 // do keep the pending tree around, when becoming visible we might activate 295 // do keep the pending tree around, when becoming visible we might activate
294 // prematurely causing RequiresHighResToDraw flag to be reset. In all cases, 296 // prematurely causing RequiresHighResToDraw flag to be reset. In all cases,
295 // we can simply activate on becoming invisible since we don't need to draw 297 // we can simply activate on becoming invisible since we don't need to draw
296 // the active tree when we're in this state. 298 // the active tree when we're in this state.
297 if (!visible_) 299 if (!visible_)
298 return true; 300 return true;
299 301
300 // Force pending activations when BeginFrameSource is paused to avoid 302 // Force pending activations when BeginFrameSource is paused to avoid
301 // deadlocking the main thread. 303 // deadlocking the main thread.
302 if (begin_frame_source_paused_) 304 if (begin_frame_source_paused_)
303 return true; 305 return true;
304 306
305 return false; 307 return false;
306 } 308 }
307 309
308 bool SchedulerStateMachine::ShouldBeginOutputSurfaceCreation() const { 310 bool SchedulerStateMachine::ShouldBeginCompositorFrameSinkCreation() const {
309 if (!visible_) 311 if (!visible_)
310 return false; 312 return false;
311 313
312 // We only want to start output surface initialization after the 314 // We only want to start output surface initialization after the
313 // previous commit is complete. 315 // previous commit is complete.
314 // We make an exception if the embedder explicitly allows beginning output 316 // We make an exception if the embedder explicitly allows beginning output
315 // surface creation while the previous commit has not been aborted. This 317 // surface creation while the previous commit has not been aborted. This
316 // assumes that any state passed from the client during the commit will not be 318 // assumes that any state passed from the client during the commit will not be
317 // tied to the output surface. 319 // tied to the output surface.
318 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_IDLE && 320 if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_IDLE &&
319 settings_.abort_commit_before_output_surface_creation) { 321 settings_.abort_commit_before_compositor_frame_sink_creation) {
320 return false; 322 return false;
321 } 323 }
322 324
323 // Make sure the BeginImplFrame from any previous OutputSurfaces 325 // Make sure the BeginImplFrame from any previous CompositorFrameSinks
324 // are complete before creating the new OutputSurface. 326 // are complete before creating the new CompositorFrameSink.
325 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_IDLE) 327 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_IDLE)
326 return false; 328 return false;
327 329
328 // We want to clear the pipeline of any pending draws and activations 330 // We want to clear the pipeline of any pending draws and activations
329 // before starting output surface initialization. This allows us to avoid 331 // before starting output surface initialization. This allows us to avoid
330 // weird corner cases where we abort draws or force activation while we 332 // weird corner cases where we abort draws or force activation while we
331 // are initializing the output surface. 333 // are initializing the output surface.
332 if (active_tree_needs_first_draw_ || has_pending_tree_) 334 if (active_tree_needs_first_draw_ || has_pending_tree_)
333 return false; 335 return false;
334 336
335 // We need to create the output surface if we don't have one and we haven't 337 // We need to create the output surface if we don't have one and we haven't
336 // started creating one yet. 338 // started creating one yet.
337 return output_surface_state_ == OUTPUT_SURFACE_NONE; 339 return compositor_frame_sink_state_ == COMPOSITOR_FRAME_SINK_NONE;
338 } 340 }
339 341
340 bool SchedulerStateMachine::ShouldDraw() const { 342 bool SchedulerStateMachine::ShouldDraw() const {
341 // If we need to abort draws, we should do so ASAP since the draw could 343 // If we need to abort draws, we should do so ASAP since the draw could
342 // be blocking other important actions (like output surface initialization), 344 // be blocking other important actions (like output surface initialization),
343 // from occurring. If we are waiting for the first draw, then perform the 345 // from occurring. If we are waiting for the first draw, then perform the
344 // aborted draw to keep things moving. If we are not waiting for the first 346 // aborted draw to keep things moving. If we are not waiting for the first
345 // draw however, we don't want to abort for no reason. 347 // draw however, we don't want to abort for no reason.
346 if (PendingDrawsShouldBeAborted()) 348 if (PendingDrawsShouldBeAborted())
347 return active_tree_needs_first_draw_; 349 return active_tree_needs_first_draw_;
348 350
349 // Do not draw too many times in a single frame. It's okay that we don't check 351 // Do not draw too many times in a single frame. It's okay that we don't check
350 // this before checking for aborted draws because aborted draws do not request 352 // this before checking for aborted draws because aborted draws do not request
351 // a swap. 353 // a swap.
352 if (draw_funnel_) 354 if (draw_funnel_)
353 return false; 355 return false;
354 356
355 // Don't draw if we are waiting on the first commit after a surface. 357 // Don't draw if we are waiting on the first commit after a surface.
356 if (output_surface_state_ != OUTPUT_SURFACE_ACTIVE) 358 if (compositor_frame_sink_state_ != COMPOSITOR_FRAME_SINK_ACTIVE)
357 return false; 359 return false;
358 360
359 // Do not queue too many swaps. 361 // Do not queue too many swaps.
360 if (SwapThrottled()) 362 if (SwapThrottled())
361 return false; 363 return false;
362 364
363 // Except for the cases above, do not draw outside of the BeginImplFrame 365 // Except for the cases above, do not draw outside of the BeginImplFrame
364 // deadline. 366 // deadline.
365 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) 367 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE)
366 return false; 368 return false;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 if (!settings_.using_synchronous_renderer_compositor && 445 if (!settings_.using_synchronous_renderer_compositor &&
444 begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_IDLE) { 446 begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_IDLE) {
445 return false; 447 return false;
446 } 448 }
447 449
448 // We need a new commit for the forced redraw. This honors the 450 // We need a new commit for the forced redraw. This honors the
449 // single commit per interval because the result will be swapped to screen. 451 // single commit per interval because the result will be swapped to screen.
450 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_COMMIT) 452 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_COMMIT)
451 return true; 453 return true;
452 454
453 // We shouldn't normally accept commits if there isn't an OutputSurface. 455 // We shouldn't normally accept commits if there isn't an CompositorFrameSink.
454 if (!HasInitializedOutputSurface()) 456 if (!HasInitializedCompositorFrameSink())
455 return false; 457 return false;
456 458
457 if (!settings_.main_frame_while_swap_throttled_enabled) { 459 if (!settings_.main_frame_while_swap_throttled_enabled) {
458 // SwapAck throttle the BeginMainFrames unless we just swapped to 460 // SwapAck throttle the BeginMainFrames unless we just swapped to
459 // potentially improve impl-thread latency over main-thread throughput. 461 // potentially improve impl-thread latency over main-thread throughput.
460 // TODO(brianderson): Remove this restriction to improve throughput or 462 // TODO(brianderson): Remove this restriction to improve throughput or
461 // make it conditional on ImplLatencyTakesPriority. 463 // make it conditional on ImplLatencyTakesPriority.
462 bool just_swapped_in_deadline = 464 bool just_swapped_in_deadline =
463 begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE && 465 begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE &&
464 did_swap_in_last_frame_; 466 did_swap_in_last_frame_;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 return false; 499 return false;
498 500
499 // Limiting to once per-frame is not enough, since we only want to 501 // Limiting to once per-frame is not enough, since we only want to
500 // prepare tiles _after_ draws. 502 // prepare tiles _after_ draws.
501 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) 503 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE)
502 return false; 504 return false;
503 505
504 return needs_prepare_tiles_; 506 return needs_prepare_tiles_;
505 } 507 }
506 508
507 bool SchedulerStateMachine::ShouldInvalidateOutputSurface() const { 509 bool SchedulerStateMachine::ShouldInvalidateCompositorFrameSink() const {
508 // Do not invalidate too many times in a frame. 510 // Do not invalidate too many times in a frame.
509 if (invalidate_output_surface_funnel_) 511 if (invalidate_compositor_frame_sink_funnel_)
510 return false; 512 return false;
511 513
512 // Only the synchronous compositor requires invalidations. 514 // Only the synchronous compositor requires invalidations.
513 if (!settings_.using_synchronous_renderer_compositor) 515 if (!settings_.using_synchronous_renderer_compositor)
514 return false; 516 return false;
515 517
516 // Invalidations are only performed inside a BeginFrame. 518 // Invalidations are only performed inside a BeginFrame.
517 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME) 519 if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME)
518 return false; 520 return false;
519 521
(...skipping 13 matching lines...) Expand all
533 return ACTION_DRAW_AND_SWAP_ABORT; 535 return ACTION_DRAW_AND_SWAP_ABORT;
534 else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) 536 else if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW)
535 return ACTION_DRAW_AND_SWAP_FORCED; 537 return ACTION_DRAW_AND_SWAP_FORCED;
536 else 538 else
537 return ACTION_DRAW_AND_SWAP_IF_POSSIBLE; 539 return ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
538 } 540 }
539 if (ShouldPrepareTiles()) 541 if (ShouldPrepareTiles())
540 return ACTION_PREPARE_TILES; 542 return ACTION_PREPARE_TILES;
541 if (ShouldSendBeginMainFrame()) 543 if (ShouldSendBeginMainFrame())
542 return ACTION_SEND_BEGIN_MAIN_FRAME; 544 return ACTION_SEND_BEGIN_MAIN_FRAME;
543 if (ShouldInvalidateOutputSurface()) 545 if (ShouldInvalidateCompositorFrameSink())
544 return ACTION_INVALIDATE_OUTPUT_SURFACE; 546 return ACTION_INVALIDATE_COMPOSITOR_FRAME_SINK;
545 if (ShouldBeginOutputSurfaceCreation()) 547 if (ShouldBeginCompositorFrameSinkCreation())
546 return ACTION_BEGIN_OUTPUT_SURFACE_CREATION; 548 return ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION;
547 return ACTION_NONE; 549 return ACTION_NONE;
548 } 550 }
549 551
550 void SchedulerStateMachine::WillSendBeginMainFrame() { 552 void SchedulerStateMachine::WillSendBeginMainFrame() {
551 DCHECK(!has_pending_tree_ || settings_.main_frame_before_activation_enabled); 553 DCHECK(!has_pending_tree_ || settings_.main_frame_before_activation_enabled);
552 DCHECK(visible_); 554 DCHECK(visible_);
553 DCHECK(!begin_frame_source_paused_); 555 DCHECK(!begin_frame_source_paused_);
554 DCHECK(!send_begin_main_frame_funnel_); 556 DCHECK(!send_begin_main_frame_funnel_);
555 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_SENT; 557 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_SENT;
556 needs_begin_main_frame_ = false; 558 needs_begin_main_frame_ = false;
(...skipping 22 matching lines...) Expand all
579 } 581 }
580 582
581 // Update state related to forced draws. 583 // Update state related to forced draws.
582 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_COMMIT) { 584 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_COMMIT) {
583 forced_redraw_state_ = has_pending_tree_ 585 forced_redraw_state_ = has_pending_tree_
584 ? FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION 586 ? FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION
585 : FORCED_REDRAW_STATE_WAITING_FOR_DRAW; 587 : FORCED_REDRAW_STATE_WAITING_FOR_DRAW;
586 } 588 }
587 589
588 // Update the output surface state. 590 // Update the output surface state.
589 if (output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT) { 591 if (compositor_frame_sink_state_ ==
590 output_surface_state_ = has_pending_tree_ 592 COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT) {
591 ? OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION 593 compositor_frame_sink_state_ =
592 : OUTPUT_SURFACE_ACTIVE; 594 has_pending_tree_ ? COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION
595 : COMPOSITOR_FRAME_SINK_ACTIVE;
593 } 596 }
594 } 597 }
595 598
596 void SchedulerStateMachine::WillActivate() { 599 void SchedulerStateMachine::WillActivate() {
597 if (begin_main_frame_state_ == 600 if (begin_main_frame_state_ ==
598 BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION) { 601 BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION) {
599 begin_main_frame_state_ = settings_.commit_to_active_tree 602 begin_main_frame_state_ = settings_.commit_to_active_tree
600 ? BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW 603 ? BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW
601 : BEGIN_MAIN_FRAME_STATE_IDLE; 604 : BEGIN_MAIN_FRAME_STATE_IDLE;
602 } 605 }
603 606
604 if (output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION) 607 if (compositor_frame_sink_state_ ==
605 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; 608 COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION)
609 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_ACTIVE;
606 610
607 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION) 611 if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION)
608 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_DRAW; 612 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_DRAW;
609 613
610 has_pending_tree_ = false; 614 has_pending_tree_ = false;
611 pending_tree_is_ready_for_activation_ = false; 615 pending_tree_is_ready_for_activation_ = false;
612 active_tree_needs_first_draw_ = true; 616 active_tree_needs_first_draw_ = true;
613 needs_redraw_ = true; 617 needs_redraw_ = true;
614 } 618 }
615 619
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 // Note: We may abort at any time and cannot DCHECK that 693 // Note: We may abort at any time and cannot DCHECK that
690 // we haven't drawn in or swapped in the last frame here. 694 // we haven't drawn in or swapped in the last frame here.
691 WillDrawInternal(); 695 WillDrawInternal();
692 DidDrawInternal(DRAW_ABORTED_DRAINING_PIPELINE); 696 DidDrawInternal(DRAW_ABORTED_DRAINING_PIPELINE);
693 } 697 }
694 698
695 void SchedulerStateMachine::WillPrepareTiles() { 699 void SchedulerStateMachine::WillPrepareTiles() {
696 needs_prepare_tiles_ = false; 700 needs_prepare_tiles_ = false;
697 } 701 }
698 702
699 void SchedulerStateMachine::WillBeginOutputSurfaceCreation() { 703 void SchedulerStateMachine::WillBeginCompositorFrameSinkCreation() {
700 DCHECK_EQ(output_surface_state_, OUTPUT_SURFACE_NONE); 704 DCHECK_EQ(compositor_frame_sink_state_, COMPOSITOR_FRAME_SINK_NONE);
701 output_surface_state_ = OUTPUT_SURFACE_CREATING; 705 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_CREATING;
702 706
703 // The following DCHECKs make sure we are in the proper quiescent state. 707 // The following DCHECKs make sure we are in the proper quiescent state.
704 // The pipeline should be flushed entirely before we start output 708 // The pipeline should be flushed entirely before we start output
705 // surface creation to avoid complicated corner cases. 709 // surface creation to avoid complicated corner cases.
706 710
707 // We allow output surface creation while the previous commit has not been 711 // We allow output surface creation while the previous commit has not been
708 // aborted if the embedder explicitly allows it. 712 // aborted if the embedder explicitly allows it.
709 DCHECK(!settings_.abort_commit_before_output_surface_creation || 713 DCHECK(!settings_.abort_commit_before_compositor_frame_sink_creation ||
710 begin_main_frame_state_ == BEGIN_MAIN_FRAME_STATE_IDLE); 714 begin_main_frame_state_ == BEGIN_MAIN_FRAME_STATE_IDLE);
711 DCHECK(!has_pending_tree_); 715 DCHECK(!has_pending_tree_);
712 DCHECK(!active_tree_needs_first_draw_); 716 DCHECK(!active_tree_needs_first_draw_);
713 } 717 }
714 718
715 void SchedulerStateMachine::WillInvalidateOutputSurface() { 719 void SchedulerStateMachine::WillInvalidateCompositorFrameSink() {
716 DCHECK(!invalidate_output_surface_funnel_); 720 DCHECK(!invalidate_compositor_frame_sink_funnel_);
717 invalidate_output_surface_funnel_ = true; 721 invalidate_compositor_frame_sink_funnel_ = true;
718 last_frame_number_invalidate_output_surface_performed_ = 722 last_frame_number_invalidate_compositor_frame_sink_performed_ =
719 current_frame_number_; 723 current_frame_number_;
720 724
721 // The synchronous compositor makes no guarantees about a draw coming in after 725 // The synchronous compositor makes no guarantees about a draw coming in after
722 // an invalidate so clear any flags that would cause the compositor's pipeline 726 // an invalidate so clear any flags that would cause the compositor's pipeline
723 // to stall. 727 // to stall.
724 active_tree_needs_first_draw_ = false; // blocks commit if true 728 active_tree_needs_first_draw_ = false; // blocks commit if true
725 } 729 }
726 730
727 void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() { 731 void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() {
728 TRACE_EVENT_INSTANT0("cc", 732 TRACE_EVENT_INSTANT0("cc",
729 "Scheduler: SkipNextBeginMainFrameToReduceLatency", 733 "Scheduler: SkipNextBeginMainFrameToReduceLatency",
730 TRACE_EVENT_SCOPE_THREAD); 734 TRACE_EVENT_SCOPE_THREAD);
731 skip_next_begin_main_frame_to_reduce_latency_ = true; 735 skip_next_begin_main_frame_to_reduce_latency_ = true;
732 } 736 }
733 737
734 bool SchedulerStateMachine::BeginFrameNeededForVideo() const { 738 bool SchedulerStateMachine::BeginFrameNeededForVideo() const {
735 return video_needs_begin_frames_; 739 return video_needs_begin_frames_;
736 } 740 }
737 741
738 bool SchedulerStateMachine::BeginFrameNeeded() const { 742 bool SchedulerStateMachine::BeginFrameNeeded() const {
739 // We can't handle BeginFrames when output surface isn't initialized. 743 // We can't handle BeginFrames when output surface isn't initialized.
740 // TODO(brianderson): Support output surface creation inside a BeginFrame. 744 // TODO(brianderson): Support output surface creation inside a BeginFrame.
741 if (!HasInitializedOutputSurface()) 745 if (!HasInitializedCompositorFrameSink())
742 return false; 746 return false;
743 747
744 // If we are not visible, we don't need BeginFrame messages. 748 // If we are not visible, we don't need BeginFrame messages.
745 if (!visible_) 749 if (!visible_)
746 return false; 750 return false;
747 751
748 return BeginFrameRequiredForAction() || BeginFrameNeededForVideo() || 752 return BeginFrameRequiredForAction() || BeginFrameNeededForVideo() ||
749 ProactiveBeginFrameWanted(); 753 ProactiveBeginFrameWanted();
750 } 754 }
751 755
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME; 824 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME;
821 current_frame_number_++; 825 current_frame_number_++;
822 826
823 last_commit_had_no_updates_ = false; 827 last_commit_had_no_updates_ = false;
824 did_draw_in_last_frame_ = false; 828 did_draw_in_last_frame_ = false;
825 did_swap_in_last_frame_ = false; 829 did_swap_in_last_frame_ = false;
826 needs_one_begin_impl_frame_ = false; 830 needs_one_begin_impl_frame_ = false;
827 831
828 // Clear funnels for any actions we perform during the frame. 832 // Clear funnels for any actions we perform during the frame.
829 send_begin_main_frame_funnel_ = false; 833 send_begin_main_frame_funnel_ = false;
830 invalidate_output_surface_funnel_ = false; 834 invalidate_compositor_frame_sink_funnel_ = false;
831 835
832 // "Drain" the PrepareTiles funnel. 836 // "Drain" the PrepareTiles funnel.
833 if (prepare_tiles_funnel_ > 0) 837 if (prepare_tiles_funnel_ > 0)
834 prepare_tiles_funnel_--; 838 prepare_tiles_funnel_--;
835 } 839 }
836 840
837 void SchedulerStateMachine::OnBeginImplFrameDeadline() { 841 void SchedulerStateMachine::OnBeginImplFrameDeadline() {
838 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; 842 begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE;
839 843
840 // Clear funnels for any actions we perform during the deadline. 844 // Clear funnels for any actions we perform during the deadline.
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 TRACE_EVENT0("cc", "SchedulerStateMachine::SetNeedsPrepareTiles"); 971 TRACE_EVENT0("cc", "SchedulerStateMachine::SetNeedsPrepareTiles");
968 needs_prepare_tiles_ = true; 972 needs_prepare_tiles_ = true;
969 } 973 }
970 } 974 }
971 void SchedulerStateMachine::DidSwapBuffers() { 975 void SchedulerStateMachine::DidSwapBuffers() {
972 TRACE_EVENT_ASYNC_BEGIN1("cc", "Scheduler:pending_swaps", this, 976 TRACE_EVENT_ASYNC_BEGIN1("cc", "Scheduler:pending_swaps", this,
973 "pending_frames", pending_swaps_); 977 "pending_frames", pending_swaps_);
974 DCHECK_LT(pending_swaps_, kMaxPendingSwaps); 978 DCHECK_LT(pending_swaps_, kMaxPendingSwaps);
975 979
976 pending_swaps_++; 980 pending_swaps_++;
977 swaps_with_current_output_surface_++; 981 swaps_with_current_compositor_frame_sink_++;
978 982
979 did_swap_in_last_frame_ = true; 983 did_swap_in_last_frame_ = true;
980 last_frame_number_swap_performed_ = current_frame_number_; 984 last_frame_number_swap_performed_ = current_frame_number_;
981 } 985 }
982 986
983 void SchedulerStateMachine::DidSwapBuffersComplete() { 987 void SchedulerStateMachine::DidSwapBuffersComplete() {
984 TRACE_EVENT_ASYNC_END1("cc", "Scheduler:pending_swaps", this, 988 TRACE_EVENT_ASYNC_END1("cc", "Scheduler:pending_swaps", this,
985 "pending_frames", pending_swaps_); 989 "pending_frames", pending_swaps_);
986 pending_swaps_--; 990 pending_swaps_--;
987 } 991 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 } 1037 }
1034 1038
1035 void SchedulerStateMachine::BeginMainFrameAborted(CommitEarlyOutReason reason) { 1039 void SchedulerStateMachine::BeginMainFrameAborted(CommitEarlyOutReason reason) {
1036 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED); 1040 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED);
1037 1041
1038 // If the main thread aborted, it doesn't matter if the main thread missed 1042 // If the main thread aborted, it doesn't matter if the main thread missed
1039 // the last deadline since it didn't have an update anyway. 1043 // the last deadline since it didn't have an update anyway.
1040 main_thread_missed_last_deadline_ = false; 1044 main_thread_missed_last_deadline_ = false;
1041 1045
1042 switch (reason) { 1046 switch (reason) {
1043 case CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST: 1047 case CommitEarlyOutReason::ABORTED_COMPOSITOR_FRAME_SINK_LOST:
1044 case CommitEarlyOutReason::ABORTED_NOT_VISIBLE: 1048 case CommitEarlyOutReason::ABORTED_NOT_VISIBLE:
1045 case CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT: 1049 case CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT:
1046 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE; 1050 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE;
1047 SetNeedsBeginMainFrame(); 1051 SetNeedsBeginMainFrame();
1048 return; 1052 return;
1049 case CommitEarlyOutReason::FINISHED_NO_UPDATES: 1053 case CommitEarlyOutReason::FINISHED_NO_UPDATES:
1050 bool commit_has_no_updates = true; 1054 bool commit_has_no_updates = true;
1051 WillCommit(commit_has_no_updates); 1055 WillCommit(commit_has_no_updates);
1052 return; 1056 return;
1053 } 1057 }
1054 } 1058 }
1055 1059
1056 void SchedulerStateMachine::DidPrepareTiles() { 1060 void SchedulerStateMachine::DidPrepareTiles() {
1057 needs_prepare_tiles_ = false; 1061 needs_prepare_tiles_ = false;
1058 // "Fill" the PrepareTiles funnel. 1062 // "Fill" the PrepareTiles funnel.
1059 prepare_tiles_funnel_++; 1063 prepare_tiles_funnel_++;
1060 } 1064 }
1061 1065
1062 void SchedulerStateMachine::DidLoseOutputSurface() { 1066 void SchedulerStateMachine::DidLoseCompositorFrameSink() {
1063 if (output_surface_state_ == OUTPUT_SURFACE_NONE || 1067 if (compositor_frame_sink_state_ == COMPOSITOR_FRAME_SINK_NONE ||
1064 output_surface_state_ == OUTPUT_SURFACE_CREATING) 1068 compositor_frame_sink_state_ == COMPOSITOR_FRAME_SINK_CREATING)
1065 return; 1069 return;
1066 output_surface_state_ = OUTPUT_SURFACE_NONE; 1070 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_NONE;
1067 needs_redraw_ = false; 1071 needs_redraw_ = false;
1068 wait_for_ready_to_draw_ = false; 1072 wait_for_ready_to_draw_ = false;
1069 } 1073 }
1070 1074
1071 void SchedulerStateMachine::NotifyReadyToActivate() { 1075 void SchedulerStateMachine::NotifyReadyToActivate() {
1072 if (has_pending_tree_) 1076 if (has_pending_tree_)
1073 pending_tree_is_ready_for_activation_ = true; 1077 pending_tree_is_ready_for_activation_ = true;
1074 } 1078 }
1075 1079
1076 void SchedulerStateMachine::NotifyReadyToDraw() { 1080 void SchedulerStateMachine::NotifyReadyToDraw() {
1077 wait_for_ready_to_draw_ = false; 1081 wait_for_ready_to_draw_ = false;
1078 } 1082 }
1079 1083
1080 void SchedulerStateMachine::DidCreateAndInitializeOutputSurface() { 1084 void SchedulerStateMachine::DidCreateAndInitializeCompositorFrameSink() {
1081 DCHECK_EQ(output_surface_state_, OUTPUT_SURFACE_CREATING); 1085 DCHECK_EQ(compositor_frame_sink_state_, COMPOSITOR_FRAME_SINK_CREATING);
1082 output_surface_state_ = OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT; 1086 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT;
1083 1087
1084 if (did_create_and_initialize_first_output_surface_) { 1088 if (did_create_and_initialize_first_compositor_frame_sink_) {
1085 // TODO(boliu): See if we can remove this when impl-side painting is always 1089 // TODO(boliu): See if we can remove this when impl-side painting is always
1086 // on. Does anything on the main thread need to update after recreate? 1090 // on. Does anything on the main thread need to update after recreate?
1087 needs_begin_main_frame_ = true; 1091 needs_begin_main_frame_ = true;
1088 } 1092 }
1089 did_create_and_initialize_first_output_surface_ = true; 1093 did_create_and_initialize_first_compositor_frame_sink_ = true;
1090 pending_swaps_ = 0; 1094 pending_swaps_ = 0;
1091 swaps_with_current_output_surface_ = 0; 1095 swaps_with_current_compositor_frame_sink_ = 0;
1092 main_thread_missed_last_deadline_ = false; 1096 main_thread_missed_last_deadline_ = false;
1093 } 1097 }
1094 1098
1095 void SchedulerStateMachine::NotifyBeginMainFrameStarted() { 1099 void SchedulerStateMachine::NotifyBeginMainFrameStarted() {
1096 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_SENT); 1100 DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_SENT);
1097 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_STARTED; 1101 begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_STARTED;
1098 } 1102 }
1099 1103
1100 bool SchedulerStateMachine::HasInitializedOutputSurface() const { 1104 bool SchedulerStateMachine::HasInitializedCompositorFrameSink() const {
1101 switch (output_surface_state_) { 1105 switch (compositor_frame_sink_state_) {
1102 case OUTPUT_SURFACE_NONE: 1106 case COMPOSITOR_FRAME_SINK_NONE:
1103 case OUTPUT_SURFACE_CREATING: 1107 case COMPOSITOR_FRAME_SINK_CREATING:
1104 return false; 1108 return false;
1105 1109
1106 case OUTPUT_SURFACE_ACTIVE: 1110 case COMPOSITOR_FRAME_SINK_ACTIVE:
1107 case OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT: 1111 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT:
1108 case OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION: 1112 case COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION:
1109 return true; 1113 return true;
1110 } 1114 }
1111 NOTREACHED(); 1115 NOTREACHED();
1112 return false; 1116 return false;
1113 } 1117 }
1114 1118
1115 } // namespace cc 1119 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/scheduler_state_machine.h ('k') | cc/scheduler/scheduler_state_machine_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698