Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qssgrendershadercodegenerator_p.h
Go to the documentation of this file.
1// Copyright (C) 2008-2012 NVIDIA Corporation.
2// Copyright (C) 2019 The Qt Company Ltd.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
4// Qt-Security score:significant reason:default
5
6
7#ifndef QSSG_RENDER_SHADER_CODE_GENERATOR_V2_H
8#define QSSG_RENDER_SHADER_CODE_GENERATOR_V2_H
9
10//
11// W A R N I N G
12// -------------
13//
14// This file is not part of the Qt API. It exists purely as an
15// implementation detail. This header file may change from version to
16// version without notice, or even be removed.
17//
18// We mean it.
19//
20
21#include <QtQuick3DRuntimeRender/private/qtquick3druntimerenderglobal_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
23
24#include <QtCore/qstring.h>
25
26QT_BEGIN_NAMESPACE
27
28enum class QSSGShaderGeneratorStage
29{
30 None = 0,
31 Vertex = 1,
32 Fragment = 1 << 1,
33 Compute = 1 << 2,
34 StageCount = 3,
35};
36
37Q_DECLARE_FLAGS(QSSGShaderGeneratorStageFlags, QSSGShaderGeneratorStage)
38Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGShaderGeneratorStageFlags)
39
40struct QSSGStageGeneratorBase;
42class QSSGShaderLibraryManager;
43
44class QSSGShaderResourceMergeContext;
45
46struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGStageGeneratorBase
47{
48 enum class ShaderItemType {
49 VertexInput,
50 Input,
51 Output,
52 Uniform,
53 Image
54 };
55
56 enum class ShaderItemMapFlag {
57 Flat = 0x01
58 };
59 Q_DECLARE_FLAGS(ShaderItemMapFlags, ShaderItemMapFlag)
60
61 // Using QMap intentionally - being sorted by key when iterating is helpful
62 // to get the same ordered list of vertex inputs, uniforms, etc. on every
63 // run, which in turn helps shader (disk) cache efficiency due to not
64 // generating a different shader string just because QHash decided to
65 // iterate entries in a different order.
66 typedef QMap<QByteArray, QByteArray> TStrTableStrMap;
67 typedef QMap<QByteArray, QPair<quint32, QByteArray>> TStrTableSizedStrMap;
68
69 typedef QPair<QByteArray, QByteArray> TParamPair;
70 typedef QPair<QByteArray, TParamPair> TConstantBufferParamPair;
71 typedef QVector<TConstantBufferParamPair> TConstantBufferParamArray;
72
73 TStrTableStrMap m_incoming;
74 TStrTableStrMap *m_outgoing = nullptr;
75 TStrTableStrMap m_flatIncoming;
76 TStrTableStrMap *m_flatOutgoing = nullptr;
77 QSet<QByteArray> m_includes;
78 QList<QByteArray> m_prefixes;
79 TStrTableStrMap m_uniforms;
80 TStrTableSizedStrMap m_uniformArrays;
81 TStrTableStrMap m_constantBuffers;
82 TConstantBufferParamArray m_constantBufferParams;
83 QByteArray m_codeBuilder;
84 QByteArray m_finalBuilder;
85 QSSGShaderGeneratorStage m_stage;
86 QSSGShaderGeneratorStageFlags m_enabledStages;
87 QList<QByteArray> m_addedFunctions;
88 TStrTableStrMap m_addedTypeDeclarations;
89 TStrTableStrMap m_addedDefinitions;
90
91 struct Buffer
92 {
93 Buffer() = default;
94 Buffer(const QByteArray &name, const QByteArray &contentType, QSSGMemoryQualifiers qualifiers, const QByteArray &condition)
95 : name(name), contentType(contentType), qualifiers(qualifiers), condition(condition) {}
96 QByteArray name;
97 QByteArray contentType;
98 QSSGMemoryQualifiers qualifiers;
99 QByteArray condition;
100 };
101 struct Image
102 {
103 Image() = default;
104 Image(const QByteArray &name, const QByteArray &imageType, const QByteArray &format, QSSGMemoryQualifiers qualifiers, const QByteArray &condition)
105 : name(name), imageType(imageType), format(format), qualifiers(qualifiers), condition(condition) {}
106 QByteArray name;
107 QByteArray imageType;
108 QByteArray format;
109 QSSGMemoryQualifiers qualifiers;
110 QByteArray condition;
111 };
112
113 std::vector<Image> m_images;
114 std::vector<Buffer> m_buffers;
115 QSSGShaderResourceMergeContext *m_mergeContext = nullptr;
116
117 explicit QSSGStageGeneratorBase(QSSGShaderGeneratorStage inStage);
118 virtual ~QSSGStageGeneratorBase() = default;
119
120 virtual void begin(QSSGShaderGeneratorStageFlags inEnabledStages);
121
122 virtual void addIncoming(const QByteArray &name, const QByteArray &type);
123 virtual void addOutgoing(const QByteArray &name, const QByteArray &type);
124
125 virtual void addFlatIncoming(const QByteArray &name, const QByteArray &type);
126 virtual void addFlatOutgoing(const QByteArray &name, const QByteArray &type);
127
128 virtual void addUniform(const QByteArray &name, const QByteArray &type);
129
130 virtual void addUniformArray(const QByteArray &name, const QByteArray &type, quint32 size);
131
132 virtual void addConstantBuffer(const QByteArray &name, const QByteArray &layout);
133 virtual void addConstantBufferParam(const QByteArray &cbName, const QByteArray &paramName, const QByteArray &type);
134
135 virtual QSSGStageGeneratorBase &operator<<(const QByteArray &data);
136 virtual void append(const QByteArray &data);
137 QSSGShaderGeneratorStage stage() const;
138
139 void addShaderPass2Marker(ShaderItemType itemType);
140
141 void addShaderItemMap(ShaderItemType itemType, const TStrTableStrMap &itemMap, ShaderItemMapFlags flags = {});
142
143 virtual void addShaderIncomingMap();
144
145 virtual void addShaderUniformMap();
146
147 virtual void addShaderOutgoingMap();
148
149 virtual void addShaderConstantBufferItemMap(const QByteArray &itemType, const TStrTableStrMap &cbMap, TConstantBufferParamArray cbParamsArray);
150
151 virtual void appendShaderCode() final;
152
153 virtual void addInclude(const QByteArray &name) final;
154
155 void buildShaderSourcePass1(QSSGShaderResourceMergeContext *mergeContext);
156
157 QByteArray buildShaderSourcePass2(QSSGShaderResourceMergeContext *mergeContext);
158
159 virtual void addFunction(const QByteArray &functionName) final;
160
161 virtual void addDefinition(const QByteArray &name, const QByteArray &value) final;
162
163 virtual void addTypeDeclaration(const QByteArray &typeName, const QByteArray &snippet) final;
164
165 void addPrefix(const QByteArray &data);
166
167 void addImage(const QByteArray &name, const QByteArray &imageType, const QByteArray &format, QSSGMemoryQualifiers qualifiers, const QByteArray &condition = {});
168 void addBuffer(const QByteArray &name, const QByteArray &contentType, QSSGMemoryQualifiers qualifiers, const QByteArray &condition = {});
169};
170
171Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGStageGeneratorBase::ShaderItemMapFlags)
172
173struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGVertexShaderGenerator final : public QSSGStageGeneratorBase
174{
175 QSSGVertexShaderGenerator();
176};
177struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGComputeShaderGenerator final : public QSSGStageGeneratorBase
178{
179 QSSGComputeShaderGenerator();
180};
181
182struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGFragmentShaderGenerator final : public QSSGStageGeneratorBase
183{
184 QSSGFragmentShaderGenerator();
185 void addShaderIncomingMap() override;
186 void addShaderOutgoingMap() override;
187};
188
189class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGProgramGenerator
190{
191 Q_DISABLE_COPY(QSSGProgramGenerator)
192public:
193 QSSGProgramGenerator() = default;
197
199
200 static constexpr QSSGShaderGeneratorStageFlags defaultFlags() { return QSSGShaderGeneratorStageFlags(QSSGShaderGeneratorStage::Vertex | QSSGShaderGeneratorStage::Fragment); }
201
202 void linkStages();
203
204 void beginProgram(QSSGShaderGeneratorStageFlags inEnabledStages = defaultFlags());
205
207
208 QSSGStageGeneratorBase &internalGetStage(QSSGShaderGeneratorStage inStage);
209 // get the stage or nullptr if it has not been created.
210 QSSGStageGeneratorBase *getStage(QSSGShaderGeneratorStage inStage);
211
212 void registerShaderMetaDataFromSource(QSSGShaderResourceMergeContext *mergeContext,
213 const QByteArray &contents,
214 QSSGShaderGeneratorStage stage);
215
216 QSSGRhiShaderPipelinePtr compileGeneratedRhiShader(const QByteArray &inMaterialInfoString,
217 const QSSGShaderFeatures &inFeatureSet,
218 QSSGShaderLibraryManager &shaderLibraryManager,
219 QSSGShaderCache &theCache,
220 QSSGRhiShaderPipeline::StageFlags stageFlags,
221 const QSSGUserShaderAugmentation &shaderAugmentation,
222 int viewCount,
223 bool perTargetCompilation,
224 const QByteArray &inCacheKey = {});
225};
226
227QT_END_NAMESPACE
228#endif
QSSGRhiShaderPipelinePtr compileGeneratedRhiShader(const QByteArray &inMaterialInfoString, const QSSGShaderFeatures &inFeatureSet, QSSGShaderLibraryManager &shaderLibraryManager, QSSGShaderCache &theCache, QSSGRhiShaderPipeline::StageFlags stageFlags, const QSSGUserShaderAugmentation &shaderAugmentation, int viewCount, bool perTargetCompilation, const QByteArray &inCacheKey={})
void registerShaderMetaDataFromSource(QSSGShaderResourceMergeContext *mergeContext, const QByteArray &contents, QSSGShaderGeneratorStage stage)
static constexpr QSSGShaderGeneratorStageFlags defaultFlags()
QSSGShaderGeneratorStageFlags m_enabledStages
QSSGComputeShaderGenerator m_cs
QSSGStageGeneratorBase * getStage(QSSGShaderGeneratorStage inStage)
QSSGStageGeneratorBase & internalGetStage(QSSGShaderGeneratorStage inStage)
QSSGShaderGeneratorStageFlags getEnabledStages() const
void beginProgram(QSSGShaderGeneratorStageFlags inEnabledStages=defaultFlags())
QSSGFragmentShaderGenerator m_fs
friend class QSSGRenderContextInterface
Combined button and popup list for selecting options.
static void addEndCond(QByteArray &block, const T &var)
QSSGShaderGeneratedProgramOutput(const char *vs, const char *fs)