Index: cc/scheduler/scheduler_state_machine.h |
diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h |
index 0901ca874ddeb6549ea64d8912eb67978ced3e60..3914039004dc60540f49417b76963585b07a62e4 100644 |
--- a/cc/scheduler/scheduler_state_machine.h |
+++ b/cc/scheduler/scheduler_state_machine.h |
@@ -50,10 +50,10 @@ |
}; |
static const char* OutputSurfaceStateToString(OutputSurfaceState state); |
- // Note: BeginImplFrameState does not cycle through these states in a fixed |
- // order on all platforms. It's up to the scheduler to set these correctly. |
- // TODO(sunnyps): Rename the states to IDLE, ANIMATE, WAITING_FOR_DEADLINE and |
- // DRAW. |
+ // Note: BeginImplFrameState will always cycle through all the states in |
+ // order. Whether or not it actually waits or draws, it will at least try to |
+ // wait in BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME and try to draw in |
+ // BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE |
enum BeginImplFrameState { |
BEGIN_IMPL_FRAME_STATE_IDLE, |
BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, |
@@ -63,7 +63,6 @@ |
static const char* BeginImplFrameStateToString(BeginImplFrameState state); |
enum BeginImplFrameDeadlineMode { |
- BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE, |
BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE, |
BEGIN_IMPL_FRAME_DEADLINE_MODE_REGULAR, |
BEGIN_IMPL_FRAME_DEADLINE_MODE_LATE, |
@@ -111,7 +110,6 @@ |
ACTION_DRAW_AND_SWAP_ABORT, |
ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
ACTION_PREPARE_TILES, |
- ACTION_INVALIDATE_OUTPUT_SURFACE, |
}; |
static const char* ActionToString(Action action); |
@@ -124,15 +122,18 @@ |
// Indicates whether the impl thread needs a BeginImplFrame callback in order |
// to make progress. |
bool BeginFrameNeeded() const; |
+ |
+ // Indicates that we need to independently poll for new state and actions |
+ // because we can't expect a BeginImplFrame. This is mostly used to avoid |
+ // drawing repeat frames with the synchronous compositor without dropping |
+ // necessary actions on the floor. |
+ bool ShouldPollForAnticipatedDrawTriggers() const; |
// 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. |
void OnBeginImplFrame(); |
void OnBeginImplFrameDeadlinePending(); |
- // Indicates that the scheduler has entered the draw phase. The scheduler |
- // will not draw more than once in a single draw phase. |
- // TODO(sunnyps): Rename OnBeginImplFrameDeadline to OnDraw or similar. |
void OnBeginImplFrameDeadline(); |
void OnBeginImplFrameIdle(); |
BeginImplFrameState begin_impl_frame_state() const { |
@@ -143,6 +144,15 @@ |
// If the main thread didn't manage to produce a new frame in time for the |
// impl thread to draw, it is in a high latency mode. |
bool MainThreadIsInHighLatencyMode() const; |
+ |
+ // PollForAnticipatedDrawTriggers is used by the synchronous compositor to |
+ // avoid requesting BeginImplFrames when we won't actually draw but still |
+ // need to advance our state at vsync intervals. |
+ void DidEnterPollForAnticipatedDrawTriggers(); |
+ void DidLeavePollForAnticipatedDrawTriggers(); |
+ bool inside_poll_for_anticipated_draw_triggers() const { |
+ return inside_poll_for_anticipated_draw_triggers_; |
+ } |
// Indicates whether the LayerTreeHostImpl is visible. |
void SetVisible(bool visible); |
@@ -229,6 +239,8 @@ |
// True if we need to abort draws to make forward progress. |
bool PendingDrawsShouldBeAborted() const; |
+ |
+ bool SupportsProactiveBeginFrame() const; |
void SetContinuousPainting(bool continuous_painting) { |
continuous_painting_ = continuous_painting; |
@@ -264,16 +276,13 @@ |
bool ShouldSendBeginMainFrame() const; |
bool ShouldCommit() const; |
bool ShouldPrepareTiles() const; |
- bool ShouldInvalidateOutputSurface() const; |
- |
- void UpdateStateOnAnimate(); |
- void UpdateStateOnSendBeginMainFrame(); |
+ |
+ void AdvanceCurrentFrameNumber(); |
+ |
void UpdateStateOnCommit(bool commit_had_no_updates); |
void UpdateStateOnActivation(); |
void UpdateStateOnDraw(bool did_request_swap); |
- void UpdateStateOnBeginOutputSurfaceCreation(); |
void UpdateStateOnPrepareTiles(); |
- void UpdateStateOnInvalidateOutputSurface(); |
const SchedulerSettings settings_; |
@@ -289,14 +298,13 @@ |
int last_frame_number_swap_performed_; |
int last_frame_number_swap_requested_; |
int last_frame_number_begin_main_frame_sent_; |
- int last_frame_number_invalidate_output_surface_performed_; |
// These are used to ensure that an action only happens once per frame, |
// deadline, etc. |
bool animate_funnel_; |
+ bool perform_swap_funnel_; |
bool request_swap_funnel_; |
bool send_begin_main_frame_funnel_; |
- bool invalidate_output_surface_funnel_; |
// 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 |
@@ -310,6 +318,7 @@ |
bool needs_animate_; |
bool needs_prepare_tiles_; |
bool needs_commit_; |
+ bool inside_poll_for_anticipated_draw_triggers_; |
bool visible_; |
bool can_start_; |
bool can_draw_; |
@@ -324,8 +333,6 @@ |
bool children_need_begin_frames_; |
bool defer_commits_; |
bool last_commit_had_no_updates_; |
- bool did_request_swap_in_last_frame_; |
- bool did_perform_swap_in_last_draw_; |
private: |
DISALLOW_COPY_AND_ASSIGN(SchedulerStateMachine); |