1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2019 The Qt Company Ltd. |
4 | ** Contact: http://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the Qt Gui module |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL3$ |
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 http://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at http://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 3 as published by the Free Software |
20 | ** Foundation and appearing in the file LICENSE.LGPLv3 included in the |
21 | ** packaging of this file. Please review the following information to |
22 | ** ensure the GNU Lesser General Public License version 3 requirements |
23 | ** will be met: https://www.gnu.org/licenses/lgpl.html. |
24 | ** |
25 | ** GNU General Public License Usage |
26 | ** Alternatively, this file may be used under the terms of the GNU |
27 | ** General Public License version 2.0 or later as published by the Free |
28 | ** Software Foundation and appearing in the file LICENSE.GPL included in |
29 | ** the packaging of this file. Please review the following information to |
30 | ** ensure the GNU General Public License version 2.0 requirements will be |
31 | ** met: http://www.gnu.org/licenses/gpl-2.0.html. |
32 | ** |
33 | ** $QT_END_LICENSE$ |
34 | ** |
35 | ****************************************************************************/ |
36 | |
37 | #ifndef QSHADERDESCRIPTION_H |
38 | #define QSHADERDESCRIPTION_H |
39 | |
40 | // |
41 | // W A R N I N G |
42 | // ------------- |
43 | // |
44 | // This file is not part of the Qt API. It exists for the convenience |
45 | // of a number of Qt sources files. This header file may change from |
46 | // version to version without notice, or even be removed. |
47 | // |
48 | // We mean it. |
49 | // |
50 | |
51 | #include <QtGui/qtguiglobal.h> |
52 | #include <QtCore/QString> |
53 | #include <QtCore/QVector> |
54 | #include <array> |
55 | |
56 | QT_BEGIN_NAMESPACE |
57 | |
58 | struct QShaderDescriptionPrivate; |
59 | class QDataStream; |
60 | |
61 | class Q_GUI_EXPORT QShaderDescription |
62 | { |
63 | public: |
64 | QShaderDescription(); |
65 | QShaderDescription(const QShaderDescription &other); |
66 | QShaderDescription &operator=(const QShaderDescription &other); |
67 | ~QShaderDescription(); |
68 | void detach(); |
69 | |
70 | bool isValid() const; |
71 | |
72 | QByteArray toCbor() const; |
73 | void serialize(QDataStream *stream) const; |
74 | QByteArray toJson() const; |
75 | |
76 | #if QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15) |
77 | QT_DEPRECATED_X("Use CBOR format instead" ) |
78 | static QShaderDescription fromBinaryJson(const QByteArray &data); |
79 | #endif |
80 | static QShaderDescription fromCbor(const QByteArray &data); |
81 | static QShaderDescription deserialize(QDataStream *stream, int version); |
82 | |
83 | enum VariableType { |
84 | Unknown = 0, |
85 | |
86 | // do not reorder |
87 | Float, |
88 | Vec2, |
89 | Vec3, |
90 | Vec4, |
91 | Mat2, |
92 | Mat2x3, |
93 | Mat2x4, |
94 | Mat3, |
95 | Mat3x2, |
96 | Mat3x4, |
97 | Mat4, |
98 | Mat4x2, |
99 | Mat4x3, |
100 | |
101 | Int, |
102 | Int2, |
103 | Int3, |
104 | Int4, |
105 | |
106 | Uint, |
107 | Uint2, |
108 | Uint3, |
109 | Uint4, |
110 | |
111 | Bool, |
112 | Bool2, |
113 | Bool3, |
114 | Bool4, |
115 | |
116 | Double, |
117 | Double2, |
118 | Double3, |
119 | Double4, |
120 | DMat2, |
121 | DMat2x3, |
122 | DMat2x4, |
123 | DMat3, |
124 | DMat3x2, |
125 | DMat3x4, |
126 | DMat4, |
127 | DMat4x2, |
128 | DMat4x3, |
129 | |
130 | Sampler1D, |
131 | Sampler2D, |
132 | Sampler2DMS, |
133 | Sampler3D, |
134 | SamplerCube, |
135 | Sampler1DArray, |
136 | Sampler2DArray, |
137 | Sampler2DMSArray, |
138 | Sampler3DArray, |
139 | SamplerCubeArray, |
140 | SamplerRect, |
141 | SamplerBuffer, |
142 | |
143 | Image1D, |
144 | Image2D, |
145 | Image2DMS, |
146 | Image3D, |
147 | ImageCube, |
148 | Image1DArray, |
149 | Image2DArray, |
150 | Image2DMSArray, |
151 | Image3DArray, |
152 | ImageCubeArray, |
153 | ImageRect, |
154 | ImageBuffer, |
155 | |
156 | Struct |
157 | }; |
158 | |
159 | enum ImageFormat { |
160 | // must match SPIR-V's ImageFormat |
161 | ImageFormatUnknown = 0, |
162 | ImageFormatRgba32f = 1, |
163 | ImageFormatRgba16f = 2, |
164 | ImageFormatR32f = 3, |
165 | ImageFormatRgba8 = 4, |
166 | ImageFormatRgba8Snorm = 5, |
167 | ImageFormatRg32f = 6, |
168 | ImageFormatRg16f = 7, |
169 | ImageFormatR11fG11fB10f = 8, |
170 | ImageFormatR16f = 9, |
171 | ImageFormatRgba16 = 10, |
172 | ImageFormatRgb10A2 = 11, |
173 | ImageFormatRg16 = 12, |
174 | ImageFormatRg8 = 13, |
175 | ImageFormatR16 = 14, |
176 | ImageFormatR8 = 15, |
177 | ImageFormatRgba16Snorm = 16, |
178 | ImageFormatRg16Snorm = 17, |
179 | ImageFormatRg8Snorm = 18, |
180 | ImageFormatR16Snorm = 19, |
181 | ImageFormatR8Snorm = 20, |
182 | ImageFormatRgba32i = 21, |
183 | ImageFormatRgba16i = 22, |
184 | ImageFormatRgba8i = 23, |
185 | ImageFormatR32i = 24, |
186 | ImageFormatRg32i = 25, |
187 | ImageFormatRg16i = 26, |
188 | ImageFormatRg8i = 27, |
189 | ImageFormatR16i = 28, |
190 | ImageFormatR8i = 29, |
191 | ImageFormatRgba32ui = 30, |
192 | ImageFormatRgba16ui = 31, |
193 | ImageFormatRgba8ui = 32, |
194 | ImageFormatR32ui = 33, |
195 | ImageFormatRgb10a2ui = 34, |
196 | ImageFormatRg32ui = 35, |
197 | ImageFormatRg16ui = 36, |
198 | ImageFormatRg8ui = 37, |
199 | ImageFormatR16ui = 38, |
200 | ImageFormatR8ui = 39 |
201 | }; |
202 | |
203 | enum ImageFlag { |
204 | ReadOnlyImage = 1 << 0, |
205 | WriteOnlyImage = 1 << 1 |
206 | }; |
207 | Q_DECLARE_FLAGS(ImageFlags, ImageFlag) |
208 | |
209 | // Optional data (like decorations) usually default to an otherwise invalid value (-1 or 0). This is intentional. |
210 | |
211 | struct InOutVariable { |
212 | QString name; |
213 | VariableType type = Unknown; |
214 | int location = -1; |
215 | int binding = -1; |
216 | int descriptorSet = -1; |
217 | ImageFormat imageFormat = ImageFormatUnknown; |
218 | ImageFlags imageFlags; |
219 | QVector<int> arrayDims; |
220 | }; |
221 | |
222 | struct BlockVariable { |
223 | QString name; |
224 | VariableType type = Unknown; |
225 | int offset = 0; |
226 | int size = 0; |
227 | QVector<int> arrayDims; |
228 | int arrayStride = 0; |
229 | int matrixStride = 0; |
230 | bool matrixIsRowMajor = false; |
231 | QVector<BlockVariable> structMembers; |
232 | }; |
233 | |
234 | struct UniformBlock { |
235 | QString blockName; |
236 | QString structName; // instanceName |
237 | int size = 0; |
238 | int binding = -1; |
239 | int descriptorSet = -1; |
240 | QVector<BlockVariable> members; |
241 | }; |
242 | |
243 | struct PushConstantBlock { |
244 | QString name; |
245 | int size = 0; |
246 | QVector<BlockVariable> members; |
247 | }; |
248 | |
249 | struct StorageBlock { |
250 | QString blockName; |
251 | QString instanceName; |
252 | int knownSize = 0; |
253 | int binding = -1; |
254 | int descriptorSet = -1; |
255 | QVector<BlockVariable> members; |
256 | }; |
257 | |
258 | QVector<InOutVariable> inputVariables() const; |
259 | QVector<InOutVariable> outputVariables() const; |
260 | QVector<UniformBlock> uniformBlocks() const; |
261 | QVector<PushConstantBlock> pushConstantBlocks() const; |
262 | QVector<StorageBlock> storageBlocks() const; |
263 | QVector<InOutVariable> combinedImageSamplers() const; |
264 | QVector<InOutVariable> storageImages() const; |
265 | |
266 | std::array<uint, 3> computeShaderLocalSize() const; |
267 | |
268 | private: |
269 | QShaderDescriptionPrivate *d; |
270 | friend struct QShaderDescriptionPrivate; |
271 | #ifndef QT_NO_DEBUG_STREAM |
272 | friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription &); |
273 | #endif |
274 | friend Q_GUI_EXPORT bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs) Q_DECL_NOTHROW; |
275 | }; |
276 | |
277 | Q_DECLARE_OPERATORS_FOR_FLAGS(QShaderDescription::ImageFlags) |
278 | |
279 | #ifndef QT_NO_DEBUG_STREAM |
280 | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription &); |
281 | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::InOutVariable &); |
282 | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::BlockVariable &); |
283 | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::UniformBlock &); |
284 | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::PushConstantBlock &); |
285 | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::StorageBlock &); |
286 | #endif |
287 | |
288 | Q_GUI_EXPORT bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs) Q_DECL_NOTHROW; |
289 | Q_GUI_EXPORT bool operator==(const QShaderDescription::InOutVariable &lhs, const QShaderDescription::InOutVariable &rhs) Q_DECL_NOTHROW; |
290 | Q_GUI_EXPORT bool operator==(const QShaderDescription::BlockVariable &lhs, const QShaderDescription::BlockVariable &rhs) Q_DECL_NOTHROW; |
291 | Q_GUI_EXPORT bool operator==(const QShaderDescription::UniformBlock &lhs, const QShaderDescription::UniformBlock &rhs) Q_DECL_NOTHROW; |
292 | Q_GUI_EXPORT bool operator==(const QShaderDescription::PushConstantBlock &lhs, const QShaderDescription::PushConstantBlock &rhs) Q_DECL_NOTHROW; |
293 | Q_GUI_EXPORT bool operator==(const QShaderDescription::StorageBlock &lhs, const QShaderDescription::StorageBlock &rhs) Q_DECL_NOTHROW; |
294 | |
295 | inline bool operator!=(const QShaderDescription &lhs, const QShaderDescription &rhs) Q_DECL_NOTHROW |
296 | { |
297 | return !(lhs == rhs); |
298 | } |
299 | |
300 | inline bool operator!=(const QShaderDescription::InOutVariable &lhs, const QShaderDescription::InOutVariable &rhs) Q_DECL_NOTHROW |
301 | { |
302 | return !(lhs == rhs); |
303 | } |
304 | |
305 | inline bool operator!=(const QShaderDescription::BlockVariable &lhs, const QShaderDescription::BlockVariable &rhs) Q_DECL_NOTHROW |
306 | { |
307 | return !(lhs == rhs); |
308 | } |
309 | |
310 | inline bool operator!=(const QShaderDescription::UniformBlock &lhs, const QShaderDescription::UniformBlock &rhs) Q_DECL_NOTHROW |
311 | { |
312 | return !(lhs == rhs); |
313 | } |
314 | |
315 | inline bool operator!=(const QShaderDescription::PushConstantBlock &lhs, const QShaderDescription::PushConstantBlock &rhs) Q_DECL_NOTHROW |
316 | { |
317 | return !(lhs == rhs); |
318 | } |
319 | |
320 | inline bool operator!=(const QShaderDescription::StorageBlock &lhs, const QShaderDescription::StorageBlock &rhs) Q_DECL_NOTHROW |
321 | { |
322 | return !(lhs == rhs); |
323 | } |
324 | |
325 | QT_END_NAMESPACE |
326 | |
327 | #endif |
328 | |