KWin
Loading...
Searching...
No Matches
blur.h
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2010 Fredrik Höglund <fredrik@kde.org>
3 SPDX-FileCopyrightText: 2018 Alex Nemeth <alex.nemeth329@gmail.com>
4
5 SPDX-License-Identifier: GPL-2.0-or-later
6*/
7
8#pragma once
9
10#include "effect/effect.h"
11#include "opengl/glutils.h"
12
13#include <QList>
14
15#include <unordered_map>
16
17namespace KWin
18{
19
20class BlurManagerInterface;
21
23{
26 std::vector<std::unique_ptr<GLTexture>> textures;
27 std::vector<std::unique_ptr<GLFramebuffer>> framebuffers;
28};
29
31{
33 std::optional<QRegion> content;
34
36 std::optional<QRegion> frame;
37
39 std::unordered_map<Output *, BlurRenderData> render;
40};
41
43{
44 Q_OBJECT
45
46public:
47 BlurEffect();
48 ~BlurEffect() override;
49
50 static bool supported();
51 static bool enabledByDefault();
52
53 void reconfigure(ReconfigureFlags flags) override;
54 void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override;
55 void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime) override;
56 void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data) override;
57
58 bool provides(Feature feature) override;
59 bool isActive() const override;
60
61 int requestedEffectChainPosition() const override
62 {
63 return 20;
64 }
65
66 bool eventFilter(QObject *watched, QEvent *event) override;
67
68 bool blocksDirectScanout() const override;
69
70public Q_SLOTS:
73 void slotScreenRemoved(KWin::Output *screen);
74 void slotPropertyNotify(KWin::EffectWindow *w, long atom);
76
77private:
78 void initBlurStrengthValues();
79 QRegion blurRegion(EffectWindow *w) const;
80 QRegion decorationBlurRegion(const EffectWindow *w) const;
81 bool decorationSupportsBlurBehind(const EffectWindow *w) const;
82 bool shouldBlur(const EffectWindow *w, int mask, const WindowPaintData &data) const;
83 void updateBlurRegion(EffectWindow *w);
84 void blur(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data);
85 GLTexture *ensureNoiseTexture();
86
87private:
88 struct
89 {
90 std::unique_ptr<GLShader> shader;
94 } m_downsamplePass;
95
96 struct
97 {
98 std::unique_ptr<GLShader> shader;
100 int offsetLocation;
102 } m_upsamplePass;
103
104 struct
105 {
106 std::unique_ptr<GLShader> shader;
110
111 std::unique_ptr<GLTexture> noiseTexture;
112 qreal noiseTextureScale = 1.0;
114 } m_noisePass;
115
116 bool m_valid = false;
117 long net_wm_blur_region = 0;
118 QRegion m_paintedArea; // keeps track of all painted areas (from bottom to top)
119 QRegion m_currentBlur; // keeps track of the currently blured area of the windows(from bottom to top)
120 Output *m_currentScreen = nullptr;
121
122 size_t m_iterationCount; // number of times the texture will be downsized to half size
123 int m_offset;
124 int m_expandSize;
125 int m_noiseStrength;
126
127 struct OffsetStruct
128 {
129 float minOffset;
130 float maxOffset;
131 int expandSize;
132 };
133
134 QList<OffsetStruct> blurOffsets;
135
136 struct BlurValuesStruct
137 {
138 int iteration;
139 float offset;
140 };
141
142 QList<BlurValuesStruct> blurStrengthValues;
143
144 QMap<EffectWindow *, QMetaObject::Connection> windowBlurChangedConnections;
145 std::unordered_map<EffectWindow *, BlurEffectData> m_windows;
146
147 static BlurManagerInterface *s_blurManager;
148 static QTimer *s_blurManagerRemoveTimer;
149};
150
152{
153 if (feature == Blur) {
154 return true;
155 }
156 return KWin::Effect::provides(feature);
157}
158
159} // namespace KWin
int noiseTextureSizeLocation
Definition blur.h:108
bool provides(Feature feature) override
Definition blur.h:151
void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data) override
Definition blur.cpp:482
void reconfigure(ReconfigureFlags flags) override
Definition blur.cpp:199
int offsetLocation
Definition blur.h:92
int requestedEffectChainPosition() const override
Definition blur.h:61
qreal noiseTextureScale
Definition blur.h:112
int texStartPosLocation
Definition blur.h:109
~BlurEffect() override
Definition blur.cpp:133
bool isActive() const override
Definition blur.cpp:846
std::unique_ptr< GLTexture > noiseTexture
Definition blur.h:111
bool eventFilter(QObject *watched, QEvent *event) override
Definition blur.cpp:326
void slotPropertyNotify(KWin::EffectWindow *w, long atom)
Definition blur.cpp:308
void slotScreenRemoved(KWin::Output *screen)
Definition blur.cpp:298
bool blocksDirectScanout() const override
Definition blur.cpp:851
void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime) override
Definition blur.cpp:417
std::unique_ptr< GLShader > shader
Definition blur.h:90
int noiseTextureStength
Definition blur.h:113
void slotWindowDeleted(KWin::EffectWindow *w)
Definition blur.cpp:286
static bool enabledByDefault()
Definition blur.cpp:340
int mvpMatrixLocation
Definition blur.h:91
void setupDecorationConnections(EffectWindow *w)
Definition blur.cpp:315
static bool supported()
Definition blur.cpp:361
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
Definition blur.cpp:408
int halfpixelLocation
Definition blur.h:93
void slotWindowAdded(KWin::EffectWindow *w)
Definition blur.cpp:265
Base class for all KWin effects.
Definition effect.h:535
Representation of a window used by/for Effect classes.
virtual bool provides(Feature)
Definition effect.cpp:442
std::unordered_map< Output *, BlurRenderData > render
The render data per screen. Screens can have different color spaces.
Definition blur.h:39
std::optional< QRegion > content
The region that should be blurred behind the window.
Definition blur.h:33
std::optional< QRegion > frame
The region that should be blurred behind the frame.
Definition blur.h:36
std::vector< std::unique_ptr< GLTexture > > textures
Definition blur.h:26
std::vector< std::unique_ptr< GLFramebuffer > > framebuffers
Definition blur.h:27