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
56QT_BEGIN_NAMESPACE
57
58struct QShaderDescriptionPrivate;
59class QDataStream;
60
61class Q_GUI_EXPORT QShaderDescription
62{
63public:
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
268private:
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
277Q_DECLARE_OPERATORS_FOR_FLAGS(QShaderDescription::ImageFlags)
278
279#ifndef QT_NO_DEBUG_STREAM
280Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription &);
281Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::InOutVariable &);
282Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::BlockVariable &);
283Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::UniformBlock &);
284Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::PushConstantBlock &);
285Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::StorageBlock &);
286#endif
287
288Q_GUI_EXPORT bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs) Q_DECL_NOTHROW;
289Q_GUI_EXPORT bool operator==(const QShaderDescription::InOutVariable &lhs, const QShaderDescription::InOutVariable &rhs) Q_DECL_NOTHROW;
290Q_GUI_EXPORT bool operator==(const QShaderDescription::BlockVariable &lhs, const QShaderDescription::BlockVariable &rhs) Q_DECL_NOTHROW;
291Q_GUI_EXPORT bool operator==(const QShaderDescription::UniformBlock &lhs, const QShaderDescription::UniformBlock &rhs) Q_DECL_NOTHROW;
292Q_GUI_EXPORT bool operator==(const QShaderDescription::PushConstantBlock &lhs, const QShaderDescription::PushConstantBlock &rhs) Q_DECL_NOTHROW;
293Q_GUI_EXPORT bool operator==(const QShaderDescription::StorageBlock &lhs, const QShaderDescription::StorageBlock &rhs) Q_DECL_NOTHROW;
294
295inline bool operator!=(const QShaderDescription &lhs, const QShaderDescription &rhs) Q_DECL_NOTHROW
296{
297 return !(lhs == rhs);
298}
299
300inline bool operator!=(const QShaderDescription::InOutVariable &lhs, const QShaderDescription::InOutVariable &rhs) Q_DECL_NOTHROW
301{
302 return !(lhs == rhs);
303}
304
305inline bool operator!=(const QShaderDescription::BlockVariable &lhs, const QShaderDescription::BlockVariable &rhs) Q_DECL_NOTHROW
306{
307 return !(lhs == rhs);
308}
309
310inline bool operator!=(const QShaderDescription::UniformBlock &lhs, const QShaderDescription::UniformBlock &rhs) Q_DECL_NOTHROW
311{
312 return !(lhs == rhs);
313}
314
315inline bool operator!=(const QShaderDescription::PushConstantBlock &lhs, const QShaderDescription::PushConstantBlock &rhs) Q_DECL_NOTHROW
316{
317 return !(lhs == rhs);
318}
319
320inline bool operator!=(const QShaderDescription::StorageBlock &lhs, const QShaderDescription::StorageBlock &rhs) Q_DECL_NOTHROW
321{
322 return !(lhs == rhs);
323}
324
325QT_END_NAMESPACE
326
327#endif
328

source code of qtbase/src/gui/rhi/qshaderdescription_p.h