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: 2017 Roman Gilg <subdiff@gmail.com>
0006     SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
0007     SPDX-FileCopyrightText: 2022 Xaver Hugl <xaver.hugl@gmail.com>
0008 
0009     SPDX-License-Identifier: GPL-2.0-or-later
0010 */
0011 #pragma once
0012 
0013 #include "drm_buffer.h"
0014 
0015 #include <epoxy/egl.h>
0016 #include <gbm.h>
0017 
0018 struct gbm_bo;
0019 
0020 namespace KWaylandServer
0021 {
0022 class ClientBuffer;
0023 class LinuxDmaBufV1ClientBuffer;
0024 }
0025 
0026 namespace KWin
0027 {
0028 
0029 class GbmSurface;
0030 class GLTexture;
0031 
0032 class GbmBuffer : public DrmGpuBuffer
0033 {
0034 public:
0035     GbmBuffer(DrmGpu *gpu, gbm_bo *bo, uint32_t flags);
0036     GbmBuffer(DrmGpu *gpu, gbm_bo *bo, const std::shared_ptr<GbmSurface> &surface);
0037     GbmBuffer(DrmGpu *gpu, gbm_bo *bo, KWaylandServer::LinuxDmaBufV1ClientBuffer *clientBuffer, uint32_t flags);
0038     ~GbmBuffer() override;
0039 
0040     gbm_bo *bo() const;
0041     void *mappedData() const;
0042     KWaylandServer::ClientBuffer *clientBuffer() const;
0043     uint32_t flags() const;
0044 
0045     struct Map
0046     {
0047         void *data;
0048         uint32_t stride;
0049     };
0050     Map map(uint32_t flags);
0051 
0052     static std::shared_ptr<GbmBuffer> importBuffer(DrmGpu *gpu, KWaylandServer::LinuxDmaBufV1ClientBuffer *clientBuffer);
0053     static std::shared_ptr<GbmBuffer> importBuffer(DrmGpu *gpu, GbmBuffer *buffer, uint32_t flags = GBM_BO_USE_SCANOUT);
0054 
0055 private:
0056     void createFds() override;
0057 
0058     gbm_bo *const m_bo;
0059     const std::shared_ptr<GbmSurface> m_surface;
0060     KWaylandServer::ClientBuffer *const m_clientBuffer = nullptr;
0061     const uint32_t m_flags;
0062     void *m_data = nullptr;
0063     void *m_mapping = nullptr;
0064     uint32_t m_mapStride = 0;
0065 };
0066 
0067 }