CompositingRunLoop.cpp [plain text]
#include "config.h"
#include "CompositingRunLoop.h"
#if USE(COORDINATED_GRAPHICS_THREADED)
#include <wtf/CurrentTime.h>
#include <wtf/MainThread.h>
namespace WebKit {
CompositingRunLoop::CompositingRunLoop(std::function<void ()>&& updateFunction)
: m_runLoop(RunLoop::current())
, m_updateTimer(m_runLoop, this, &CompositingRunLoop::updateTimerFired)
, m_updateFunction(WTFMove(updateFunction))
{
}
void CompositingRunLoop::performTask(Function<void ()>&& function)
{
ASSERT(isMainThread());
m_runLoop.dispatch(WTFMove(function));
}
void CompositingRunLoop::performTaskSync(Function<void ()>&& function)
{
ASSERT(isMainThread());
LockHolder locker(m_dispatchSyncConditionMutex);
m_runLoop.dispatch([this, function = WTFMove(function)] {
LockHolder locker(m_dispatchSyncConditionMutex);
function();
m_dispatchSyncCondition.notifyOne();
});
m_dispatchSyncCondition.wait(m_dispatchSyncConditionMutex);
}
void CompositingRunLoop::startUpdateTimer(UpdateTiming timing)
{
if (m_updateTimer.isActive())
return;
const static double targetFPS = 60;
double nextUpdateTime = 0;
if (timing == WaitUntilNextFrame)
nextUpdateTime = std::max((1 / targetFPS) - (monotonicallyIncreasingTime() - m_lastUpdateTime), 0.0);
m_updateTimer.startOneShot(nextUpdateTime);
}
void CompositingRunLoop::stopUpdateTimer()
{
m_updateTimer.stop();
}
void CompositingRunLoop::updateTimerFired()
{
m_updateFunction();
m_lastUpdateTime = monotonicallyIncreasingTime();
}
void CompositingRunLoop::run()
{
m_runLoop.run();
}
void CompositingRunLoop::stop()
{
m_updateTimer.stop();
m_runLoop.stop();
}
}
#endif // USE(COORDINATED_GRAPHICS_THREADED)