KWin
Loading...
Searching...
No Matches
renderjournal.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
7#include "renderjournal.h"
8
9using namespace std::chrono_literals;
10
11namespace KWin
12{
13
17
18static std::chrono::nanoseconds mix(std::chrono::nanoseconds duration1, std::chrono::nanoseconds duration2, double ratio)
19{
20 return std::chrono::nanoseconds(int64_t(std::round(duration1.count() * ratio + duration2.count() * (1 - ratio))));
21}
22
23void RenderJournal::add(std::chrono::nanoseconds renderTime, std::chrono::nanoseconds presentationTimestamp)
24{
25 const auto timeDifference = m_lastAdd ? presentationTimestamp - *m_lastAdd : 10s;
26 m_lastAdd = presentationTimestamp;
27
28 static constexpr std::chrono::nanoseconds varianceTimeConstant = 3s;
29 const double varianceRatio = std::clamp(timeDifference.count() / double(varianceTimeConstant.count()), 0.1, 1.0);
30 const auto renderTimeDiff = std::max(renderTime - m_result, 0ns);
31 m_variance = std::max(mix(renderTimeDiff, m_variance, varianceRatio), renderTimeDiff);
32
33 static constexpr std::chrono::nanoseconds timeConstant = 500ms;
34 const double ratio = std::clamp(timeDifference.count() / double(timeConstant.count()), 0.1, 1.0);
35 m_result = mix(renderTime, m_result, ratio);
36}
37
38std::chrono::nanoseconds RenderJournal::result() const
39{
40 return m_result + m_variance * 2;
41}
42
43} // namespace KWin
void add(std::chrono::nanoseconds renderTime, std::chrono::nanoseconds presentationTimestamp)
std::chrono::nanoseconds result() const