/**************************************************************************** ** ** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtWaylandCompositor module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef LINUXDMABUFCLIENTBUFFERINTEGRATION_H #define LINUXDMABUFCLIENTBUFFERINTEGRATION_H #include "linuxdmabuf.h" #include #include #include #include QT_BEGIN_NAMESPACE typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL_compat) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); class LinuxDmabufClientBufferIntegrationPrivate; class LinuxDmabufParams; class LinuxDmabufClientBuffer; // buffer conversion definitions to import YUV buffers struct YuvPlaneConversion { EGLint format = DRM_FORMAT_YUYV; EGLint widthDivisor = 1; EGLint heightDivisor = 1; EGLint planeIndex = 0; }; struct YuvFormatConversion { uint32_t inputPlanes = 1; uint32_t outputPlanes = 1; struct YuvPlaneConversion plane[LinuxDmabufWlBuffer::MaxDmabufPlanes]; }; class LinuxDmabufClientBufferIntegration : public QtWayland::ClientBufferIntegration { public: LinuxDmabufClientBufferIntegration(); ~LinuxDmabufClientBufferIntegration() override; void initializeHardware(struct ::wl_display *display) override; QtWayland::ClientBuffer *createBufferFor(wl_resource *resource) override; bool importBuffer(wl_resource *resource, LinuxDmabufWlBuffer *linuxDmabufBuffer); void removeBuffer(wl_resource *resource); void deleteOrphanedTextures(); void deleteImage(EGLImageKHR image); void deleteGLTextureWhenPossible(QOpenGLTexture *texture) { m_orphanedTextures << texture; } PFNGLEGLIMAGETARGETTEXTURE2DOESPROC gl_egl_image_target_texture_2d = nullptr; private: Q_DISABLE_COPY(LinuxDmabufClientBufferIntegration) PFNEGLBINDWAYLANDDISPLAYWL egl_bind_wayland_display = nullptr; PFNEGLUNBINDWAYLANDDISPLAYWL egl_unbind_wayland_display = nullptr; PFNEGLCREATEIMAGEKHRPROC egl_create_image = nullptr; PFNEGLDESTROYIMAGEKHRPROC egl_destroy_image = nullptr; PFNEGLQUERYDMABUFMODIFIERSEXTPROC egl_query_dmabuf_modifiers_ext = nullptr; PFNEGLQUERYDMABUFFORMATSEXTPROC egl_query_dmabuf_formats_ext = nullptr; bool initSimpleTexture(LinuxDmabufWlBuffer *dmabufBuffer); bool initYuvTexture(LinuxDmabufWlBuffer *dmabufBuffer); QVector supportedDrmFormats(); QVector supportedDrmModifiers(uint32_t format); EGLDisplay m_eglDisplay = EGL_NO_DISPLAY; bool m_displayBound = false; QVector m_orphanedTextures; QHash m_yuvFormats; bool m_supportsDmabufModifiers = false; QHash m_importedBuffers; QScopedPointer m_linuxDmabuf; }; class LinuxDmabufClientBuffer : public QtWayland::ClientBuffer { public: ~LinuxDmabufClientBuffer() override; QWaylandBufferRef::BufferFormatEgl bufferFormatEgl() const override; QSize size() const override; QWaylandSurface::Origin origin() const override; QOpenGLTexture *toOpenGlTexture(int plane) override; protected: void setDestroyed() override; private: friend class LinuxDmabufClientBufferIntegration; friend class LinuxDmabufClientBufferIntegrationPrivate; LinuxDmabufClientBuffer(LinuxDmabufClientBufferIntegration* integration, wl_resource *bufferResource, LinuxDmabufWlBuffer *dmabufBuffer); LinuxDmabufWlBuffer *d = nullptr; LinuxDmabufClientBufferIntegration *m_integration = nullptr; }; QT_END_NAMESPACE #endif // LINUXDMABUFCLIENTBUFFERINTEGRATION_H