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 }