File indexing completed on 2024-06-16 05:05:12

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 #include "utils/damagejournal.h"
0012 
0013 #include <QImage>
0014 
0015 namespace KWin
0016 {
0017 
0018 class QPainterSwapchain;
0019 class QPainterSwapchainSlot;
0020 class DrmPipeline;
0021 class DrmVirtualOutput;
0022 class DrmQPainterBackend;
0023 class DrmFramebuffer;
0024 
0025 class DrmQPainterLayer : public DrmPipelineLayer
0026 {
0027 public:
0028     DrmQPainterLayer(DrmPipeline *pipeline);
0029 
0030     std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
0031     bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
0032     bool checkTestBuffer() override;
0033     std::shared_ptr<DrmFramebuffer> currentBuffer() const override;
0034     QRegion currentDamage() const override;
0035     void releaseBuffers() override;
0036     std::chrono::nanoseconds queryRenderTime() const override;
0037 
0038 private:
0039     bool doesSwapchainFit() const;
0040 
0041     std::shared_ptr<QPainterSwapchain> m_swapchain;
0042     std::shared_ptr<QPainterSwapchainSlot> m_currentBuffer;
0043     std::shared_ptr<DrmFramebuffer> m_currentFramebuffer;
0044     DamageJournal m_damageJournal;
0045     std::chrono::steady_clock::time_point m_renderStart;
0046     std::chrono::nanoseconds m_renderTime;
0047 };
0048 
0049 class DrmCursorQPainterLayer : public DrmPipelineLayer
0050 {
0051 public:
0052     DrmCursorQPainterLayer(DrmPipeline *pipeline);
0053 
0054     std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
0055     bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
0056 
0057     bool checkTestBuffer() override;
0058     std::shared_ptr<DrmFramebuffer> currentBuffer() const override;
0059     QRegion currentDamage() const override;
0060     void releaseBuffers() override;
0061     std::chrono::nanoseconds queryRenderTime() const override;
0062 
0063 private:
0064     std::shared_ptr<QPainterSwapchain> m_swapchain;
0065     std::shared_ptr<QPainterSwapchainSlot> m_currentBuffer;
0066     std::shared_ptr<DrmFramebuffer> m_currentFramebuffer;
0067     std::chrono::steady_clock::time_point m_renderStart;
0068     std::chrono::nanoseconds m_renderTime;
0069 };
0070 
0071 class DrmVirtualQPainterLayer : public DrmOutputLayer
0072 {
0073 public:
0074     DrmVirtualQPainterLayer(DrmVirtualOutput *output);
0075 
0076     std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
0077     bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
0078 
0079     QRegion currentDamage() const override;
0080     void releaseBuffers() override;
0081     std::chrono::nanoseconds queryRenderTime() const override;
0082 
0083 private:
0084     QImage m_image;
0085     QRegion m_currentDamage;
0086     DrmVirtualOutput *const m_output;
0087     std::chrono::steady_clock::time_point m_renderStart;
0088     std::chrono::nanoseconds m_renderTime;
0089 };
0090 }