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_
10 #include "base/basictypes.h"
11 #include "base/cancelable_callback.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/time/time.h"
14 #include "cc/base/cc_export.h"
15 #include "cc/output/begin_frame_args.h"
16 #include "cc/scheduler/draw_swap_readback_result.h"
17 #include "cc/scheduler/scheduler_settings.h"
18 #include "cc/scheduler/scheduler_state_machine.h"
19 #include "cc/trees/layer_tree_host.h"
25 class SchedulerClient {
27 virtual void SetNeedsBeginImplFrame(bool enable) = 0;
28 virtual void ScheduledActionSendBeginMainFrame() = 0;
29 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() = 0;
30 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapForced() = 0;
31 virtual DrawSwapReadbackResult ScheduledActionDrawAndReadback() = 0;
32 virtual void ScheduledActionCommit() = 0;
33 virtual void ScheduledActionUpdateVisibleTiles() = 0;
34 virtual void ScheduledActionActivatePendingTree() = 0;
35 virtual void ScheduledActionBeginOutputSurfaceCreation() = 0;
36 virtual void ScheduledActionAcquireLayerTexturesForMainThread() = 0;
37 virtual void ScheduledActionManageTiles() = 0;
38 virtual void DidAnticipatedDrawTimeChange(base::TimeTicks time) = 0;
39 virtual base::TimeDelta DrawDurationEstimate() = 0;
40 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() = 0;
41 virtual base::TimeDelta CommitToActivateDurationEstimate() = 0;
42 virtual void PostBeginImplFrameDeadline(const base::Closure& closure,
43 base::TimeTicks deadline) = 0;
44 virtual void DidBeginImplFrameDeadline() = 0;
47 virtual ~SchedulerClient() {}
50 class CC_EXPORT Scheduler {
52 static scoped_ptr<Scheduler> Create(
53 SchedulerClient* client,
54 const SchedulerSettings& scheduler_settings,
55 int layer_tree_host_id) {
56 return make_scoped_ptr(
57 new Scheduler(client, scheduler_settings, layer_tree_host_id));
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 SetMainThreadNeedsLayerTextures();
80 void SetSwapUsedIncompleteTile(bool used_incomplete_tile);
82 void SetSmoothnessTakesPriority(bool smoothness_takes_priority);
85 void BeginMainFrameAborted(bool did_handle);
87 void DidManageTiles();
88 void DidLoseOutputSurface();
89 void DidCreateAndInitializeOutputSurface();
90 bool HasInitializedOutputSurface() const {
91 return state_machine_.HasInitializedOutputSurface();
94 bool CommitPending() const { return state_machine_.CommitPending(); }
95 bool RedrawPending() const { return state_machine_.RedrawPending(); }
96 bool ManageTilesPending() const {
97 return state_machine_.ManageTilesPending();
99 bool MainThreadIsInHighLatencyMode() const {
100 return state_machine_.MainThreadIsInHighLatencyMode();
103 bool WillDrawIfNeeded() const;
105 base::TimeTicks AnticipatedDrawTime();
107 base::TimeTicks LastBeginImplFrameTime();
109 void BeginImplFrame(const BeginFrameArgs& args);
110 void OnBeginImplFrameDeadline();
111 void PollForAnticipatedDrawTriggers();
113 scoped_ptr<base::Value> StateAsValue() {
114 return state_machine_.AsValue().Pass();
117 bool IsInsideAction(SchedulerStateMachine::Action action) {
118 return inside_action_ == action;
122 Scheduler(SchedulerClient* client,
123 const SchedulerSettings& scheduler_settings,
124 int layer_tree_host_id);
126 void PostBeginImplFrameDeadline(base::TimeTicks deadline);
127 void SetupNextBeginImplFrameIfNeeded();
128 void ActivatePendingTree();
129 void DrawAndSwapIfPossible();
130 void DrawAndSwapForced();
131 void DrawAndReadback();
132 void ProcessScheduledActions();
134 bool CanCommitAndActivateBeforeDeadline() const;
135 void AdvanceCommitStateIfPossible();
137 const SchedulerSettings settings_;
138 SchedulerClient* client_;
139 int layer_tree_host_id_;
141 bool last_set_needs_begin_impl_frame_;
142 BeginFrameArgs last_begin_impl_frame_args_;
143 base::CancelableClosure begin_impl_frame_deadline_closure_;
144 base::CancelableClosure poll_for_draw_triggers_closure_;
145 base::RepeatingTimer<Scheduler> advance_commit_state_timer_;
147 SchedulerStateMachine state_machine_;
148 bool inside_process_scheduled_actions_;
149 SchedulerStateMachine::Action inside_action_;
151 base::WeakPtrFactory<Scheduler> weak_factory_;
153 DISALLOW_COPY_AND_ASSIGN(Scheduler);
158 #endif // CC_SCHEDULER_SCHEDULER_H_