Coverage Report

Created: 2026-09-28 08:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/qtbase/src/gui/rhi/qshader.h
Line
Count
Source
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
// Qt-Security score:significant reason:default
4
5
#ifndef QSHADER_H
6
#define QSHADER_H
7
8
//
9
//  W A R N I N G
10
//  -------------
11
//
12
// This file is part of the RHI API, with limited compatibility guarantees.
13
// Usage of this API may make your code source and binary incompatible with
14
// future versions of Qt.
15
//
16
17
#include <QtGui/qtguiglobal.h>
18
#include <QtCore/qhash.h>
19
#include <QtCore/qmap.h>
20
#include <rhi/qshaderdescription.h>
21
22
QT_BEGIN_NAMESPACE
23
24
struct QShaderPrivate;
25
class QShaderKey;
26
27
class Q_GUI_EXPORT QShaderVersion
28
{
29
public:
30
    enum Flag {
31
        GlslEs = 0x01
32
    };
33
    Q_DECLARE_FLAGS(Flags, Flag)
34
35
0
    QShaderVersion() = default;
36
    QShaderVersion(int v, Flags f = Flags());
37
38
0
    int version() const { return m_version; }
39
0
    void setVersion(int v) { m_version = v; }
40
41
0
    Flags flags() const { return m_flags; }
42
0
    void setFlags(Flags f) { m_flags = f; }
43
44
private:
45
    Q_GUI_EXPORT friend size_t qHash(QShaderVersion key, size_t seed) noexcept;
46
0
    friend size_t qHash(QShaderVersion key) noexcept { return qHash(key, size_t{0}); }
47
    #define QSHADERVERSION_IS_HASHABLE
48
49
    int m_version = 100;
50
    Flags m_flags;
51
};
52
53
0
Q_DECLARE_OPERATORS_FOR_FLAGS(QShaderVersion::Flags)
Unexecuted instantiation: operator|(QShaderVersion::Flag, QShaderVersion::Flag)
Unexecuted instantiation: operator|(QShaderVersion::Flag, QFlags<QShaderVersion::Flag>)
Unexecuted instantiation: operator&(QShaderVersion::Flag, QShaderVersion::Flag)
Unexecuted instantiation: operator&(QShaderVersion::Flag, QFlags<QShaderVersion::Flag>)
Unexecuted instantiation: operator^(QShaderVersion::Flag, QShaderVersion::Flag)
Unexecuted instantiation: operator^(QShaderVersion::Flag, QFlags<QShaderVersion::Flag>)
Unexecuted instantiation: operator|(QShaderVersion::Flag, int)
54
0
Q_DECLARE_TYPEINFO(QShaderVersion, Q_RELOCATABLE_TYPE);
55
0
56
0
class QShaderCode;
57
0
Q_GUI_EXPORT size_t qHash(const QShaderCode &, size_t = 0) noexcept;
58
0
59
0
class Q_GUI_EXPORT QShaderCode
60
0
{
61
0
public:
62
0
    QShaderCode() = default;
63
    QShaderCode(const QByteArray &code, const QByteArray &entry = QByteArray());
64
65
0
    QByteArray shader() const { return m_shader; }
66
0
    void setShader(const QByteArray &code) { m_shader = code; }
67
68
0
    QByteArray entryPoint() const { return m_entryPoint; }
69
0
    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
        HdrCapableFragmentShader,
110
        ArgumentBufferShader
111
    };
112
113
    enum class SerializedFormatVersion {
114
        Latest = 0,
115
        Qt_6_5,
116
        Qt_6_4
117
    };
118
119
    QShader();
120
    QShader(const QShader &other);
121
    QShader &operator=(const QShader &other);
122
0
    QShader(QShader &&other) noexcept : d(std::exchange(other.d, nullptr)) {}
123
0
    QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QShader)
124
0
    ~QShader();
125
0
126
0
    void swap(QShader &other) noexcept { qt_ptr_swap(d, other.d); }
127
    void detach();
128
129
    bool isValid() const;
130
131
    Stage stage() const;
132
    void setStage(Stage stage);
133
134
    QShaderDescription description() const;
135
    void setDescription(const QShaderDescription &desc);
136
137
    QList<QShaderKey> availableShaders() const;
138
    QShaderCode shader(const QShaderKey &key) const;
139
    void setShader(const QShaderKey &key, const QShaderCode &shader);
140
    void removeShader(const QShaderKey &key);
141
142
    QByteArray serialized(SerializedFormatVersion version = SerializedFormatVersion::Latest) const;
143
    static QShader fromSerialized(const QByteArray &data);
144
145
    using NativeResourceBindingMap = QMap<int, std::pair<int, int>>; // binding -> native_binding[, native_binding]
