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 #include "cc/frame_rate_controller.h"
7 #include "base/debug/trace_event.h"
8 #include "base/logging.h"
9 #include "cc/delay_based_time_source.h"
10 #include "cc/time_source.h"
11 #include "cc/thread.h"
15 // This will be the maximum number of pending frames unless
16 // FrameRateController::setMaxFramesPending is called.
17 const int defaultMaxFramesPending
= 2;
23 class FrameRateControllerTimeSourceAdapter
: public TimeSourceClient
{
25 static scoped_ptr
<FrameRateControllerTimeSourceAdapter
> create(FrameRateController
* frameRateController
) {
26 return make_scoped_ptr(new FrameRateControllerTimeSourceAdapter(frameRateController
));
28 virtual ~FrameRateControllerTimeSourceAdapter() {}
30 virtual void onTimerTick() OVERRIDE
{
31 m_frameRateController
->onTimerTick();
35 explicit FrameRateControllerTimeSourceAdapter(FrameRateController
* frameRateController
)
36 : m_frameRateController(frameRateController
) {}
38 FrameRateController
* m_frameRateController
;
41 FrameRateController::FrameRateController(scoped_refptr
<TimeSource
> timer
)
43 , m_numFramesPending(0)
44 , m_maxFramesPending(defaultMaxFramesPending
)
47 , m_swapBuffersCompleteSupported(true)
48 , m_isTimeSourceThrottling(true)
50 , m_weakFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this))
52 m_timeSourceClientAdapter
= FrameRateControllerTimeSourceAdapter::create(this);
53 m_timeSource
->setClient(m_timeSourceClientAdapter
.get());
56 FrameRateController::FrameRateController(Thread
* thread
)
58 , m_numFramesPending(0)
59 , m_maxFramesPending(defaultMaxFramesPending
)
61 , m_swapBuffersCompleteSupported(true)
62 , m_isTimeSourceThrottling(false)
64 , m_weakFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this))
68 FrameRateController::~FrameRateController()
70 if (m_isTimeSourceThrottling
)
71 m_timeSource
->setActive(false);
74 void FrameRateController::setActive(bool active
)
76 if (m_active
== active
)
78 TRACE_EVENT1("cc", "FrameRateController::setActive", "active", active
);
81 if (m_isTimeSourceThrottling
)
82 m_timeSource
->setActive(active
);
87 m_weakFactory
.InvalidateWeakPtrs();
91 void FrameRateController::setMaxFramesPending(int maxFramesPending
)
93 DCHECK(maxFramesPending
> 0);
94 m_maxFramesPending
= maxFramesPending
;
97 void FrameRateController::setTimebaseAndInterval(base::TimeTicks timebase
, base::TimeDelta interval
)
99 if (m_isTimeSourceThrottling
)
100 m_timeSource
->setTimebaseAndInterval(timebase
, interval
);
103 void FrameRateController::setSwapBuffersCompleteSupported(bool supported
)
105 m_swapBuffersCompleteSupported
= supported
;
108 void FrameRateController::onTimerTick()
112 // Check if we have too many frames in flight.
113 bool throttled
= m_numFramesPending
>= m_maxFramesPending
;
114 TRACE_COUNTER_ID1("cc", "ThrottledVSyncInterval", m_thread
, throttled
);
117 m_client
->vsyncTick(throttled
);
119 if (m_swapBuffersCompleteSupported
&& !m_isTimeSourceThrottling
&& m_numFramesPending
< m_maxFramesPending
)
123 void FrameRateController::postManualTick()
126 m_thread
->postTask(base::Bind(&FrameRateController::manualTick
, m_weakFactory
.GetWeakPtr()));
129 void FrameRateController::manualTick()
134 void FrameRateController::didBeginFrame()
136 if (m_swapBuffersCompleteSupported
)
137 m_numFramesPending
++;
138 else if (!m_isTimeSourceThrottling
)
142 void FrameRateController::didFinishFrame()
144 DCHECK(m_swapBuffersCompleteSupported
);
146 m_numFramesPending
--;
147 if (!m_isTimeSourceThrottling
)
151 void FrameRateController::didAbortAllPendingFrames()
153 m_numFramesPending
= 0;
156 base::TimeTicks
FrameRateController::nextTickTime()
158 if (m_isTimeSourceThrottling
)
159 return m_timeSource
->nextTickTime();
161 return base::TimeTicks();