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