File indexing completed on 2025-04-20 10:57:36

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2022 Xaver Hugl <xaver.hugl@gmail.com>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #pragma once
0010 #include "drm_layer.h"
0011 
0012 #include <QImage>
0013 
0014 namespace KWin
0015 {
0016 
0017 class DumbSwapchain;
0018 class DrmPipeline;
0019 class DrmVirtualOutput;
0020 class DrmQPainterBackend;
0021 class DrmDumbBuffer;
0022 class DrmFramebuffer;
0023 
0024 class DrmQPainterLayer : public DrmPipelineLayer
0025 {
0026 public:
0027     DrmQPainterLayer(DrmPipeline *pipeline);
0028 
0029     std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
0030     bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
0031     bool checkTestBuffer() override;
0032     std::shared_ptr<DrmFramebuffer> currentBuffer() const override;
0033     QRegion currentDamage() const override;
0034     void releaseBuffers() override;
0035 
0036 private:
0037     bool doesSwapchainFit() const;
0038 
0039     std::shared_ptr<DumbSwapchain> m_swapchain;
0040     std::shared_ptr<DrmFramebuffer> m_currentFramebuffer;
0041     QRegion m_currentDamage;
0042 };
0043 
0044 class DrmCursorQPainterLayer : public DrmOverlayLayer
0045 {
0046 public:
0047     DrmCursorQPainterLayer(DrmPipeline *pipeline);
0048 
0049     std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
0050     bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
0051 
0052     bool checkTestBuffer() override;
0053     std::shared_ptr<DrmFramebuffer> currentBuffer() const override;
0054     QRegion currentDamage() const override;
0055     void releaseBuffers() override;
0056 
0057 private:
0058     std::shared_ptr<DumbSwapchain> m_swapchain;
0059     std::shared_ptr<DrmFramebuffer> m_currentFramebuffer;
0060 };
0061 
0062 class DrmVirtualQPainterLayer : public DrmOutputLayer
0063 {
0064 public:
0065     DrmVirtualQPainterLayer(DrmVirtualOutput *output);
0066 
0067     std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
0068     bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
0069 
0070     QRegion currentDamage() const override;
0071     void releaseBuffers() override;
0072 
0073 private:
0074     QImage m_image;
0075     QRegion m_currentDamage;
0076     DrmVirtualOutput *const m_output;
0077 };
0078 }