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 StageCount = 2,
34};
35
36Q_DECLARE_FLAGS(QSSGShaderGeneratorStageFlags, QSSGShaderGeneratorStage)
37Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGShaderGeneratorStageFlags)
38
39struct QSSGStageGeneratorBase;
41class QSSGShaderLibraryManager;
42
43class QSSGShaderResourceMergeContext;
44
45struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGStageGeneratorBase
46{
47 enum class ShaderItemType {
48 VertexInput,
49 Input,
50 Output,
51 Uniform,
52 Image
53 };
54
55 enum class ShaderItemMapFlag {
56 Flat = 0x01
57 };
58 Q_DECLARE_FLAGS(ShaderItemMapFlags, ShaderItemMapFlag)
59
60 // Using QMap intentionally - being sorted by key when iterating is helpful
61 // to get the same ordered list of vertex inputs, uniforms, etc. on every
62 // run, which in turn helps shader (disk) cache efficiency due to not
63 // generating a different shader string just because QHash decided to
64 // iterate entries in a different order.
65 typedef QMap<QByteArray, QByteArray> TStrTableStrMap;
66 typedef QMap<QByteArray, QPair<quint32, QByteArray>> TStrTableSizedStrMap;
67
68 typedef QPair<QByteArray, QByteArray> TParamPair;
69 typedef QPair<QByteArray, TParamPair> TConstantBufferParamPair;
70 typedef QVector<TConstantBufferParamPair> TConstantBufferParamArray;
71
72 TStrTableStrMap m_incoming;
73 TStrTableStrMap *m_outgoing = nullptr;
74 TStrTableStrMap m_flatIncoming;
75 TStrTableStrMap *m_flatOutgoing = nullptr;
76 QSet<QByteArray> m_includes;
77 QList<QByteArray> m_prefixes;
78 TStrTableStrMap m_uniforms;
79 TStrTableSizedStrMap m_uniformArrays;
80 TStrTableStrMap m_constantBuffers;
81 TConstantBufferParamArray m_constantBufferParams;
82 QByteArray m_codeBuilder;
83 QByteArray m_finalBuilder;
84 QSSGShaderGeneratorStage m_stage;
85 QSSGShaderGeneratorStageFlags m_enabledStages;
86 QList<QByteArray> m_addedFunctions;
87 TStrTableStrMap m_addedTypeDeclarations;
88 TStrTableStrMap m_addedDefinitions;
89 QSSGShaderResourceMergeContext *m_mergeContext = nullptr;
90
91 explicit QSSGStageGeneratorBase(QSSGShaderGeneratorStage inStage);
92 virtual ~QSSGStageGeneratorBase() = default;
93
94 virtual void begin(QSSGShaderGeneratorStageFlags inEnabledStages);
95
96 virtual void addIncoming(const QByteArray &name, const QByteArray &type);
97 virtual void addOutgoing(const QByteArray &name, const QByteArray &type);
98
99 virtual void addFlatIncoming(const QByteArray &name, const QByteArray &type);
100 virtual void addFlatOutgoing(const QByteArray &name, const QByteArray &type);
101
102 virtual void addUniform(const QByteArray &name, const QByteArray &type);
103
104 virtual void addUniformArray(const QByteArray &name, const QByteArray &type, quint32 size);
105
106 virtual void addConstantBuffer(const QByteArray &name, const QByteArray &layout);
107 virtual void addConstantBufferParam(const QByteArray &cbName, const QByteArray &paramName, const QByteArray &type);
108
109 virtual QSSGStageGeneratorBase &operator<<(const QByteArray &data);
110 virtual void append(const QByteArray &data);
111 QSSGShaderGeneratorStage stage() const;
112
113 void addShaderPass2Marker(ShaderItemType itemType);
114
115 void addShaderItemMap(ShaderItemType itemType, const TStrTableStrMap &itemMap, ShaderItemMapFlags flags = {});
116
117 virtual void addShaderIncomingMap();
118
119 virtual void addShaderUniformMap();
120
121 virtual void addShaderOutgoingMap();
122
123 virtual void addShaderConstantBufferItemMap(const QByteArray &itemType, const TStrTableStrMap &cbMap, TConstantBufferParamArray cbParamsArray);
124
125 virtual void appendShaderCode() final;
126
127 virtual void addInclude(const QByteArray &name) final;
128
129 void buildShaderSourcePass1(QSSGShaderResourceMergeContext *mergeContext);
130
131 QByteArray buildShaderSourcePass2(QSSGShaderResourceMergeContext *mergeContext);
132
133 virtual void addFunction(const QByteArray &functionName) final;
134
135 virtual void addDefinition(const QByteArray &name, const QByteArray &value) final;
136
137 virtual void addTypeDeclaration(const QByteArray &typeName, const QByteArray &snippet) final;
138
139 void addPrefix(const QByteArray &data);
140};
141
142Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGStageGeneratorBase::ShaderItemMapFlags)
143
144struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGVertexShaderGenerator final : public QSSGStageGeneratorBase
145{
146 QSSGVertexShaderGenerator();
147};
148
149struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGFragmentShaderGenerator final : public QSSGStageGeneratorBase
150{
151 QSSGFragmentShaderGenerator();
152 void addShaderIncomingMap() override;
153 void addShaderOutgoingMap() override;
154};
155
156class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGProgramGenerator
157{
158 Q_DISABLE_COPY(QSSGProgramGenerator)
159public:
160 QSSGProgramGenerator() = default;
163
165
166 static constexpr QSSGShaderGeneratorStageFlags defaultFlags() { return QSSGShaderGeneratorStageFlags(QSSGShaderGeneratorStage::Vertex | QSSGShaderGeneratorStage::Fragment); }
167
168 void linkStages();
169
170 void beginProgram(QSSGShaderGeneratorStageFlags inEnabledStages = defaultFlags());
171
173
174 QSSGStageGeneratorBase &internalGetStage(QSSGShaderGeneratorStage inStage);
175 // get the stage or nullptr if it has not been created.
176 QSSGStageGeneratorBase *getStage(QSSGShaderGeneratorStage inStage);
177
178 void registerShaderMetaDataFromSource(QSSGShaderResourceMergeContext *mergeContext,
179 const QByteArray &contents,
180 QSSGShaderGeneratorStage stage);
181
182 QSSGRhiShaderPipelinePtr compileGeneratedRhiShader(const QByteArray &inMaterialInfoString,
183 const QSSGShaderFeatures &inFeatureSet,
184 QSSGShaderLibraryManager &shaderLibraryManager,
185 QSSGShaderCache &theCache,
186 QSSGRhiShaderPipeline::StageFlags stageFlags,
187 const QSSGUserShaderAugmentation &shaderAugmentation,
188 int viewCount,
189 bool perTargetCompilation);
190};
191
192QT_END_NAMESPACE
193#endif
void registerShaderMetaDataFromSource(QSSGShaderResourceMergeContext *mergeContext, const QByteArray &contents, QSSGShaderGeneratorStage stage)
static constexpr QSSGShaderGeneratorStageFlags defaultFlags()
QSSGShaderGeneratorStageFlags m_enabledStages
QSSGStageGeneratorBase * getStage(QSSGShaderGeneratorStage inStage)
QSSGStageGeneratorBase & internalGetStage(QSSGShaderGeneratorStage inStage)
QSSGShaderGeneratorStageFlags getEnabledStages() const
QSSGRhiShaderPipelinePtr compileGeneratedRhiShader(const QByteArray &inMaterialInfoString, const QSSGShaderFeatures &inFeatureSet, QSSGShaderLibraryManager &shaderLibraryManager, QSSGShaderCache &theCache, QSSGRhiShaderPipeline::StageFlags stageFlags, const QSSGUserShaderAugmentation &shaderAugmentation, int viewCount, bool perTargetCompilation)
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)