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
21QT_BEGIN_NAMESPACE
22
23struct QShaderPrivate;
24class QShaderKey;
25
26#ifdef Q_OS_INTEGRITY
27 class QShaderVersion;
28 size_t qHash(const QShaderVersion &, size_t = 0) noexcept;
29#endif
30
31class Q_GUI_EXPORT QShaderVersion
32{
33public:
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
48private:
49 int m_version = 100;
50 Flags m_flags;
51};
52
53Q_DECLARE_OPERATORS_FOR_FLAGS(QShaderVersion::Flags)
54Q_DECLARE_TYPEINFO(QShaderVersion, Q_RELOCATABLE_TYPE);
55
56class QShaderCode;
57Q_GUI_EXPORT size_t qHash(const QShaderCode &, size_t = 0) noexcept;
58
59class Q_GUI_EXPORT QShaderCode
60{
61public:
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
71private:
72 friend Q_GUI_EXPORT size_t qHash(const QShaderCode &, size_t) noexcept;
73
74 QByteArray m_shader;
75 QByteArray m_entryPoint;
76};
77
78Q_DECLARE_TYPEINFO(QShaderCode, Q_RELOCATABLE_TYPE);
79
80class Q_GUI_EXPORT QShader
81{
82public:
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
167private:
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
177class Q_GUI_EXPORT QShaderKey
178{
179public:
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
194private:
195 QShader::Source m_source = QShader::SpirvShader;
196 QShaderVersion m_sourceVersion;
197 QShader::Variant m_sourceVariant = QShader::StandardShader;
198};
199
200Q_DECLARE_TYPEINFO(QShaderKey, Q_RELOCATABLE_TYPE);
201
202Q_GUI_EXPORT bool operator==(const QShader &lhs, const QShader &rhs) noexcept;
203Q_GUI_EXPORT size_t qHash(const QShader &s, size_t seed = 0) noexcept;
204
205inline bool operator!=(const QShader &lhs, const QShader &rhs) noexcept
206{
207 return !(lhs == rhs);
208}
209
210Q_GUI_EXPORT bool operator==(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept;
211Q_GUI_EXPORT bool operator<(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept;
212Q_GUI_EXPORT bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) noexcept;
213Q_GUI_EXPORT bool operator<(const QShaderKey &lhs, const QShaderKey &rhs) noexcept;
214Q_GUI_EXPORT bool operator==(const QShaderCode &lhs, const QShaderCode &rhs) noexcept;
215
216inline bool operator!=(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept
217{
218 return !(lhs == rhs);
219}
220
221inline bool operator!=(const QShaderKey &lhs, const QShaderKey &rhs) noexcept
222{
223 return !(lhs == rhs);
224}
225
226inline bool operator!=(const QShaderCode &lhs, const QShaderCode &rhs) noexcept
227{
228 return !(lhs == rhs);
229}
230
231Q_GUI_EXPORT size_t qHash(const QShaderKey &k, size_t seed = 0) noexcept;
232
233#ifndef QT_NO_DEBUG_STREAM
234Q_GUI_EXPORT QDebug operator<<(QDebug, const QShader &);
235Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QShaderKey &k);
236Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QShaderVersion &v);
237#endif
238
239QT_END_NAMESPACE
240
241#endif
242

Provided by KDAB

Privacy Policy
Start learning QML with our Intro Training
Find out more

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