32 std::unique_ptr<GLFramebuffer>
m_fbo;
42 std::map<EffectWindow *, std::unique_ptr<OffscreenData>>
windows;
62 std::unique_ptr<OffscreenData> &offscreenData = d->windows[window];
66 offscreenData = std::make_unique<OffscreenData>();
67 offscreenData->setVertexSnappingMode(d->vertexSnappingMode);
69 offscreenData->m_windowDamagedConnection =
72 if (d->windows.size() == 1) {
79 d->windows.erase(window);
80 if (d->windows.empty()) {
87 if (
const auto it = d->windows.find(window); it != d->windows.end()) {
88 it->second->setShader(shader);
100 const QSize textureSize = (logicalGeometry.size() * scale).toSize();
108 m_texture->setWrapMode(GL_CLAMP_TO_EDGE);
117 glClearColor(0.0, 0.0, 0.0, 0.0);
118 glClear(GL_COLOR_BUFFER_BIT);
120 QMatrix4x4 projectionMatrix;
121 projectionMatrix.ortho(QRectF(0, 0, textureSize.width(), textureSize.height()));
163 const double scale = viewport.
scale();
171 for (
auto &quad : quads) {
186 const qreal a = data.
opacity();
189 mvp.translate(std::round(window->
x() * scale), std::round(window->
y() * scale));
204 glEnable(GL_SCISSOR_TEST);
208 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
211 vbo->
draw(clipRegion, GL_TRIANGLES, 0, geometry.count(), clipping);
216 glDisable(GL_SCISSOR_TEST);
223 const auto it = d->windows.find(window);
224 if (it == d->windows.end()) {
233 QRectF visibleRect = expandedGeometry;
234 visibleRect.moveTopLeft(expandedGeometry.topLeft() - frameGeometry.topLeft());
236 quad[0] =
WindowVertex(visibleRect.topLeft(), QPointF(0, 0));
237 quad[1] =
WindowVertex(visibleRect.topRight(), QPointF(1, 0));
238 quad[2] =
WindowVertex(visibleRect.bottomRight(), QPointF(1, 1));
239 quad[3] =
WindowVertex(visibleRect.bottomLeft(), QPointF(0, 1));
243 apply(window, mask, data, quads);
246 offscreenData->
paint(renderTarget, viewport, window, region, data, quads);
249void OffscreenEffect::handleWindowDamaged(
EffectWindow *window)
251 if (
const auto it = d->windows.find(window); it != d->windows.end()) {
252 it->second->setDirty();
256void OffscreenEffect::handleWindowDeleted(EffectWindow *window)
262void OffscreenEffect::setupConnections()
264 d->windowDeletedConnection =
268void OffscreenEffect::destroyConnections()
270 disconnect(d->windowDeletedConnection);
272 d->windowDeletedConnection = {};
277 d->vertexSnappingMode = mode;
278 for (
auto &window : std::as_const(d->windows)) {
279 window.second->setVertexSnappingMode(mode);
292 std::map<EffectWindow *, std::unique_ptr<CrossFadeWindowData>>
windows;
306 const auto it = d->windows.find(window);
313 if (it == d->windows.end()) {
335 const QMarginsF margins(
336 (expandedGeometry.x() - frameGeometry.x()) / widthRatio,
337 (expandedGeometry.y() - frameGeometry.y()) / heightRatio,
338 (frameGeometry.right() - expandedGeometry.right()) / widthRatio,
339 (frameGeometry.bottom() - expandedGeometry.bottom()) / heightRatio);
341 QRectF visibleRect = QRectF(QPointF(0, 0), frameGeometry.size()) - margins;
344 quad[0] =
WindowVertex(visibleRect.topLeft(), QPointF(0, 0));
345 quad[1] =
WindowVertex(visibleRect.topRight(), QPointF(1, 0));
346 quad[2] =
WindowVertex(visibleRect.bottomRight(), QPointF(1, 1));
347 quad[3] =
WindowVertex(visibleRect.bottomLeft(), QPointF(0, 1));
351 offscreenData->
paint(renderTarget, viewport, window, region, previousWindowData, quads);
356 if (d->windows.empty()) {
360 std::unique_ptr<CrossFadeWindowData> &offscreenData = d->windows[window];
364 offscreenData = std::make_unique<CrossFadeWindowData>();
375 offscreenData->maybeRender(window);
376 offscreenData->frameGeometryAtCapture = window->
frameGeometry();
384 d->windows.erase(window);
385 if (d->windows.empty()) {
390void CrossFadeEffect::handleWindowDeleted(
EffectWindow *window)
397 if (
const auto it = d->windows.find(window); it != d->windows.end()) {
398 it->second->setShader(shader);
404#include "moc_offscreeneffect.cpp"
const Colorimetry & colorimetry() const
const QMatrix4x4 & toXYZ() const
void unredirect(EffectWindow *window)
~CrossFadeEffect() override
void setShader(EffectWindow *window, GLShader *shader)
void redirect(EffectWindow *window)
CrossFadeEffect(QObject *parent=nullptr)
void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *window, int mask, const QRegion ®ion, WindowPaintData &data) override
std::map< EffectWindow *, std::unique_ptr< CrossFadeWindowData > > windows
QRectF frameGeometryAtCapture
Base class for all KWin effects.
Representation of a window used by/for Effect classes.
void windowDamaged(KWin::EffectWindow *w)
Q_SCRIPTABLE void setData(int role, const QVariant &data)
Q_SCRIPTABLE QVariant data(int role) const
QRectF frameGeometry() const
void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
void windowDeleted(KWin::EffectWindow *w)
bool makeOpenGLContextCurrent()
Makes the OpenGL compositing context current.
bool isOpenGLCompositing() const
Whether the Compositor is OpenGL based (either GL 1 or 2).
static GLFramebuffer * popFramebuffer()
static void pushFramebuffer(GLFramebuffer *fbo)
bool setColorspaceUniformsFromSRGB(const ColorDescription &dst)
@ ModelViewProjectionMatrix
bool setUniform(const char *name, float value)
static std::unique_ptr< GLTexture > allocate(GLenum internalFormat, const QSize &size, int levels=1)
void draw(GLenum primitiveMode, int first, int count)
void setAttribLayout(std::span< const GLVertexAttrib > attribs, size_t stride)
static constexpr std::array GLVertex2DLayout
static GLVertexBuffer * streamingBuffer()
std::optional< std::span< T > > map(size_t count)
void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *window, int mask, const QRegion ®ion, WindowPaintData &data) override
void unredirect(EffectWindow *window)
void redirect(EffectWindow *window)
virtual void apply(EffectWindow *window, int mask, WindowPaintData &data, WindowQuadList &quads)
OffscreenEffect(QObject *parent=nullptr)
~OffscreenEffect() override
void setVertexSnappingMode(RenderGeometry::VertexSnappingMode mode)
void setShader(EffectWindow *window, GLShader *shader)
std::map< EffectWindow *, std::unique_ptr< OffscreenData > > windows
RenderGeometry::VertexSnappingMode vertexSnappingMode
QMetaObject::Connection windowDeletedConnection
void postProcessTextureCoordinates(const QMatrix4x4 &textureMatrix)
void appendWindowQuad(const WindowQuad &quad, qreal deviceScale)
void copy(std::span< GLVertex2D > destination)
void setVertexSnappingMode(VertexSnappingMode mode)
const ColorDescription & colorDescription() const
QRectF mapToRenderTarget(const QRectF &logicalGeometry) const
GLShader * shader(ShaderTraits traits)
static ShaderManager * instance()
Class representing one area of a window.
void setYTranslation(qreal translate)
void setProjectionMatrix(const QMatrix4x4 &matrix)
qreal crossFadeProgress() const
virtual void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
void setXTranslation(qreal translate)
QMatrix4x4 toMatrix(qreal deviceScale) const
void setOpacity(qreal opacity)
QMatrix4x4 projectionMatrix() const
@ PAINT_WINDOW_TRANSFORMED
@ PAINT_WINDOW_TRANSLUCENT
KWIN_EXPORT QRect infiniteRegion()
@ WindowForceBackgroundContrastRole
For fullscreen effects to enforce the background contrast,.
@ WindowForceBlurRole
For fullscreen effects to enforce blurring of windows,.
void setVertexSnappingMode(RenderGeometry::VertexSnappingMode mode)
void setShader(GLShader *newShader)
QMetaObject::Connection m_windowDamagedConnection
std::unique_ptr< GLFramebuffer > m_fbo
void maybeRender(EffectWindow *window)
void paint(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *window, const QRegion ®ion, const WindowPaintData &data, const WindowQuadList &quads)
RenderGeometry::VertexSnappingMode m_vertexSnappingMode
std::unique_ptr< GLTexture > m_texture