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

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2017 Martin Flöser <mgraesslin@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #pragma once
0010 
0011 #include <QVector>
0012 #include <cstdint>
0013 #include <epoxy/egl.h>
0014 #include <memory>
0015 #include <variant>
0016 
0017 #include "drm_buffer_gbm.h"
0018 #include "utils/damagejournal.h"
0019 
0020 struct gbm_device;
0021 struct gbm_surface;
0022 
0023 namespace KWin
0024 {
0025 
0026 class GLFramebuffer;
0027 class EglGbmBackend;
0028 
0029 class GbmSurface : public std::enable_shared_from_this<GbmSurface>
0030 {
0031 public:
0032     explicit GbmSurface(EglGbmBackend *backend, const QSize &size, uint32_t format, const QVector<uint64_t> &modifiers, uint32_t flags, gbm_surface *surface, EGLSurface eglSurface);
0033     ~GbmSurface();
0034 
0035     bool makeContextCurrent() const;
0036 
0037     std::shared_ptr<GbmBuffer> swapBuffers(const QRegion &dirty);
0038     void releaseBuffer(GbmBuffer *buffer);
0039 
0040     GLFramebuffer *fbo() const;
0041 
0042     EGLSurface eglSurface() const;
0043     QSize size() const;
0044     bool isValid() const;
0045     uint32_t format() const;
0046     QVector<uint64_t> modifiers() const;
0047     uint32_t flags() const;
0048     int bufferAge() const;
0049     QRegion repaintRegion() const;
0050 
0051     enum class Error {
0052         ModifiersUnsupported,
0053         EglError,
0054         Unknown
0055     };
0056     static std::variant<std::shared_ptr<GbmSurface>, Error> createSurface(EglGbmBackend *backend, const QSize &size, uint32_t format, uint32_t flags, EGLConfig config);
0057     static std::variant<std::shared_ptr<GbmSurface>, Error> createSurface(EglGbmBackend *backend, const QSize &size, uint32_t format, QVector<uint64_t> modifiers, EGLConfig config);
0058 
0059 private:
0060     gbm_surface *m_surface;
0061     EglGbmBackend *const m_eglBackend;
0062     EGLSurface m_eglSurface = EGL_NO_SURFACE;
0063     QSize m_size;
0064     const uint32_t m_format;
0065     const QVector<uint64_t> m_modifiers;
0066     const uint32_t m_flags;
0067     int m_bufferAge = 0;
0068     DamageJournal m_damageJournal;
0069 
0070     std::unique_ptr<GLFramebuffer> m_fbo;
0071 };
0072 
0073 }