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

Unified Diff: cc/scheduler/scheduler_state_machine.h

Issue 1131633003: cc: Use multiple PrepareTiles approaches Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: cc/scheduler/scheduler_state_machine.h
diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h
index cf29ca9b6a53ec89a43c1b20e905e9c4792dff8f..f73b7e894ca2df8d46fc8f913557053c9ac1d7d2 100644
--- a/cc/scheduler/scheduler_state_machine.h
+++ b/cc/scheduler/scheduler_state_machine.h
@@ -67,6 +67,7 @@ class CC_EXPORT SchedulerStateMachine {
BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE,
BEGIN_IMPL_FRAME_DEADLINE_MODE_REGULAR,
BEGIN_IMPL_FRAME_DEADLINE_MODE_LATE,
+ BEGIN_IMPL_FRAME_DEADLINE_MODE_TRY_TO_AVOID_CHECKERBOARD,
BEGIN_IMPL_FRAME_DEADLINE_MODE_BLOCKED_ON_READY_TO_DRAW,
};
static const char* BeginImplFrameDeadlineModeToString(
@@ -82,14 +83,36 @@ class CC_EXPORT SchedulerStateMachine {
};
static const char* CommitStateToString(CommitState state);
- enum ForcedRedrawOnTimeoutState {
- FORCED_REDRAW_STATE_IDLE,
- FORCED_REDRAW_STATE_WAITING_FOR_COMMIT,
- FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION,
- FORCED_REDRAW_STATE_WAITING_FOR_DRAW,
+ enum PrepareTilesApproach {
+ // This approach calls PrepareTiles after every commit and after draws if
+ // there wasn't a commit for that frame. With this approach, we cannot trust
+ // NotifyReadyToActivate and NotifyReadyToDraw and they should only be used
+ // as hints. All other approaches have trustworthy NotifyReadyToActivate's
+ // and NotifyReadyToDraw's.
+ PREPARE_TILES_APPROACH_PRIORITIZE_LATENCY,
+ // This approach only calls PrepareTiles at the start of a frame so new
+ // active tree work starts ASAP, but the pending tree work doesn't.
+ PREPARE_TILES_APPROACH_ACCURATE_ACTIVE_WORK,
+ // This approach calls PrepareTiles at the start of every frame and after
+ // every commit so any new work starts ASAP.
+ PREPARE_TILES_APPROACH_ACCURATE_ACTIVE_PENDING_WORK,
+ // This approach calls PrepareTiles at the start of every frame, after every
+ // commit, and after every activation so any new or canceled work is
+ // reflected immediately.
+ PREPARE_TILES_APPROACH_ACCURATE_ACTIVE_PENDING_CANCELED_WORK,
};
- static const char* ForcedRedrawOnTimeoutStateToString(
- ForcedRedrawOnTimeoutState state);
+ static const char* PrepareTilesApproachToString(
+ PrepareTilesApproach approach);
+
+ enum PrepareTilesReason {
+ PREPARE_TILES_NOT_NEEDED,
+ PREPARE_TILES_REQUESTED,
+ PREPARE_TILES_NEEDED_FOR_COMMIT,
+ PREPARE_TILES_NEEDED_FOR_ACTIVATION,
+ PREPARE_TILES_NEEDED_FOR_ABORTED_DRAW,
+ PREPARE_TILES_NEEDED_TO_EVICT_TILES,
+ };
+ static const char* PrepareTilesReasonToString(PrepareTilesReason reason);
bool CommitPending() const {
return commit_state_ == COMMIT_STATE_BEGIN_MAIN_FRAME_SENT ||
@@ -99,7 +122,9 @@ class CC_EXPORT SchedulerStateMachine {
CommitState commit_state() const { return commit_state_; }
bool RedrawPending() const { return needs_redraw_; }
- bool PrepareTilesPending() const { return needs_prepare_tiles_; }
+ bool PrepareTilesPending() const {
+ return prepare_tiles_reason_ != PREPARE_TILES_NOT_NEEDED;
+ }
enum Action {
ACTION_NONE,
@@ -126,6 +151,10 @@ class CC_EXPORT SchedulerStateMachine {
// to make progress.
bool BeginFrameNeeded() const;
+ // This reflects the actual state of the BeginFrameSource, not just whether
+ // the SchedulerStateMachine wants BeginFrames at this instance.
+ void NotifyBeginFrameSourceActive(bool active);
+
// Indicates that the system has entered and left a BeginImplFrame callback.
// The scheduler will not draw more than once in a given BeginImplFrame
// callback nor send more than one BeginMainFrame message.
@@ -159,7 +188,7 @@ class CC_EXPORT SchedulerStateMachine {
// Indicates that prepare-tiles is required. This guarantees another
// PrepareTiles will occur shortly (even if no redraw is required).
- void SetNeedsPrepareTiles();
+ void SetNeedsPrepareTiles(bool for_commit);
// Make deadline wait for ReadyToDraw signal.
void SetWaitForReadyToDraw();
@@ -186,8 +215,8 @@ class CC_EXPORT SchedulerStateMachine {
return impl_latency_takes_priority_;
}
- // Indicates whether ACTION_DRAW_AND_SWAP_IF_POSSIBLE drew to the screen.
- void DidDrawIfPossibleCompleted(DrawResult result);
+ // Indicates whether a draw request succeeded or not.
+ void SetDrawResult(DrawResult result);
// Indicates that a new commit flow needs to be performed, either to pull
// updates from the main thread to the impl, or to push deltas from the impl
@@ -224,12 +253,14 @@ class CC_EXPORT SchedulerStateMachine {
// Indicates the active tree's visible tiles are ready to be drawn.
void NotifyReadyToDraw();
+ // Indicates we shouldn't draw the active tree until we won't checkerboard.
+ void SetRequiresHighResToDraw(bool required);
+
bool has_pending_tree() const { return has_pending_tree_; }
bool active_tree_needs_first_draw() const {
return active_tree_needs_first_draw_;
}
- void DidPrepareTiles();
void DidLoseOutputSurface();
void DidCreateAndInitializeOutputSurface();
bool HasInitializedOutputSurface() const;
@@ -291,7 +322,8 @@ class CC_EXPORT SchedulerStateMachine {
OutputSurfaceState output_surface_state_;
BeginImplFrameState begin_impl_frame_state_;
CommitState commit_state_;
- ForcedRedrawOnTimeoutState forced_redraw_state_;
+ PrepareTilesApproach prepare_tiles_approach_;
+ PrepareTilesReason prepare_tiles_reason_;
// These are used for tracing only.
int commit_count_;
@@ -308,25 +340,27 @@ class CC_EXPORT SchedulerStateMachine {
bool request_swap_funnel_;
bool send_begin_main_frame_funnel_;
bool invalidate_output_surface_funnel_;
+ // TODO(brianderson): Update the comment below.
// prepare_tiles_funnel_ is "filled" each time PrepareTiles is called
// and "drained" on each BeginImplFrame. If the funnel gets too full,
// we start throttling ACTION_PREPARE_TILES such that we average one
// PrepareTiles per BeginImplFrame.
int prepare_tiles_funnel_;
- int consecutive_checkerboard_animations_;
int max_pending_swaps_;
int pending_swaps_;
bool needs_redraw_;
+ DrawResult last_draw_result_;
bool needs_animate_;
- bool needs_prepare_tiles_;
bool needs_commit_;
bool visible_;
bool can_start_;
bool can_draw_;
bool has_pending_tree_;
bool pending_tree_is_ready_for_activation_;
+ bool requires_high_res_to_draw_;
bool active_tree_needs_first_draw_;
+ bool active_tree_ready_to_draw_;
bool did_create_and_initialize_first_output_surface_;
bool impl_latency_takes_priority_;
bool skip_next_begin_main_frame_to_reduce_latency_;

Powered by Google App Engine
This is Rietveld 408576698