File indexing completed on 2025-07-13 11:20:34
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 0011 #include <QMap> 0012 #include <QPointer> 0013 #include <QRegion> 0014 #include <optional> 0015 0016 #include "core/outputlayer.h" 0017 #include "drm_plane.h" 0018 0019 namespace KWaylandServer 0020 { 0021 class SurfaceInterface; 0022 class LinuxDmaBufV1ClientBuffer; 0023 } 0024 0025 namespace KWin 0026 { 0027 0028 class DrmFramebuffer; 0029 class GbmSurface; 0030 class DumbSwapchain; 0031 class ShadowBuffer; 0032 class EglGbmBackend; 0033 class SurfaceItem; 0034 class GLTexture; 0035 class GbmBuffer; 0036 0037 class EglGbmLayerSurface : public QObject 0038 { 0039 Q_OBJECT 0040 public: 0041 enum class BufferTarget { 0042 Normal, 0043 Linear, 0044 Dumb 0045 }; 0046 enum class FormatOption { 0047 PreferAlpha, 0048 RequireAlpha 0049 }; 0050 EglGbmLayerSurface(DrmGpu *gpu, EglGbmBackend *eglBackend, BufferTarget target = BufferTarget::Normal, FormatOption formatOption = FormatOption::PreferAlpha); 0051 ~EglGbmLayerSurface(); 0052 0053 std::optional<OutputLayerBeginFrameInfo> startRendering(const QSize &bufferSize, DrmPlane::Transformations renderOrientation, DrmPlane::Transformations bufferOrientation, const QMap<uint32_t, QVector<uint64_t>> &formats); 0054 void aboutToStartPainting(DrmOutput *output, const QRegion &damagedRegion); 0055 bool endRendering(DrmPlane::Transformations renderOrientation, const QRegion &damagedRegion); 0056 0057 bool doesSurfaceFit(const QSize &size, const QMap<uint32_t, QVector<uint64_t>> &formats) const; 0058 std::shared_ptr<GLTexture> texture() const; 0059 void destroyResources(); 0060 EglGbmBackend *eglBackend() const; 0061 std::shared_ptr<DrmFramebuffer> renderTestBuffer(const QSize &bufferSize, const QMap<uint32_t, QVector<uint64_t>> &formats); 0062 0063 std::shared_ptr<DrmFramebuffer> currentBuffer() const; 0064 0065 private: 0066 bool doesShadowBufferFit(ShadowBuffer *buffer, const QSize &size, DrmPlane::Transformations renderOrientation, DrmPlane::Transformations bufferOrientation) const; 0067 0068 enum class MultiGpuImportMode { 0069 Dmabuf, 0070 DumbBuffer 0071 }; 0072 struct Surface 0073 { 0074 std::shared_ptr<GbmSurface> gbmSurface; 0075 std::shared_ptr<DumbSwapchain> importSwapchain; 0076 MultiGpuImportMode importMode; 0077 std::shared_ptr<GbmBuffer> currentBuffer; 0078 std::shared_ptr<DrmFramebuffer> currentFramebuffer; 0079 bool forceLinear = false; 0080 }; 0081 bool checkSurface(const QSize &size, const QMap<uint32_t, QVector<uint64_t>> &formats); 0082 bool doesSurfaceFit(const Surface &surface, const QSize &size, const QMap<uint32_t, QVector<uint64_t>> &formats) const; 0083 std::optional<Surface> createSurface(const QSize &size, const QMap<uint32_t, QVector<uint64_t>> &formats) const; 0084 std::optional<Surface> createSurface(const QSize &size, uint32_t format, const QVector<uint64_t> &modifiers, MultiGpuImportMode importMode) const; 0085 std::shared_ptr<GbmSurface> createGbmSurface(const QSize &size, uint32_t format, const QVector<uint64_t> &modifiers, bool forceLinear) const; 0086 0087 std::shared_ptr<DrmFramebuffer> doRenderTestBuffer(Surface &surface) const; 0088 std::shared_ptr<DrmFramebuffer> importBuffer(Surface &surface, const std::shared_ptr<GbmBuffer> &sourceBuffer) const; 0089 std::shared_ptr<DrmFramebuffer> importDmabuf(GbmBuffer *sourceBuffer) const; 0090 std::shared_ptr<DrmFramebuffer> importWithCpu(Surface &surface, GbmBuffer *sourceBuffer) const; 0091 0092 Surface m_surface; 0093 Surface m_oldSurface; 0094 std::shared_ptr<ShadowBuffer> m_shadowBuffer; 0095 std::shared_ptr<ShadowBuffer> m_oldShadowBuffer; 0096 0097 DrmGpu *const m_gpu; 0098 EglGbmBackend *const m_eglBackend; 0099 const BufferTarget m_bufferTarget; 0100 const FormatOption m_formatOption; 0101 }; 0102 0103 }