1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2019 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtWaylandCompositor module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:GPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU 19 ** General Public License version 3 or (at your option) any later version 20 ** approved by the KDE Free Qt Foundation. The licenses are as published by 21 ** the Free Software Foundation and appearing in the file LICENSE.GPL3 22 ** included in the packaging of this file. Please review the following 23 ** information to ensure the GNU General Public License requirements will 24 ** be met: https://www.gnu.org/licenses/gpl-3.0.html. 25 ** 26 ** $QT_END_LICENSE$ 27 ** 28 ****************************************************************************/ 29 30 #ifndef QWLTEXTURESHARINGEXTENSION_P_H 31 #define QWLTEXTURESHARINGEXTENSION_P_H 32 33 // 34 // W A R N I N G 35 // ------------- 36 // 37 // This file is not part of the Qt API. It exists purely as an 38 // implementation detail. This header file may change from version to 39 // version without notice, or even be removed. 40 // 41 // We mean it. 42 // 43 44 #include "wayland-util.h" 45 46 #include <QtCore/QMap> 47 #include <QtCore/QHash> 48 49 #include <QtWaylandCompositor/QWaylandCompositorExtensionTemplate> 50 #include <QtWaylandCompositor/QWaylandQuickExtension> 51 #include <QtWaylandCompositor/QWaylandCompositor> 52 53 #include <QQuickImageProvider> 54 55 #include <QtWaylandCompositor/private/qwaylandcompositor_p.h> 56 #include <QtWaylandCompositor/private/qwlserverbufferintegration_p.h> 57 58 #include <QtWaylandCompositor/private/qwayland-server-qt-texture-sharing-unstable-v1.h> 59 60 QT_BEGIN_NAMESPACE 61 62 namespace QtWayland 63 { 64 class ServerBufferIntegration; 65 } 66 67 class QWaylandTextureSharingExtension; 68 class SharedTextureImageResponse; 69 70 class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandSharedTextureProvider : public QQuickAsyncImageProvider 71 { 72 public: 73 QWaylandSharedTextureProvider(); 74 ~QWaylandSharedTextureProvider() override; 75 76 QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize) override; 77 void setExtensionReady(QWaylandTextureSharingExtension *extension); 78 79 private: 80 QVector<SharedTextureImageResponse*> m_pendingResponses; 81 }; 82 83 class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandTextureSharingExtension 84 : public QWaylandCompositorExtensionTemplate<QWaylandTextureSharingExtension> 85 , public QtWaylandServer::zqt_texture_sharing_v1 86 { 87 Q_OBJECT 88 Q_PROPERTY(QString imageSearchPath WRITE setImageSearchPath) 89 public: 90 QWaylandTextureSharingExtension(); 91 QWaylandTextureSharingExtension(QWaylandCompositor *compositor); 92 ~QWaylandTextureSharingExtension() override; 93 94 void initialize() override; 95 96 void setImageSearchPath(const QString &path); 97 self()98 static QWaylandTextureSharingExtension *self() { return s_self; } 99 100 public slots: 101 void requestBuffer(const QString &key); 102 103 signals: 104 void bufferResult(const QString &key, QtWayland::ServerBuffer *buffer); 105 106 protected slots: 107 void cleanupBuffers(); 108 109 protected: 110 void zqt_texture_sharing_v1_request_image(Resource *resource, const QString &key) override; 111 void zqt_texture_sharing_v1_abandon_image(Resource *resource, const QString &key) override; 112 void zqt_texture_sharing_v1_destroy_resource(Resource *resource) override; 113 customPixelData(const QString & key,QByteArray * data,QSize * size,uint * glInternalFormat)114 virtual bool customPixelData(const QString &key, QByteArray *data, QSize *size, uint *glInternalFormat) 115 { 116 Q_UNUSED(key); 117 Q_UNUSED(data); 118 Q_UNUSED(size); 119 Q_UNUSED(glInternalFormat); 120 return false; 121 } 122 123 private: 124 QtWayland::ServerBuffer *getBuffer(const QString &key); 125 bool initServerBufferIntegration(); 126 QtWayland::ServerBuffer *getCompressedBuffer(const QString &key); 127 QString getExistingFilePath(const QString &key) const; 128 void dumpBufferInfo(); 129 130 struct BufferInfo 131 { bufferBufferInfo132 BufferInfo(QtWayland::ServerBuffer *b = nullptr) : buffer(b) {} 133 QtWayland::ServerBuffer *buffer = nullptr; 134 bool usedLocally = false; 135 }; 136 137 QStringList m_image_dirs; 138 QStringList m_image_suffixes; 139 QHash<QString, BufferInfo> m_server_buffers; 140 QtWayland::ServerBufferIntegration *m_server_buffer_integration = nullptr; 141 142 static QWaylandTextureSharingExtension *s_self; 143 }; 144 145 Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(QWaylandTextureSharingExtension) 146 147 QT_END_NAMESPACE 148 149 #endif // QWLTEXTURESHARINGEXTENSION_P_H 150