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 }