File indexing completed on 2024-05-19 05:32:20

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 "opengl/glutils.h"
0010 #include "platformsupport/scenes/opengl/openglsurfacetexture.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         std::variant<GLTexture *, OpenGLSurfaceContents> texture;
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         ColorDescription colorDescription;
0031     };
0032 
0033     struct RenderContext
0034     {
0035         QList<RenderNode> renderNodes;
0036         QStack<QMatrix4x4> transformStack;
0037         QStack<qreal> opacityStack;
0038         const QMatrix4x4 projectionMatrix;
0039         const QRegion clip;
0040         const bool hardwareClipping;
0041         const qreal renderTargetScale;
0042     };
0043 
0044     ItemRendererOpenGL();
0045 
0046     void beginFrame(const RenderTarget &renderTarget, const RenderViewport &viewport) override;
0047     void endFrame() override;
0048 
0049     void renderBackground(const RenderTarget &renderTarget, const RenderViewport &viewport, const QRegion &region) override;
0050     void renderItem(const RenderTarget &renderTarget, const RenderViewport &viewport, Item *item, int mask, const QRegion &region, const WindowPaintData &data) override;
0051 
0052     std::unique_ptr<ImageItem> createImageItem(Scene *scene, Item *parent = nullptr) override;
0053 
0054 private:
0055     QVector4D modulate(float opacity, float brightness) const;
0056     void setBlendEnabled(bool enabled);
0057     void createRenderNode(Item *item, RenderContext *context);
0058     void visualizeFractional(const RenderViewport &viewport, const QRegion &region, const RenderContext &renderContext);
0059 
0060     bool m_blendingEnabled = false;
0061 
0062     struct
0063     {
0064         bool fractionalEnabled = false;
0065         std::unique_ptr<GLShader> fractionalShader;
0066     } m_debug;
0067 };
0068 
0069 } // namespace KWin