/src/qt/qtbase/src/gui/rhi/qshaderdescription.h
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (C) 2023 The Qt Company Ltd. |
2 | | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | | |
4 | | #ifndef QSHADERDESCRIPTION_H |
5 | | #define QSHADERDESCRIPTION_H |
6 | | |
7 | | // |
8 | | // W A R N I N G |
9 | | // ------------- |
10 | | // |
11 | | // This file is part of the RHI API, with limited compatibility guarantees. |
12 | | // Usage of this API may make your code source and binary incompatible with |
13 | | // future versions of Qt. |
14 | | // |
15 | | |
16 | | #include <QtGui/qtguiglobal.h> |
17 | | #include <QtCore/qstring.h> |
18 | | #include <QtCore/qlist.h> |
19 | | #include <array> |
20 | | |
21 | | QT_BEGIN_NAMESPACE |
22 | | |
23 | | struct QShaderDescriptionPrivate; |
24 | | class QDataStream; |
25 | | |
26 | | class Q_GUI_EXPORT QShaderDescription |
27 | | { |
28 | | public: |
29 | | QShaderDescription(); |
30 | | QShaderDescription(const QShaderDescription &other); |
31 | | QShaderDescription &operator=(const QShaderDescription &other); |
32 | | ~QShaderDescription(); |
33 | | void detach(); |
34 | | |
35 | | bool isValid() const; |
36 | | |
37 | | void serialize(QDataStream *stream, int version) const; |
38 | | QByteArray toJson() const; |
39 | | |
40 | | static QShaderDescription deserialize(QDataStream *stream, int version); |
41 | | |
42 | | enum VariableType { |
43 | | Unknown = 0, |
44 | | |
45 | | // do not reorder |
46 | | Float, |
47 | | Vec2, |
48 | | Vec3, |
49 | | Vec4, |
50 | | Mat2, |
51 | | Mat2x3, |
52 | | Mat2x4, |
53 | | Mat3, |
54 | | Mat3x2, |
55 | | Mat3x4, |
56 | | Mat4, |
57 | | Mat4x2, |
58 | | Mat4x3, |
59 | | |
60 | | Int, |
61 | | Int2, |
62 | | Int3, |
63 | | Int4, |
64 | | |
65 | | Uint, |
66 | | Uint2, |
67 | | Uint3, |
68 | | Uint4, |
69 | | |
70 | | Bool, |
71 | | Bool2, |
72 | | Bool3, |
73 | | Bool4, |
74 | | |
75 | | Double, |
76 | | Double2, |
77 | | Double3, |
78 | | Double4, |
79 | | DMat2, |
80 | | DMat2x3, |
81 | | DMat2x4, |
82 | | DMat3, |
83 | | DMat3x2, |
84 | | DMat3x4, |
85 | | DMat4, |
86 | | DMat4x2, |
87 | | DMat4x3, |
88 | | |
89 | | Sampler1D, |
90 | | Sampler2D, |
91 | | Sampler2DMS, |
92 | | Sampler3D, |
93 | | SamplerCube, |
94 | | Sampler1DArray, |
95 | | Sampler2DArray, |
96 | | Sampler2DMSArray, |
97 | | Sampler3DArray, |
98 | | SamplerCubeArray, |
99 | | SamplerRect, |
100 | | SamplerBuffer, |
101 | | SamplerExternalOES, |
102 | | Sampler, |
103 | | |
104 | | Image1D, |
105 | | Image2D, |
106 | | Image2DMS, |
107 | | Image3D, |
108 | | ImageCube, |
109 | | Image1DArray, |
110 | | Image2DArray, |
111 | | Image2DMSArray, |
112 | | Image3DArray, |
113 | | ImageCubeArray, |
114 | | ImageRect, |
115 | | ImageBuffer, |
116 | | |
117 | | Struct, |
118 | | |
119 | | Half, |
120 | | Half2, |
121 | | Half3, |
122 | | Half4 |
123 | | }; |
124 | | |
125 | | enum ImageFormat { |
126 | | // must match SPIR-V's ImageFormat |
127 | | ImageFormatUnknown = 0, |
128 | | ImageFormatRgba32f = 1, |
129 | | ImageFormatRgba16f = 2, |
130 | | ImageFormatR32f = 3, |
131 | | ImageFormatRgba8 = 4, |
132 | | ImageFormatRgba8Snorm = 5, |
133 | | ImageFormatRg32f = 6, |
134 | | ImageFormatRg16f = 7, |
135 | | ImageFormatR11fG11fB10f = 8, |
136 | | ImageFormatR16f = 9, |
137 | | ImageFormatRgba16 = 10, |
138 | | ImageFormatRgb10A2 = 11, |
139 | | ImageFormatRg16 = 12, |
140 | | ImageFormatRg8 = 13, |
141 | | ImageFormatR16 = 14, |
142 | | ImageFormatR8 = 15, |
143 | | ImageFormatRgba16Snorm = 16, |
144 | | ImageFormatRg16Snorm = 17, |
145 | | ImageFormatRg8Snorm = 18, |
146 | | ImageFormatR16Snorm = 19, |
147 | | ImageFormatR8Snorm = 20, |
148 | | ImageFormatRgba32i = 21, |
149 | | ImageFormatRgba16i = 22, |
150 | | ImageFormatRgba8i = 23, |
151 | | ImageFormatR32i = 24, |
152 | | ImageFormatRg32i = 25, |
153 | | ImageFormatRg16i = 26, |
154 | | ImageFormatRg8i = 27, |
155 | | ImageFormatR16i = 28, |
156 | | ImageFormatR8i = 29, |
157 | | ImageFormatRgba32ui = 30, |
158 | | ImageFormatRgba16ui = 31, |
159 | | ImageFormatRgba8ui = 32, |
160 | | ImageFormatR32ui = 33, |
161 | | ImageFormatRgb10a2ui = 34, |
162 | | ImageFormatRg32ui = 35, |
163 | | ImageFormatRg16ui = 36, |
164 | | ImageFormatRg8ui = 37, |
165 | | ImageFormatR16ui = 38, |
166 | | ImageFormatR8ui = 39 |
167 | | }; |
168 | | |
169 | | enum ImageFlag { |
170 | | ReadOnlyImage = 1 << 0, |
171 | | WriteOnlyImage = 1 << 1 |
172 | | }; |
173 | | Q_DECLARE_FLAGS(ImageFlags, ImageFlag) |
174 | | |
175 | | enum QualifierFlag { |
176 | | QualifierReadOnly = 1 << 0, |
177 | | QualifierWriteOnly = 1 << 1, |
178 | | QualifierCoherent = 1 << 2, |
179 | | QualifierVolatile = 1 << 3, |
180 | | QualifierRestrict = 1 << 4, |
181 | | }; |
182 | | Q_DECLARE_FLAGS(QualifierFlags, QualifierFlag) |
183 | | |
184 | | // Optional data (like decorations) usually default to an otherwise invalid value (-1 or 0). This is intentional. |
185 | | |
186 | | struct BlockVariable { |
187 | | QByteArray name; |
188 | | VariableType type = Unknown; |
189 | | int offset = 0; |
190 | | int size = 0; |
191 | | QList<int> arrayDims; |
192 | | int arrayStride = 0; |
193 | | int matrixStride = 0; |
194 | | bool matrixIsRowMajor = false; |
195 | | QList<BlockVariable> structMembers; |
196 | | }; |
197 | | |
198 | | struct InOutVariable { |
199 | | QByteArray name; |
200 | | VariableType type = Unknown; |
201 | | int location = -1; |
202 | | int binding = -1; |
203 | | int descriptorSet = -1; |
204 | | ImageFormat imageFormat = ImageFormatUnknown; |
205 | | ImageFlags imageFlags; |
206 | | QList<int> arrayDims; |
207 | | bool perPatch = false; |
208 | | QList<BlockVariable> structMembers; |
209 | | }; |
210 | | |
211 | | struct UniformBlock { |
212 | | QByteArray blockName; |
213 | | QByteArray structName; // instanceName |
214 | | int size = 0; |
215 | | int binding = -1; |
216 | | int descriptorSet = -1; |
217 | | QList<BlockVariable> members; |
218 | | }; |
219 | | |
220 | | struct PushConstantBlock { |
221 | | QByteArray name; |
222 | | int size = 0; |
223 | | QList<BlockVariable> members; |
224 | | }; |
225 | | |
226 | | struct StorageBlock { |
227 | | QByteArray blockName; |
228 | | QByteArray instanceName; |
229 | | int knownSize = 0; |
230 | | int binding = -1; |
231 | | int descriptorSet = -1; |
232 | | QList<BlockVariable> members; |
233 | | int runtimeArrayStride = 0; |
234 | | QualifierFlags qualifierFlags; |
235 | | }; |
236 | | |
237 | | QList<InOutVariable> inputVariables() const; |
238 | | QList<InOutVariable> outputVariables() const; |
239 | | QList<UniformBlock> uniformBlocks() const; |
240 | | QList<PushConstantBlock> pushConstantBlocks() const; |
241 | | QList<StorageBlock> storageBlocks() const; |
242 | | QList<InOutVariable> combinedImageSamplers() const; |
243 | | QList<InOutVariable> separateImages() const; |
244 | | QList<InOutVariable> separateSamplers() const; |
245 | | QList<InOutVariable> storageImages() const; |
246 | | |
247 | | enum BuiltinType { |
248 | | // must match SpvBuiltIn |
249 | | PositionBuiltin = 0, |
250 | | PointSizeBuiltin = 1, |
251 | | ClipDistanceBuiltin = 3, |
252 | | CullDistanceBuiltin = 4, |
253 | | VertexIdBuiltin = 5, |
254 | | InstanceIdBuiltin = 6, |
255 | | PrimitiveIdBuiltin = 7, |
256 | | InvocationIdBuiltin = 8, |
257 | | LayerBuiltin = 9, |
258 | | ViewportIndexBuiltin = 10, |
259 | | TessLevelOuterBuiltin = 11, |
260 | | TessLevelInnerBuiltin = 12, |
261 | | TessCoordBuiltin = 13, |
262 | | PatchVerticesBuiltin = 14, |
263 | | FragCoordBuiltin = 15, |
264 | | PointCoordBuiltin = 16, |
265 | | FrontFacingBuiltin = 17, |
266 | | SampleIdBuiltin = 18, |
267 | | SamplePositionBuiltin = 19, |
268 | | SampleMaskBuiltin = 20, |
269 | | FragDepthBuiltin = 22, |
270 | | NumWorkGroupsBuiltin = 24, |
271 | | WorkgroupSizeBuiltin = 25, |
272 | | WorkgroupIdBuiltin = 26, |
273 | | LocalInvocationIdBuiltin = 27, |
274 | | GlobalInvocationIdBuiltin = 28, |
275 | | LocalInvocationIndexBuiltin = 29, |
276 | | VertexIndexBuiltin = 42, |
277 | | InstanceIndexBuiltin = 43 |
278 | | }; |
279 | | |
280 | | struct BuiltinVariable { |
281 | | BuiltinType type; |
282 | | VariableType varType; |
283 | | QList<int> arrayDims; |
284 | | }; |
285 | | |
286 | | QList<BuiltinVariable> inputBuiltinVariables() const; |
287 | | QList<BuiltinVariable> outputBuiltinVariables() const; |
288 | | |
289 | | std::array<uint, 3> computeShaderLocalSize() const; |
290 | | |
291 | | uint tessellationOutputVertexCount() const; |
292 | | |
293 | | enum TessellationMode { |
294 | | UnknownTessellationMode, |
295 | | TrianglesTessellationMode, |
296 | | QuadTessellationMode, |
297 | | IsolineTessellationMode |
298 | | }; |
299 | | |
300 | | TessellationMode tessellationMode() const; |
301 | | |
302 | | enum TessellationWindingOrder { |
303 | | UnknownTessellationWindingOrder, |
304 | | CwTessellationWindingOrder, |
305 | | CcwTessellationWindingOrder |
306 | | }; |
307 | | |
308 | | TessellationWindingOrder tessellationWindingOrder() const; |
309 | | |
310 | | enum TessellationPartitioning { |
311 | | UnknownTessellationPartitioning, |
312 | | EqualTessellationPartitioning, |
313 | | FractionalEvenTessellationPartitioning, |
314 | | FractionalOddTessellationPartitioning |
315 | | }; |
316 | | |
317 | | TessellationPartitioning tessellationPartitioning() const; |
318 | | |
319 | | private: |
320 | | QShaderDescriptionPrivate *d; |
321 | | friend struct QShaderDescriptionPrivate; |
322 | | #ifndef QT_NO_DEBUG_STREAM |
323 | | friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription &); |
324 | | #endif |
325 | | friend Q_GUI_EXPORT bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs) noexcept; |
326 | | }; |
327 | | |
328 | | Q_DECLARE_OPERATORS_FOR_FLAGS(QShaderDescription::ImageFlags) |
329 | | Q_DECLARE_OPERATORS_FOR_FLAGS(QShaderDescription::QualifierFlags) |
330 | | |
331 | | #ifndef QT_NO_DEBUG_STREAM |
332 | | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription &); |
333 | | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::InOutVariable &); |
334 | | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::BlockVariable &); |
335 | | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::UniformBlock &); |
336 | | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::PushConstantBlock &); |
337 | | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::StorageBlock &); |
338 | | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShaderDescription::BuiltinVariable &); |
339 | | #endif |
340 | | |
341 | | Q_GUI_EXPORT bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs) noexcept; |
342 | | Q_GUI_EXPORT bool operator==(const QShaderDescription::InOutVariable &lhs, const QShaderDescription::InOutVariable &rhs) noexcept; |
343 | | Q_GUI_EXPORT bool operator==(const QShaderDescription::BlockVariable &lhs, const QShaderDescription::BlockVariable &rhs) noexcept; |
344 | | Q_GUI_EXPORT bool operator==(const QShaderDescription::UniformBlock &lhs, const QShaderDescription::UniformBlock &rhs) noexcept; |
345 | | Q_GUI_EXPORT bool operator==(const QShaderDescription::PushConstantBlock &lhs, const QShaderDescription::PushConstantBlock &rhs) noexcept; |
346 | | Q_GUI_EXPORT bool operator==(const QShaderDescription::StorageBlock &lhs, const QShaderDescription::StorageBlock &rhs) noexcept; |
347 | | Q_GUI_EXPORT bool operator==(const QShaderDescription::BuiltinVariable &lhs, const QShaderDescription::BuiltinVariable &rhs) noexcept; |
348 | | |
349 | | inline bool operator!=(const QShaderDescription &lhs, const QShaderDescription &rhs) noexcept |
350 | 0 | { |
351 | 0 | return !(lhs == rhs); |
352 | 0 | } |
353 | | |
354 | | inline bool operator!=(const QShaderDescription::InOutVariable &lhs, const QShaderDescription::InOutVariable &rhs) noexcept |
355 | 0 | { |
356 | 0 | return !(lhs == rhs); |
357 | 0 | } |
358 | | |
359 | | inline bool operator!=(const QShaderDescription::BlockVariable &lhs, const QShaderDescription::BlockVariable &rhs) noexcept |
360 | 0 | { |
361 | 0 | return !(lhs == rhs); |
362 | 0 | } |
363 | | |
364 | | inline bool operator!=(const QShaderDescription::UniformBlock &lhs, const QShaderDescription::UniformBlock &rhs) noexcept |
365 | 0 | { |
366 | 0 | return !(lhs == rhs); |
367 | 0 | } |
368 | | |
369 | | inline bool operator!=(const QShaderDescription::PushConstantBlock &lhs, const QShaderDescription::PushConstantBlock &rhs) noexcept |
370 | 0 | { |
371 | 0 | return !(lhs == rhs); |
372 | 0 | } |
373 | | |
374 | | inline bool operator!=(const QShaderDescription::StorageBlock &lhs, const QShaderDescription::StorageBlock &rhs) noexcept |
375 | 0 | { |
376 | 0 | return !(lhs == rhs); |
377 | 0 | } |
378 | | |
379 | | inline bool operator!=(const QShaderDescription::BuiltinVariable &lhs, const QShaderDescription::BuiltinVariable &rhs) noexcept |
380 | 0 | { |
381 | 0 | return !(lhs == rhs); |
382 | 0 | } |
383 | | |
384 | | QT_END_NAMESPACE |
385 | | |
386 | | #endif |