146
    NativeResourceBindingMap nativeResourceBindingMap(const QShaderKey &key) const;
147
    void setResourceBindingMap(const QShaderKey &key, const NativeResourceBindingMap &map);
148
    void removeResourceBindingMap(const QShaderKey &key);
149
150
    struct SeparateToCombinedImageSamplerMapping {
151
        QByteArray combinedSamplerName;
152
        int textureBinding;
153
        int samplerBinding;
154
    };
155
    using SeparateToCombinedImageSamplerMappingList = QList<SeparateToCombinedImageSamplerMapping>;
156
    SeparateToCombinedImageSamplerMappingList separateToCombinedImageSamplerMappingList(const QShaderKey &key) const;
157
    void setSeparateToCombinedImageSamplerMappingList(const QShaderKey &key,
158
                                                      const SeparateToCombinedImageSamplerMappingList &list);
159
    void removeSeparateToCombinedImageSamplerMappingList(const QShaderKey &key);
160
161
    struct NativeShaderInfo {
162
        int flags = 0;
163
        QMap<int, int> extraBufferBindings;
164
    };
165
    NativeShaderInfo nativeShaderInfo(const QShaderKey &key) const;
166
    void setNativeShaderInfo(const QShaderKey &key, const NativeShaderInfo &info);
167
    void removeNativeShaderInfo(const QShaderKey &key);
168
169
private:
170
    QShaderPrivate *d;
171
    friend struct QShaderPrivate;
172
    friend Q_GUI_EXPORT bool operator==(const QShader &, const QShader &) noexcept;
173
    friend Q_GUI_EXPORT size_t qHash(const QShader &, size_t) noexcept;
174
#ifndef QT_NO_DEBUG_STREAM
175
    friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QShader &);
176
#endif
177
};
178
179
0
Q_DECLARE_SHARED(QShader)
180
0
181
0
class Q_GUI_EXPORT QShaderKey
182
0
{
183
0
public:
184
0
    QShaderKey() = default;
185
    QShaderKey(QShader::Source s,
186
               const QShaderVersion &sver,
187
               QShader::Variant svar = QShader::StandardShader);
188
189
0
    QShader::Source source() const { return m_source; }
190
0
    void setSource(QShader::Source s) { m_source = s; }
191
192
0
    QShaderVersion sourceVersion() const { return m_sourceVersion; }
193
0
    void setSourceVersion(const QShaderVersion &sver) { m_sourceVersion = sver; }
194
195
0
    QShader::Variant sourceVariant() const { return m_sourceVariant; }
196
0
    void setSourceVariant(QShader::Variant svar) { m_sourceVariant = svar; }
197
198
private:
199
    QShader::Source m_source = QShader::SpirvShader;
200
    QShaderVersion m_sourceVersion;
201
    QShader::Variant m_sourceVariant = QShader::StandardShader;
202
};
203
204
Q_DECLARE_TYPEINFO(QShaderKey, Q_RELOCATABLE_TYPE);
205
206
Q_GUI_EXPORT bool operator==(const QShader &lhs, const QShader &rhs) noexcept;
207
Q_GUI_EXPORT size_t qHash(const QShader &s, size_t seed = 0) noexcept;
208
209
inline bool operator!=(const QShader &lhs, const QShader &rhs) noexcept
210
0
{
211
0
    return !(lhs == rhs);
212
0
}
213
214
Q_GUI_EXPORT bool operator==(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept;
215
Q_GUI_EXPORT bool operator<(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept;
216
Q_GUI_EXPORT bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) noexcept;
217
Q_GUI_EXPORT bool operator<(const QShaderKey &lhs, const QShaderKey &rhs) noexcept;
218
Q_GUI_EXPORT bool operator==(const QShaderCode &lhs, const QShaderCode &rhs) noexcept;
219
220
inline bool operator!=(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept
221
0
{
222
0
    return !(lhs == rhs);
223
0
}
224
225
inline bool operator!=(const QShaderKey &lhs, const QShaderKey &rhs) noexcept
226
0
{
227
0
    return !(lhs == rhs);
228
0
}
229
230
inline bool operator!=(const QShaderCode &lhs, const QShaderCode &rhs) noexcept
231
0
{
232
0
    return !(lhs == rhs);
233
0
}
234
235
Q_GUI_EXPORT size_t qHash(const QShaderKey &k, size_t seed = 0) noexcept;
236
237
#ifndef QT_NO_DEBUG_STREAM
238
Q_GUI_EXPORT QDebug operator<<(QDebug, const QShader &);
239
Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QShaderKey &k);
240
Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QShaderVersion &v);
241
#endif
242
243
QT_END_NAMESPACE
244
245
#endif