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_FRAME_RATE_CONTROLLER_H_
6 #define CC_SCHEDULER_FRAME_RATE_CONTROLLER_H_
8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/memory/weak_ptr.h"
11 #include "base/time/time.h"
12 #include "cc/base/cc_export.h"
13 #include "cc/output/begin_frame_args.h"
15 namespace base
{ class SingleThreadTaskRunner
; }
20 class FrameRateController
;
22 class CC_EXPORT FrameRateControllerClient
{
24 virtual ~FrameRateControllerClient() {}
27 // Throttled is true when we have a maximum number of frames pending.
28 virtual void FrameRateControllerTick(bool throttled
,
29 const BeginFrameArgs
& args
) = 0;
32 class FrameRateControllerTimeSourceAdapter
;
34 // The FrameRateController is used in cases where we self-tick (i.e. BeginFrame
35 // is not sent by a parent compositor.
36 class CC_EXPORT FrameRateController
{
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();
43 void SetClient(FrameRateControllerClient
* client
) { client_
= client
; }
45 // Returns a valid BeginFrame on activation to potentially be used
47 BeginFrameArgs
SetActive(bool active
);
49 bool IsActive() { return active_
; }
51 // Use the following methods to adjust target frame rate.
53 // Multiple frames can be in-progress, but for every DidSwapBuffers, a
54 // DidFinishFrame should be posted.
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_
; }
64 void SetTimebaseAndInterval(base::TimeTicks timebase
,
65 base::TimeDelta interval
);
66 void SetDeadlineAdjustment(base::TimeDelta delta
);
69 friend class FrameRateControllerTimeSourceAdapter
;
72 void PostManualTick();
75 // This returns null for unthrottled frame-rate.
76 base::TimeTicks
NextTickTime();
77 // This returns now for unthrottled frame-rate.
78 base::TimeTicks
LastTickTime();
80 FrameRateControllerClient
* client_
;
81 int num_frames_pending_
;
82 int max_swaps_pending_
;
83 base::TimeDelta interval_
;
84 base::TimeDelta deadline_adjustment_
;
85 scoped_refptr
<TimeSource
> time_source_
;
86 scoped_ptr
<FrameRateControllerTimeSourceAdapter
> time_source_client_adapter_
;
89 // Members for unthrottled frame-rate.
90 bool is_time_source_throttling_
;
91 base::WeakPtrFactory
<FrameRateController
> weak_factory_
;
92 base::SingleThreadTaskRunner
* task_runner_
;
95 DISALLOW_COPY_AND_ASSIGN(FrameRateController
);
100 #endif // CC_SCHEDULER_FRAME_RATE_CONTROLLER_H_