KWin
Loading...
Searching...
No Matches
showfpseffect.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2006 Lubos Lunak <l.lunak@kde.org>
3 SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
4 SPDX-FileCopyrightText: 2022 Arjen Hiemstra <ahiemstra@heimr.nl>
5
6 SPDX-License-Identifier: GPL-2.0-or-later
7*/
8
9#include "showfpseffect.h"
10#include "core/output.h"
11#include "core/renderviewport.h"
13
14#include <QQmlContext>
15
16namespace KWin
17{
18
22
24
26{
27 return m_fps;
28}
29
31{
32 return m_maximumFps;
33}
34
36{
37 return m_paintDuration;
38}
39
41{
42 return m_paintAmount;
43}
44
46{
47 auto normalizedDuration = std::min(1.0, m_paintDuration / 100.0);
48 return QColor::fromHsvF(0.3 - (0.3 * normalizedDuration), 1.0, 1.0);
49}
50
51void ShowFpsEffect::prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
52{
53 effects->prePaintScreen(data, presentTime);
54
55 m_newFps += 1;
56
57 m_paintDurationTimer.restart();
58 m_paintAmount = 0;
59
60 // detect highest monitor refresh rate
61 uint32_t maximumFps = 0;
62 const auto screens = effects->screens();
63 for (auto screen : screens) {
64 maximumFps = std::max(screen->refreshRate(), maximumFps);
65 }
66 maximumFps /= 1000; // Convert from mHz to Hz.
67
68 if (maximumFps != m_maximumFps) {
69 m_maximumFps = maximumFps;
70 Q_EMIT maximumFpsChanged();
71 }
72
73 if (!m_scene) {
74 m_scene = std::make_unique<OffscreenQuickScene>();
75 const auto url = QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/effects/showfps/qml/main.qml")));
76 m_scene->setSource(url, {{QStringLiteral("effect"), QVariant::fromValue(this)}});
77 }
78}
79
80void ShowFpsEffect::paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen)
81{
82 effects->paintScreen(renderTarget, viewport, mask, region, screen);
83
84 auto now = std::chrono::steady_clock::now();
85 if ((now - m_lastFpsTime) >= std::chrono::milliseconds(1000)) {
86 m_fps = m_newFps;
87 m_newFps = 0;
88 m_lastFpsTime = now;
89 Q_EMIT fpsChanged();
90 }
91
92 const auto rect = viewport.renderRect();
93 m_scene->setGeometry(QRect(rect.x() + rect.width() - 300, 0, 300, 150));
94 effects->renderOffscreenQuickView(renderTarget, viewport, m_scene.get());
95}
96
97void ShowFpsEffect::paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data)
98{
99 effects->paintWindow(renderTarget, viewport, w, mask, region, data);
100
101 // Take intersection of region and actual window's rect, minus the fps area
102 // (since we keep repainting it) and count the pixels.
103 QRegion repaintRegion = region & w->frameGeometry().toRect();
104 repaintRegion -= m_scene->geometry();
105 for (const QRect &rect : repaintRegion) {
106 m_paintAmount += rect.width() * rect.height();
107 }
108}
109
111{
113
114 m_paintDuration = m_paintDurationTimer.elapsed();
115 Q_EMIT paintChanged();
116
117 effects->addRepaint(m_scene->geometry());
118}
119
124
125} // namespace KWin
126
127#include "moc_showfpseffect.cpp"
Representation of a window used by/for Effect classes.
QRectF frameGeometry() const
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen)
Q_SCRIPTABLE void addRepaint(const QRectF &r)
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data)
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
QList< Output * > screens() const
bool isOpenGLCompositing() const
Whether the Compositor is OpenGL based (either GL 1 or 2).
void renderOffscreenQuickView(const RenderTarget &renderTarget, const RenderViewport &viewport, OffscreenQuickView *effectQuickView) const
QRectF renderRect() const
void postPaintScreen() override
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, KWin::WindowPaintData &data) override
static bool supported()
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
~ShowFpsEffect() override
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen) override
EffectsHandler * effects