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

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
0006     SPDX-FileCopyrightText: 2022 Xaver Hugl <xaver.hugl@gmail.com>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 #pragma once
0011 
0012 #include "utils/filedescriptor.h"
0013 
0014 #include <QImage>
0015 #include <QSize>
0016 #include <array>
0017 #include <memory>
0018 #include <optional>
0019 
0020 namespace KWin
0021 {
0022 
0023 class DrmGpu;
0024 class DrmFramebuffer;
0025 
0026 class DrmGpuBuffer
0027 {
0028 public:
0029     DrmGpuBuffer(DrmGpu *gpu, QSize size, uint32_t format, uint64_t modifier, const std::array<uint32_t, 4> &handles, const std::array<uint32_t, 4> &strides, const std::array<uint32_t, 4> &offsets, uint32_t planeCount);
0030     virtual ~DrmGpuBuffer() = default;
0031 
0032     DrmGpu *gpu() const;
0033     uint32_t format() const;
0034     uint64_t modifier() const;
0035     QSize size() const;
0036     const std::array<FileDescriptor, 4> &fds();
0037     std::array<uint32_t, 4> handles() const;
0038     std::array<uint32_t, 4> strides() const;
0039     std::array<uint32_t, 4> offsets() const;
0040     uint32_t planeCount() const;
0041 
0042 protected:
0043     virtual void createFds();
0044 
0045     DrmGpu *const m_gpu;
0046     const QSize m_size;
0047     const uint32_t m_format;
0048     const uint64_t m_modifier;
0049     const std::array<uint32_t, 4> m_handles;
0050     const std::array<uint32_t, 4> m_strides;
0051     const std::array<uint32_t, 4> m_offsets;
0052     const uint32_t m_planeCount;
0053     std::array<FileDescriptor, 4> m_fds;
0054 };
0055 
0056 class DrmFramebuffer
0057 {
0058 public:
0059     DrmFramebuffer(const std::shared_ptr<DrmGpuBuffer> &buffer, uint32_t fbId);
0060     ~DrmFramebuffer();
0061 
0062     uint32_t framebufferId() const;
0063     /**
0064      * may be nullptr
0065      */
0066     DrmGpuBuffer *buffer() const;
0067 
0068     void releaseBuffer();
0069 
0070     static std::shared_ptr<DrmFramebuffer> createFramebuffer(const std::shared_ptr<DrmGpuBuffer> &buffer);
0071 
0072 protected:
0073     const uint32_t m_framebufferId;
0074     DrmGpu *const m_gpu;
0075     std::shared_ptr<DrmGpuBuffer> m_buffer;
0076 };
0077 
0078 }