KWin
Loading...
Searching...
No Matches
softwarevsyncmonitor.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
8
9namespace KWin
10{
11
12std::unique_ptr<SoftwareVsyncMonitor> SoftwareVsyncMonitor::create()
13{
14 return std::unique_ptr<SoftwareVsyncMonitor>{new SoftwareVsyncMonitor()};
15}
16
17SoftwareVsyncMonitor::SoftwareVsyncMonitor()
18{
19 connect(&m_softwareClock, &QTimer::timeout, this, &SoftwareVsyncMonitor::handleSyntheticVsync);
20 m_softwareClock.setSingleShot(true);
21}
22
24{
25 return m_refreshRate;
26}
27
29{
30 m_refreshRate = refreshRate;
31}
32
33void SoftwareVsyncMonitor::handleSyntheticVsync()
34{
35 Q_EMIT vblankOccurred(m_vblankTimestamp);
36}
37
38template<typename T>
39T alignTimestamp(const T &timestamp, const T &alignment)
40{
41 return timestamp + ((alignment - (timestamp % alignment)) % alignment);
42}
43
45{
46 if (m_softwareClock.isActive()) {
47 return;
48 }
49
50 const std::chrono::nanoseconds currentTime(std::chrono::steady_clock::now().time_since_epoch());
51 const std::chrono::nanoseconds vblankInterval(1'000'000'000'000ull / m_refreshRate);
52
53 m_vblankTimestamp = alignTimestamp(currentTime, vblankInterval);
54
55 m_softwareClock.start(std::chrono::duration_cast<std::chrono::milliseconds>(m_vblankTimestamp - currentTime));
56}
57
58} // namespace KWin
59
60#include "moc_softwarevsyncmonitor.cpp"
static std::unique_ptr< SoftwareVsyncMonitor > create()
void setRefreshRate(int refreshRate)
void vblankOccurred(std::chrono::nanoseconds timestamp)
T alignTimestamp(const T &timestamp, const T &alignment)