/* SPDX-FileCopyrightText: 2022 Vlad Zahorodnii SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "opengl/glutils.h" #include "platformsupport/scenes/opengl/openglsurfacetexture.h" #include "scene/itemrenderer.h" #include namespace KWin { class EglDisplay; class KWIN_EXPORT ItemRendererOpenGL : public ItemRenderer { public: struct RenderNode { std::variant texture; RenderGeometry geometry; QMatrix4x4 transformMatrix; int firstVertex = 0; int vertexCount = 0; qreal opacity = 1; bool hasAlpha = false; ColorDescription colorDescription; RenderingIntent renderingIntent; std::shared_ptr bufferReleasePoint; }; struct RenderContext { QList renderNodes; QStack transformStack; QStack opacityStack; const QMatrix4x4 projectionMatrix; const QMatrix4x4 rootTransform; const QRegion clip; const bool hardwareClipping; const qreal renderTargetScale; }; ItemRendererOpenGL(EglDisplay *eglDisplay); void beginFrame(const RenderTarget &renderTarget, const RenderViewport &viewport) override; void endFrame() override; void renderBackground(const RenderTarget &renderTarget, const RenderViewport &viewport, const QRegion ®ion) override; void renderItem(const RenderTarget &renderTarget, const RenderViewport &viewport, Item *item, int mask, const QRegion ®ion, const WindowPaintData &data) override; std::unique_ptr createImageItem(Item *parent = nullptr) override; private: QVector4D modulate(float opacity, float brightness) const; void setBlendEnabled(bool enabled); void createRenderNode(Item *item, RenderContext *context); void visualizeFractional(const RenderViewport &viewport, const QRegion ®ion, const RenderContext &renderContext); bool m_blendingEnabled = false; EglDisplay *const m_eglDisplay; std::unordered_set> m_releasePoints; struct { bool fractionalEnabled = false; std::unique_ptr fractionalShader; } m_debug; }; } // namespace KWin