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 QSHADER_H |
5 | #define QSHADER_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/qhash.h> |
18 | #include <QtCore/qmap.h> |
19 | #include <rhi/qshaderdescription.h> |
20 | |
21 | QT_BEGIN_NAMESPACE |
22 | |
23 | struct QShaderPrivate; |
24 | class QShaderKey; |
25 | |
26 | #ifdef Q_OS_INTEGRITY |
27 | class QShaderVersion; |
28 | size_t qHash(const QShaderVersion &, size_t = 0) noexcept; |
29 | #endif |
30 | |
31 | class Q_GUI_EXPORT QShaderVersion |
32 | { |
33 | public: |
34 | enum Flag { |
35 | GlslEs = 0x01 |
36 | }; |
37 | Q_DECLARE_FLAGS(Flags, Flag) |
38 | |
39 | QShaderVersion() = default; |
40 | QShaderVersion(int v, Flags f = Flags()); |
41 | |
42 | int version() const { return m_version; } |
43 | void setVersion(int v) { m_version = v; } |
44 | |
45 | Flags flags() const { return m_flags; } |
46 | void setFlags(Flags f) { m_flags = f; } |
47 | |
48 | private: |
49 | int m_version = 100; |
50 | Flags m_flags; |
51 | }; |
52 | |
53 | Q_DECLARE_OPERATORS_FOR_FLAGS(QShaderVersion::Flags) |
54 | Q_DECLARE_TYPEINFO(QShaderVersion, Q_RELOCATABLE_TYPE); |
55 | |
56 | class QShaderCode; |
57 | Q_GUI_EXPORT size_t qHash(const QShaderCode &, size_t = 0) noexcept; |
58 | |
59 | class Q_GUI_EXPORT QShaderCode |
60 | { |
61 | public: |
62 | QShaderCode() = default; |
63 | QShaderCode(const QByteArray &code, const QByteArray &entry = QByteArray()); |
64 | |
65 | QByteArray shader() const { return m_shader; } |
66 | void setShader(const QByteArray &code) { m_shader = code; } |
67 | |
68 | QByteArray entryPoint() const { return m_entryPoint; } |
69 | void setEntryPoint(const QByteArray &entry) { m_entryPoint = entry; } |
70 | |
71 | private: |
72 | friend Q_GUI_EXPORT size_t qHash(const QShaderCode &, size_t) noexcept; |
73 | |
74 | QByteArray m_shader; |
75 | QByteArray m_entryPoint; |
76 | }; |
77 | |
78 | Q_DECLARE_TYPEINFO(QShaderCode, Q_RELOCATABLE_TYPE); |
79 | |
80 | class Q_GUI_EXPORT QShader |
81 | { |
82 | public: |
83 | enum Stage { |
84 | VertexStage = 0, |
85 | TessellationControlStage, |
86 | TessellationEvaluationStage, |
87 | GeometryStage, |
88 | FragmentStage, |
89 | ComputeStage |
90 | }; |
91 | |
92 | enum Source { |
93 | SpirvShader = 0, |
94 | GlslShader, |
95 | HlslShader, |
96 | DxbcShader, // fxc |
97 | MslShader, |
98 | DxilShader, // dxc |
99 | MetalLibShader, // xcrun metal + xcrun metallib |
100 | WgslShader |
101 | }; |
102 | |
103 | enum Variant { |
104 | StandardShader = 0, |
105 | BatchableVertexShader, |
106 | UInt16IndexedVertexAsComputeShader, |
107 | UInt32IndexedVertexAsComputeShader, |
108 | NonIndexedVertexAsComputeShader |
109 | }; |
110 | |
111 | enum class SerializedFormatVersion { |
112 | Latest = 0, |
113 | Qt_6_5, |
114 | Qt_6_4 |
115 | }; |
116 | |
117 | QShader(); |
118 | QShader(const QShader &other); |
119 | QShader &operator=(const QShader &other); |
120 | QShader(QShader &&other) noexcept : d(std::exchange(obj&: other.d, new_val: nullptr)) {} |
121 | QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QShader) |
122 | ~QShader(); |
123 | |
124 | void swap(QShader &other) noexcept { qt_ptr_swap(lhs&: d, rhs&: other.d); } |
125 | void detach(); |
126 | |
127 | bool isValid() const; |
128 | |
129 | Stage stage() const; |
130 | void setStage(Stage stage); |
131 | |
132 | QShaderDescription description() const; |
133 | void setDescription(const QShaderDescription &desc); |
134 | |
135 | QList<QShaderKey> availableShaders() const; |
136 | QShaderCode shader(const QShaderKey &key) const; |
137 | void setShader(const QShaderKey &key, const QShaderCode &shader); |
138 | void removeShader(const QShaderKey &key); |
139 | |
140 | QByteArray serialized(SerializedFormatVersion version = SerializedFormatVersion::Latest) const; |
141 | static QShader fromSerialized(const QByteArray &data); |
142 | |
143 | using NativeResourceBindingMap = QMap<int, QPair<int, int> >; // binding -> native_binding[, native_binding] |
144 | NativeResourceBindingMap nativeResourceBindingMap(const QShaderKey &key) const; |
145 | void setResourceBindingMap(const QShaderKey &key, const NativeResourceBindingMap &map); |
146 | void removeResourceBindingMap(const QShaderKey &key); |
147 | |
148 | struct SeparateToCombinedImageSamplerMapping { |
149 | QByteArray combinedSamplerName; |
150 | int textureBinding; |
151 | int samplerBinding; |
152 | }; |
153 | using SeparateToCombinedImageSamplerMappingList = QList<SeparateToCombinedImageSamplerMapping>; |
154 | SeparateToCombinedImageSamplerMappingList separateToCombinedImageSamplerMappingList(const QShaderKey &key) const; |
155 | void setSeparateToCombinedImageSamplerMappingList(const QShaderKey &key, |
156 | const SeparateToCombinedImageSamplerMappingList &list); |
157 | void removeSeparateToCombinedImageSamplerMappingList(const QShaderKey &key); |
158 | |
159 | struct NativeShaderInfo { |
160 | int flags = 0; |
161 | QMap<int, int> extraBufferBindings; |
162 | }; |
163 | NativeShaderInfo nativeShaderInfo(const QShaderKey &key) const; |
164 | void setNativeShaderInfo(const QShaderKey &key, const NativeShaderInfo &info); |
165 | void removeNativeShaderInfo(const QShaderKey &key); |
166 | |
167 | private: |
168 | QShaderPrivate *d; |
169 | friend struct QShaderPrivate; |
170 | friend Q_GUI_EXPORT bool operator==(const QShader &, const QShader &) noexcept; |
171 | friend Q_GUI_EXPORT size_t qHash(const QShader &, size_t) noexcept; |
172 | #ifndef QT_NO_DEBUG_STREAM |
173 | friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QShader &); |
174 | #endif |
175 | }; |
176 | |
177 | class Q_GUI_EXPORT QShaderKey |
178 | { |
179 | public: |
180 | QShaderKey() = default; |
181 | QShaderKey(QShader::Source s, |
182 | const QShaderVersion &sver, |
183 | QShader::Variant svar = QShader::StandardShader); |
184 | |
185 | QShader::Source source() const { return m_source; } |
186 | void setSource(QShader::Source s) { m_source = s; } |
187 | |
188 | QShaderVersion sourceVersion() const { return m_sourceVersion; } |
189 | void setSourceVersion(const QShaderVersion &sver) { m_sourceVersion = sver; } |
190 | |
191 | QShader::Variant sourceVariant() const { return m_sourceVariant; } |
192 | void setSourceVariant(QShader::Variant svar) { m_sourceVariant = svar; } |
193 | |
194 | private: |
195 | QShader::Source m_source = QShader::SpirvShader; |
196 | QShaderVersion m_sourceVersion; |
197 | QShader::Variant m_sourceVariant = QShader::StandardShader; |
198 | }; |
199 | |
200 | Q_DECLARE_TYPEINFO(QShaderKey, Q_RELOCATABLE_TYPE); |
201 | |
202 | Q_GUI_EXPORT bool operator==(const QShader &lhs, const QShader &rhs) noexcept; |
203 | Q_GUI_EXPORT size_t qHash(const QShader &s, size_t seed = 0) noexcept; |
204 | |
205 | inline bool operator!=(const QShader &lhs, const QShader &rhs) noexcept |
206 | { |
207 | return !(lhs == rhs); |
208 | } |
209 | |
210 | Q_GUI_EXPORT bool operator==(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept; |
211 | Q_GUI_EXPORT bool operator<(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept; |
212 | Q_GUI_EXPORT bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) noexcept; |
213 | Q_GUI_EXPORT bool operator<(const QShaderKey &lhs, const QShaderKey &rhs) noexcept; |
214 | Q_GUI_EXPORT bool operator==(const QShaderCode &lhs, const QShaderCode &rhs) noexcept; |
215 | |
216 | inline bool operator!=(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept |
217 | { |
218 | return !(lhs == rhs); |
219 | } |
220 | |
221 | inline bool operator!=(const QShaderKey &lhs, const QShaderKey &rhs) noexcept |
222 | { |
223 | return !(lhs == rhs); |
224 | } |
225 | |
226 | inline bool operator!=(const QShaderCode &lhs, const QShaderCode &rhs) noexcept |
227 | { |
228 | return !(lhs == rhs); |
229 | } |
230 | |
231 | Q_GUI_EXPORT size_t qHash(const QShaderKey &k, size_t seed = 0) noexcept; |
232 | |
233 | #ifndef QT_NO_DEBUG_STREAM |
234 | Q_GUI_EXPORT QDebug operator<<(QDebug, const QShader &); |
235 | Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QShaderKey &k); |
236 | Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QShaderVersion &v); |
237 | #endif |
238 | |
239 | QT_END_NAMESPACE |
240 | |
241 | #endif |
242 |
Definitions
- QShaderVersion
- Flag
- QShaderVersion
- version
- setVersion
- flags
- setFlags
- QShaderCode
- QShaderCode
- shader
- setShader
- entryPoint
- setEntryPoint
- QShader
- Stage
- Source
- Variant
- SerializedFormatVersion
- QShader
- swap
- SeparateToCombinedImageSamplerMapping
- NativeShaderInfo
- QShaderKey
- QShaderKey
- source
- setSource
- sourceVersion
- setSourceVersion
- sourceVariant
- setSourceVariant
- operator!=
- operator!=
- operator!=
Start learning QML with our Intro Training
Find out more