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 }