OLD | NEW |
---|---|
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_FRAME_RATE_CONTROLLER_H_ | 5 #ifndef CC_SCHEDULER_FRAME_RATE_CONTROLLER_H_ |
6 #define CC_SCHEDULER_FRAME_RATE_CONTROLLER_H_ | 6 #define CC_SCHEDULER_FRAME_RATE_CONTROLLER_H_ |
7 | 7 |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
12 #include "cc/base/cc_export.h" | 12 #include "cc/base/cc_export.h" |
13 #include "cc/output/begin_frame_args.h" | 13 #include "cc/output/begin_frame_args.h" |
14 #include "cc/scheduler/time_source.h" | |
14 | 15 |
15 namespace base { class SingleThreadTaskRunner; } | 16 namespace base { class SingleThreadTaskRunner; } |
16 | 17 |
17 namespace cc { | 18 namespace cc { |
18 | 19 |
19 class TimeSource; | 20 class TimeSource; |
20 class FrameRateController; | 21 class BeginFrameSource; |
21 | 22 |
22 class CC_EXPORT FrameRateControllerClient { | 23 class CC_EXPORT BeginFrameSourceClient { |
23 protected: | 24 protected: |
24 virtual ~FrameRateControllerClient() {} | 25 virtual ~BeginFrameSourceClient() {} |
25 | 26 |
26 public: | 27 public: |
27 // Throttled is true when we have a maximum number of frames pending. | 28 virtual void BeginImplFrame(const BeginFrameArgs& args) = 0; |
28 virtual void FrameRateControllerTick(bool throttled, | |
29 const BeginFrameArgs& args) = 0; | |
30 }; | 29 }; |
31 | 30 |
32 class FrameRateControllerTimeSourceAdapter; | 31 // The BeginFrameSource is used in cases where we self-tick (i.e. BeginFrame |
32 // is not sent by a parent compositor. | |
33 class CC_EXPORT BeginFrameSource : TimeSourceClient { | |
Sami
2014/03/14 15:34:58
I wonder if we should call this something like Syn
| |
34 public: | |
35 explicit BeginFrameSource(base::TimeDelta interval, | |
36 base::SingleThreadTaskRunner* task_runner); | |
37 virtual ~BeginFrameSource(); | |
33 | 38 |
34 // The FrameRateController is used in cases where we self-tick (i.e. BeginFrame | 39 void SetClient(BeginFrameSourceClient* client) { client_ = client; } |
35 // is not sent by a parent compositor. | |
36 class CC_EXPORT FrameRateController { | |
37 public: | |
38 explicit FrameRateController(scoped_refptr<TimeSource> timer); | |
39 // Alternate form of FrameRateController with unthrottled frame-rate. | |
40 explicit FrameRateController(base::SingleThreadTaskRunner* task_runner); | |
41 virtual ~FrameRateController(); | |
42 | |
43 void SetClient(FrameRateControllerClient* client) { client_ = client; } | |
44 | 40 |
45 // Returns a valid BeginFrame on activation to potentially be used | 41 // Returns a valid BeginFrame on activation to potentially be used |
46 // retroactively. | 42 // retroactively. |
47 BeginFrameArgs SetActive(bool active); | 43 BeginFrameArgs SetActive(bool active); |
48 | 44 |
49 bool IsActive() { return active_; } | 45 bool IsActive() { return active_; } |
50 | 46 |
51 // Use the following methods to adjust target frame rate. | |
52 // | |
53 // Multiple frames can be in-progress, but for every DidSwapBuffers, a | |
54 // DidFinishFrame should be posted. | |
55 // | |
56 // If the rendering pipeline crashes, call DidAbortAllPendingFrames. | |
57 void DidSwapBuffers(); | |
58 void DidSwapBuffersComplete(); | |
59 void DidAbortAllPendingFrames(); | |
60 void SetMaxSwapsPending(int max_swaps_pending); // 0 for unlimited. | |
61 int MaxSwapsPending() const { return max_swaps_pending_; } | |
62 int NumSwapsPendingForTesting() const { return num_frames_pending_; } | |
63 | |
64 void SetTimebaseAndInterval(base::TimeTicks timebase, | 47 void SetTimebaseAndInterval(base::TimeTicks timebase, |
65 base::TimeDelta interval); | 48 base::TimeDelta interval); |
66 void SetDeadlineAdjustment(base::TimeDelta delta); | 49 void SetDeadlineAdjustment(base::TimeDelta delta); |
67 | 50 |
51 virtual void OnTimerTick() OVERRIDE; | |
52 | |
68 protected: | 53 protected: |
69 friend class FrameRateControllerTimeSourceAdapter; | |
70 void OnTimerTick(); | |
71 | |
72 void PostManualTick(); | |
73 void ManualTick(); | |
74 | |
75 // This returns null for unthrottled frame-rate. | 54 // This returns null for unthrottled frame-rate. |
76 base::TimeTicks NextTickTime(); | 55 base::TimeTicks NextTickTime(); |
77 // This returns now for unthrottled frame-rate. | 56 // This returns now for unthrottled frame-rate. |
78 base::TimeTicks LastTickTime(); | 57 base::TimeTicks LastTickTime(); |
79 | 58 |
80 FrameRateControllerClient* client_; | 59 BeginFrameSourceClient* client_; |
81 int num_frames_pending_; | |
82 int max_swaps_pending_; | |
83 base::TimeDelta interval_; | 60 base::TimeDelta interval_; |
84 base::TimeDelta deadline_adjustment_; | 61 base::TimeDelta deadline_adjustment_; |
85 scoped_refptr<TimeSource> time_source_; | 62 scoped_refptr<TimeSource> time_source_; |
86 scoped_ptr<FrameRateControllerTimeSourceAdapter> time_source_client_adapter_; | |
87 bool active_; | 63 bool active_; |
88 | 64 |
89 // Members for unthrottled frame-rate. | |
90 bool is_time_source_throttling_; | |
91 bool manual_tick_pending_; | |
92 base::SingleThreadTaskRunner* task_runner_; | |
93 base::WeakPtrFactory<FrameRateController> weak_factory_; | |
94 | |
95 private: | 65 private: |
96 DISALLOW_COPY_AND_ASSIGN(FrameRateController); | 66 DISALLOW_COPY_AND_ASSIGN(BeginFrameSource); |
97 }; | 67 }; |
98 | 68 |
99 } // namespace cc | 69 } // namespace cc |
100 | 70 |
101 #endif // CC_SCHEDULER_FRAME_RATE_CONTROLLER_H_ | 71 #endif // CC_SCHEDULER_FRAME_RATE_CONTROLLER_H_ |
OLD | NEW |