File indexing completed on 2024-05-19 16:34:46

0001 /*
0002     SPDX-FileCopyrightText: 2022 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "kwineffects.h"
0010 #include "kwinglutils.h"
0011 #include "scene/itemrenderer.h"
0012 
0013 namespace KWin
0014 {
0015 
0016 class KWIN_EXPORT ItemRendererOpenGL : public ItemRenderer
0017 {
0018 public:
0019     struct RenderNode
0020     {
0021         GLTexture *texture = nullptr;
0022         RenderGeometry geometry;
0023         QMatrix4x4 transformMatrix;
0024         int firstVertex = 0;
0025         int vertexCount = 0;
0026         qreal opacity = 1;
0027         bool hasAlpha = false;
0028         TextureCoordinateType coordinateType = UnnormalizedCoordinates;
0029         qreal scale = 1.0;
0030     };
0031 
0032     struct RenderContext
0033     {
0034         QVector<RenderNode> renderNodes;
0035         QStack<QMatrix4x4> transformStack;
0036         QStack<qreal> opacityStack;
0037         const QRegion clip;
0038         const bool hardwareClipping;
0039         const qreal renderTargetScale;
0040     };
0041 
0042     ItemRendererOpenGL();
0043 
0044     void beginFrame(RenderTarget *renderTarget) override;
0045     void endFrame() override;
0046 
0047     void renderBackground(const QRegion &region) override;
0048     void renderItem(Item *item, int mask, const QRegion &region, const WindowPaintData &data) override;
0049 
0050     ImageItem *createImageItem(Scene *scene, Item *parent = nullptr) override;
0051 
0052 private:
0053     QVector4D modulate(float opacity, float brightness) const;
0054     void setBlendEnabled(bool enabled);
0055     void createRenderNode(Item *item, RenderContext *context);
0056 
0057     bool m_blendingEnabled = false;
0058 };
0059 
0060 } // namespace KWin