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
60QT_BEGIN_NAMESPACE
61
62namespace QtWayland
63{
64 class ServerBufferIntegration;
65}
66
67class QWaylandTextureSharingExtension;
68class SharedTextureImageResponse;
69
70class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandSharedTextureProvider : public QQuickAsyncImageProvider
71{
72public:
73 QWaylandSharedTextureProvider();
74 ~QWaylandSharedTextureProvider() override;
75
76 QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize) override;
77 void setExtensionReady(QWaylandTextureSharingExtension *extension);
78
79private:
80 QVector<SharedTextureImageResponse*> m_pendingResponses;
81};
82
83class 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)
89public:
90 QWaylandTextureSharingExtension();
91 QWaylandTextureSharingExtension(QWaylandCompositor *compositor);
92 ~QWaylandTextureSharingExtension() override;
93
94 void initialize() override;
95
96 void setImageSearchPath(const QString &path);
97
98 static QWaylandTextureSharingExtension *self() { return s_self; }
99
100public slots:
101 void requestBuffer(const QString &key);
102
103signals:
104 void bufferResult(const QString &key, QtWayland::ServerBuffer *buffer);
105
106protected slots:
107 void cleanupBuffers();
108
109protected:
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
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
123private:
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 {
132 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
145Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(QWaylandTextureSharingExtension)
146
147QT_END_NAMESPACE
148
149#endif // QWLTEXTURESHARINGEXTENSION_P_H
150

source code of qtwayland/src/compositor/extensions/qwltexturesharingextension_p.h