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
3 // found in the LICENSE file.
5 #ifndef CC_SCHEDULER_SCHEDULER_H_
6 #define CC_SCHEDULER_SCHEDULER_H_
11 #include "base/basictypes.h"
12 #include "base/cancelable_callback.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/time/time.h"
15 #include "cc/base/cc_export.h"
16 #include "cc/output/begin_frame_args.h"
17 #include "cc/scheduler/draw_swap_readback_result.h"
18 #include "cc/scheduler/scheduler_settings.h"
19 #include "cc/scheduler/scheduler_state_machine.h"
20 #include "cc/trees/layer_tree_host.h"
26 class SchedulerClient
{
28 virtual void SetNeedsBeginFrame(bool enable
) = 0;
29 virtual void WillBeginImplFrame(const BeginFrameArgs
& args
) = 0;
30 virtual void ScheduledActionSendBeginMainFrame() = 0;
31 virtual DrawSwapReadbackResult
ScheduledActionDrawAndSwapIfPossible() = 0;
32 virtual DrawSwapReadbackResult
ScheduledActionDrawAndSwapForced() = 0;
33 virtual DrawSwapReadbackResult
ScheduledActionDrawAndReadback() = 0;
34 virtual void ScheduledActionCommit() = 0;
35 virtual void ScheduledActionUpdateVisibleTiles() = 0;
36 virtual void ScheduledActionActivatePendingTree() = 0;
37 virtual void ScheduledActionBeginOutputSurfaceCreation() = 0;
38 virtual void ScheduledActionManageTiles() = 0;
39 virtual void DidAnticipatedDrawTimeChange(base::TimeTicks time
) = 0;
40 virtual base::TimeDelta
DrawDurationEstimate() = 0;
41 virtual base::TimeDelta
BeginMainFrameToCommitDurationEstimate() = 0;
42 virtual base::TimeDelta
CommitToActivateDurationEstimate() = 0;
43 virtual void DidBeginImplFrameDeadline() = 0;
46 virtual ~SchedulerClient() {}
49 class CC_EXPORT Scheduler
{
51 static scoped_ptr
<Scheduler
> Create(
52 SchedulerClient
* client
,
53 const SchedulerSettings
& scheduler_settings
,
54 int layer_tree_host_id
,
55 const scoped_refptr
<base::SequencedTaskRunner
>& impl_task_runner
) {
56 return make_scoped_ptr(new Scheduler(
57 client
, scheduler_settings
, layer_tree_host_id
, impl_task_runner
));
64 void SetVisible(bool visible
);
65 void SetCanDraw(bool can_draw
);
66 void NotifyReadyToActivate();
68 void SetNeedsCommit();
70 // Like SetNeedsCommit(), but ensures a commit will definitely happen even if
71 // we are not visible. Will eventually result in a forced draw internally.
72 void SetNeedsForcedCommitForReadback();
74 void SetNeedsRedraw();
76 void SetNeedsManageTiles();
78 void SetSwapUsedIncompleteTile(bool used_incomplete_tile
);
80 void SetSmoothnessTakesPriority(bool smoothness_takes_priority
);
82 void NotifyReadyToCommit();
83 void BeginMainFrameAborted(bool did_handle
);
85 void DidManageTiles();
86 void DidLoseOutputSurface();
87 void DidCreateAndInitializeOutputSurface();
88 bool HasInitializedOutputSurface() const {
89 return state_machine_
.HasInitializedOutputSurface();
92 bool CommitPending() const { return state_machine_
.CommitPending(); }
93 bool RedrawPending() const { return state_machine_
.RedrawPending(); }
94 bool ManageTilesPending() const {
95 return state_machine_
.ManageTilesPending();
97 bool MainThreadIsInHighLatencyMode() const {
98 return state_machine_
.MainThreadIsInHighLatencyMode();
100 bool BeginImplFrameDeadlinePending() const {
101 return !begin_impl_frame_deadline_task_
.IsCancelled();
104 bool WillDrawIfNeeded() const;
106 base::TimeTicks
AnticipatedDrawTime() const;
108 void NotifyBeginMainFrameStarted();
110 base::TimeTicks
LastBeginImplFrameTime();
112 void BeginFrame(const BeginFrameArgs
& args
);
113 void BeginRetroFrame();
114 void BeginImplFrame(const BeginFrameArgs
& args
);
115 void OnBeginImplFrameDeadline();
116 void PollForAnticipatedDrawTriggers();
117 void PollToAdvanceCommitState();
119 scoped_ptr
<base::Value
> StateAsValue() const;
121 bool IsInsideAction(SchedulerStateMachine::Action action
) {
122 return inside_action_
== action
;
125 bool IsBeginMainFrameSent() const;
126 void SetContinuousPainting(bool continuous_painting
) {
127 state_machine_
.SetContinuousPainting(continuous_painting
);
131 Scheduler(SchedulerClient
* client
,
132 const SchedulerSettings
& scheduler_settings
,
133 int layer_tree_host_id
,
134 const scoped_refptr
<base::SequencedTaskRunner
>& impl_task_runner
);
136 base::TimeTicks
AdjustedBeginImplFrameDeadline(
137 const BeginFrameArgs
& args
,
138 base::TimeDelta draw_duration_estimate
) const;
139 void ScheduleBeginImplFrameDeadline(base::TimeTicks deadline
);
140 void SetupNextBeginFrameIfNeeded();
141 void PostBeginRetroFrameIfNeeded();
142 void ActivatePendingTree();
143 void DrawAndSwapIfPossible();
144 void DrawAndSwapForced();
145 void DrawAndReadback();
146 void ProcessScheduledActions();
148 bool CanCommitAndActivateBeforeDeadline() const;
149 void AdvanceCommitStateIfPossible();
151 bool IsBeginMainFrameSentOrStarted() const;
153 const SchedulerSettings settings_
;
154 SchedulerClient
* client_
;
155 int layer_tree_host_id_
;
156 scoped_refptr
<base::SequencedTaskRunner
> impl_task_runner_
;
158 bool last_set_needs_begin_frame_
;
159 bool begin_retro_frame_posted_
;
161 std::deque
<BeginFrameArgs
> begin_retro_frame_args_
;
162 BeginFrameArgs begin_impl_frame_args_
;
164 base::Closure begin_retro_frame_closure_
;
165 base::Closure begin_impl_frame_deadline_closure_
;
166 base::Closure poll_for_draw_triggers_closure_
;
167 base::Closure advance_commit_state_closure_
;
168 base::CancelableClosure begin_impl_frame_deadline_task_
;
169 base::CancelableClosure poll_for_draw_triggers_task_
;
170 base::CancelableClosure advance_commit_state_task_
;
172 SchedulerStateMachine state_machine_
;
173 bool inside_process_scheduled_actions_
;
174 SchedulerStateMachine::Action inside_action_
;
176 base::WeakPtrFactory
<Scheduler
> weak_factory_
;
178 DISALLOW_COPY_AND_ASSIGN(Scheduler
);
183 #endif // CC_SCHEDULER_SCHEDULER_H_