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

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

Issue 267783004: Refactoring the way begin frame sources inside scheduler work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Scheduler tests now pass and the code is cleaner. Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « cc/scheduler/frame_source_unittest.cc ('k') | cc/scheduler/scheduler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #ifndef CC_SCHEDULER_SCHEDULER_H_ 5 #ifndef CC_SCHEDULER_SCHEDULER_H_
6 #define CC_SCHEDULER_SCHEDULER_H_ 6 #define CC_SCHEDULER_SCHEDULER_H_
7 7
8 #include <deque> 8 #include <deque>
9 #include <string> 9 #include <string>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/cancelable_callback.h" 12 #include "base/cancelable_callback.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/time/time.h" 14 #include "base/time/time.h"
15 #include "cc/base/cc_export.h" 15 #include "cc/base/cc_export.h"
16 #include "cc/output/begin_frame_args.h" 16 #include "cc/output/begin_frame_args.h"
17 #include "cc/scheduler/draw_result.h" 17 #include "cc/scheduler/draw_result.h"
18 #include "cc/scheduler/frame_source.h"
18 #include "cc/scheduler/scheduler_settings.h" 19 #include "cc/scheduler/scheduler_settings.h"
19 #include "cc/scheduler/scheduler_state_machine.h" 20 #include "cc/scheduler/scheduler_state_machine.h"
20 #include "cc/scheduler/time_source.h" 21 #include "cc/scheduler/time_source.h"
21 #include "cc/trees/layer_tree_host.h" 22 #include "cc/trees/layer_tree_host.h"
22 23
23 namespace cc { 24 namespace cc {
24 25
25 class Thread; 26 class Thread;
26 class SyntheticBeginFrameSource;
27 27
28 class SchedulerClient { 28 class SchedulerClient {
29 public: 29 public:
30 virtual void SetNeedsBeginFrame(bool enable) = 0;
31 virtual void WillBeginImplFrame(const BeginFrameArgs& args) = 0; 30 virtual void WillBeginImplFrame(const BeginFrameArgs& args) = 0;
32 virtual void ScheduledActionSendBeginMainFrame() = 0; 31 virtual void ScheduledActionSendBeginMainFrame() = 0;
33 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() = 0; 32 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() = 0;
34 virtual DrawResult ScheduledActionDrawAndSwapForced() = 0; 33 virtual DrawResult ScheduledActionDrawAndSwapForced() = 0;
35 virtual void ScheduledActionAnimate() = 0; 34 virtual void ScheduledActionAnimate() = 0;
36 virtual void ScheduledActionCommit() = 0; 35 virtual void ScheduledActionCommit() = 0;
37 virtual void ScheduledActionUpdateVisibleTiles() = 0; 36 virtual void ScheduledActionUpdateVisibleTiles() = 0;
38 virtual void ScheduledActionActivatePendingTree() = 0; 37 virtual void ScheduledActionActivatePendingTree() = 0;
39 virtual void ScheduledActionBeginOutputSurfaceCreation() = 0; 38 virtual void ScheduledActionBeginOutputSurfaceCreation() = 0;
40 virtual void ScheduledActionManageTiles() = 0; 39 virtual void ScheduledActionManageTiles() = 0;
41 virtual void DidAnticipatedDrawTimeChange(base::TimeTicks time) = 0; 40 virtual void DidAnticipatedDrawTimeChange(base::TimeTicks time) = 0;
42 virtual base::TimeDelta DrawDurationEstimate() = 0; 41 virtual base::TimeDelta DrawDurationEstimate() = 0;
43 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() = 0; 42 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() = 0;
44 virtual base::TimeDelta CommitToActivateDurationEstimate() = 0; 43 virtual base::TimeDelta CommitToActivateDurationEstimate() = 0;
45 virtual void DidBeginImplFrameDeadline() = 0; 44 virtual void DidBeginImplFrameDeadline() = 0;
46 45
47 protected: 46 protected:
48 virtual ~SchedulerClient() {} 47 virtual ~SchedulerClient() {}
49 }; 48 };
50 49
51 class CC_EXPORT Scheduler { 50 class CC_EXPORT Scheduler : public BeginFrameSink {
52 public: 51 public:
53 static scoped_ptr<Scheduler> Create( 52 static scoped_ptr<Scheduler> Create(
54 SchedulerClient* client, 53 SchedulerClient* client,
55 const SchedulerSettings& scheduler_settings, 54 const SchedulerSettings& scheduler_settings,
56 int layer_tree_host_id, 55 int layer_tree_host_id,
56 BeginFrameSource* external_frame_source,
57 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) { 57 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) {
58 return make_scoped_ptr(new Scheduler( 58 return make_scoped_ptr(new Scheduler(client,
59 client, scheduler_settings, layer_tree_host_id, impl_task_runner)); 59 scheduler_settings,
60 layer_tree_host_id,
61 external_frame_source,
62 impl_task_runner));
60 } 63 }
61 64
62 virtual ~Scheduler(); 65 virtual ~Scheduler();
63 66
64 const SchedulerSettings& settings() const { return settings_; } 67 const SchedulerSettings& settings() const { return settings_; }
65 68
66 void CommitVSyncParameters(base::TimeTicks timebase, 69 void CommitVSyncParameters(base::TimeTicks timebase,
67 base::TimeDelta interval); 70 base::TimeDelta interval);
68 void SetEstimatedParentDrawTime(base::TimeDelta draw_time); 71 void SetEstimatedParentDrawTime(base::TimeDelta draw_time);
69 72
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 return !begin_impl_frame_deadline_task_.IsCancelled(); 113 return !begin_impl_frame_deadline_task_.IsCancelled();
111 } 114 }
112 115
113 bool WillDrawIfNeeded() const; 116 bool WillDrawIfNeeded() const;
114 117
115 base::TimeTicks AnticipatedDrawTime() const; 118 base::TimeTicks AnticipatedDrawTime() const;
116 119
117 void NotifyBeginMainFrameStarted(); 120 void NotifyBeginMainFrameStarted();
118 121
119 base::TimeTicks LastBeginImplFrameTime(); 122 base::TimeTicks LastBeginImplFrameTime();
120 base::TimeDelta VSyncInterval() { return vsync_interval_; }
121 base::TimeDelta EstimatedParentDrawTime() { 123 base::TimeDelta EstimatedParentDrawTime() {
122 return estimated_parent_draw_time_; 124 return estimated_parent_draw_time_;
123 } 125 }
124 126
125 void BeginFrame(const BeginFrameArgs& args); 127 virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE;
126 void PostBeginRetroFrame(); 128 void PostBeginRetroFrame();
127 void BeginRetroFrame(); 129 void BeginRetroFrame();
128 void BeginUnthrottledFrame();
129 130
130 void BeginImplFrame(const BeginFrameArgs& args); 131 void BeginImplFrame(const BeginFrameArgs& args);
131 void OnBeginImplFrameDeadline(); 132 void OnBeginImplFrameDeadline();
132 void PollForAnticipatedDrawTriggers(); 133 void PollForAnticipatedDrawTriggers();
133 void PollToAdvanceCommitState(); 134 void PollToAdvanceCommitState();
134 135
135 scoped_ptr<base::Value> AsValue() const; 136 scoped_ptr<base::Value> AsValue() const;
136 137
137 bool IsInsideAction(SchedulerStateMachine::Action action) { 138 bool IsInsideAction(SchedulerStateMachine::Action action) {
138 return inside_action_ == action; 139 return inside_action_ == action;
139 } 140 }
140 141
141 bool IsBeginMainFrameSent() const; 142 bool IsBeginMainFrameSent() const;
142 void SetContinuousPainting(bool continuous_painting) { 143 void SetContinuousPainting(bool continuous_painting) {
143 state_machine_.SetContinuousPainting(continuous_painting); 144 state_machine_.SetContinuousPainting(continuous_painting);
144 } 145 }
145 146
146 private: 147 private:
147 Scheduler( 148 Scheduler(
148 SchedulerClient* client, 149 SchedulerClient* client,
149 const SchedulerSettings& scheduler_settings, 150 const SchedulerSettings& scheduler_settings,
150 int layer_tree_host_id, 151 int layer_tree_host_id,
152 BeginFrameSource* external_frame_source,
151 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner); 153 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner);
152 154
153 base::TimeTicks AdjustedBeginImplFrameDeadline( 155 base::TimeTicks AdjustedBeginImplFrameDeadline(
154 const BeginFrameArgs& args, 156 const BeginFrameArgs& args,
155 base::TimeDelta draw_duration_estimate) const; 157 base::TimeDelta draw_duration_estimate) const;
156 void ScheduleBeginImplFrameDeadline(base::TimeTicks deadline); 158 void ScheduleBeginImplFrameDeadline(base::TimeTicks deadline);
157 void SetupNextBeginFrameIfNeeded(); 159 void SetupNextBeginFrameIfNeeded();
158 void PostBeginRetroFrameIfNeeded(); 160 void PostBeginRetroFrameIfNeeded();
159 void SetupNextBeginFrameWhenVSyncThrottlingEnabled(bool needs_begin_frame);
160 void SetupNextBeginFrameWhenVSyncThrottlingDisabled(bool needs_begin_frame);
161 void SetupPollingMechanisms(bool needs_begin_frame); 161 void SetupPollingMechanisms(bool needs_begin_frame);
162 void DrawAndSwapIfPossible(); 162 void DrawAndSwapIfPossible();
163 void ProcessScheduledActions(); 163 void ProcessScheduledActions();
164 164
165 bool CanCommitAndActivateBeforeDeadline() const; 165 bool CanCommitAndActivateBeforeDeadline() const;
166 void AdvanceCommitStateIfPossible(); 166 void AdvanceCommitStateIfPossible();
167 167
168 bool IsBeginMainFrameSentOrStarted() const; 168 bool IsBeginMainFrameSentOrStarted() const;
169 169
170 const SchedulerSettings settings_; 170 const SchedulerSettings settings_;
171 SchedulerClient* client_; 171 SchedulerClient* client_;
172 int layer_tree_host_id_; 172 int layer_tree_host_id_;
173 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner_; 173 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner_;
174 174
175 base::TimeDelta vsync_interval_;
176 base::TimeDelta estimated_parent_draw_time_; 175 base::TimeDelta estimated_parent_draw_time_;
177 176
178 bool last_set_needs_begin_frame_;
179 bool begin_unthrottled_frame_posted_;
180 bool begin_retro_frame_posted_; 177 bool begin_retro_frame_posted_;
181 std::deque<BeginFrameArgs> begin_retro_frame_args_; 178 std::deque<BeginFrameArgs> begin_retro_frame_args_;
182 BeginFrameArgs begin_impl_frame_args_; 179 BeginFrameArgs begin_impl_frame_args_;
183 180
184 void SetupSyntheticBeginFrames(); 181 scoped_ptr<DualBeginFrameSource> frame_source_;
185 scoped_ptr<SyntheticBeginFrameSource> synthetic_begin_frame_source_;
186 182
187 base::Closure begin_retro_frame_closure_; 183 base::Closure begin_retro_frame_closure_;
188 base::Closure begin_unthrottled_frame_closure_; 184 base::Closure begin_unthrottled_frame_closure_;
189 185
190 base::Closure begin_impl_frame_deadline_closure_; 186 base::Closure begin_impl_frame_deadline_closure_;
191 base::Closure poll_for_draw_triggers_closure_; 187 base::Closure poll_for_draw_triggers_closure_;
192 base::Closure advance_commit_state_closure_; 188 base::Closure advance_commit_state_closure_;
193 base::CancelableClosure begin_impl_frame_deadline_task_; 189 base::CancelableClosure begin_impl_frame_deadline_task_;
194 base::CancelableClosure poll_for_draw_triggers_task_; 190 base::CancelableClosure poll_for_draw_triggers_task_;
195 base::CancelableClosure advance_commit_state_task_; 191 base::CancelableClosure advance_commit_state_task_;
196 192
197 SchedulerStateMachine state_machine_; 193 SchedulerStateMachine state_machine_;
198 bool inside_process_scheduled_actions_; 194 bool inside_process_scheduled_actions_;
199 SchedulerStateMachine::Action inside_action_; 195 SchedulerStateMachine::Action inside_action_;
200 196
201 base::WeakPtrFactory<Scheduler> weak_factory_; 197 base::WeakPtrFactory<Scheduler> weak_factory_;
202 198
203 DISALLOW_COPY_AND_ASSIGN(Scheduler); 199 DISALLOW_COPY_AND_ASSIGN(Scheduler);
204 }; 200 };
205 201
206 } // namespace cc 202 } // namespace cc
207 203
208 #endif // CC_SCHEDULER_SCHEDULER_H_ 204 #endif // CC_SCHEDULER_SCHEDULER_H_
OLDNEW
« no previous file with comments | « cc/scheduler/frame_source_unittest.cc ('k') | cc/scheduler/scheduler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698