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
5#ifndef QSSG_RENDER_SHADER_CODE_GENERATOR_V2_H
6#define QSSG_RENDER_SHADER_CODE_GENERATOR_V2_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtQuick3DRuntimeRender/private/qtquick3druntimerenderglobal_p.h>
20#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
21
22#include <QtCore/qstring.h>
23
24QT_BEGIN_NAMESPACE
25
26enum class QSSGShaderGeneratorStage
27{
28 None = 0,
29 Vertex = 1,
30 Fragment = 1 << 1,
31 StageCount = 2,
32};
33
34Q_DECLARE_FLAGS(QSSGShaderGeneratorStageFlags, QSSGShaderGeneratorStage)
35Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGShaderGeneratorStageFlags)
36
37struct QSSGStageGeneratorBase;
39class QSSGShaderLibraryManager;
40
41class QSSGShaderResourceMergeContext;
42
43struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGStageGeneratorBase
44{
45 enum class ShaderItemType {
46 VertexInput,
47 Input,
48 Output,
49 Uniform
50 };
51
52 enum class ShaderItemMapFlag {
53 Flat = 0x01
54 };
55 Q_DECLARE_FLAGS(ShaderItemMapFlags, ShaderItemMapFlag)
56
57 // Using QMap intentionally - being sorted by key when iterating is helpful
58 // to get the same ordered list of vertex inputs, uniforms, etc. on every
59 // run, which in turn helps shader (disk) cache efficiency due to not
60 // generating a different shader string just because QHash decided to
61 // iterate entries in a different order.
62 typedef QMap<QByteArray, QByteArray> TStrTableStrMap;
63 typedef QMap<QByteArray, QPair<quint32, QByteArray>> TStrTableSizedStrMap;
64
65 typedef QPair<QByteArray, QByteArray> TParamPair;
66 typedef QPair<QByteArray, TParamPair> TConstantBufferParamPair;
67 typedef QVector<TConstantBufferParamPair> TConstantBufferParamArray;
68
69 TStrTableStrMap m_incoming;
70 TStrTableStrMap *m_outgoing = nullptr;
71 TStrTableStrMap m_flatIncoming;
72 TStrTableStrMap *m_flatOutgoing = nullptr;
73 QSet<QByteArray> m_includes;
74 TStrTableStrMap m_uniforms;
75 TStrTableSizedStrMap m_uniformArrays;
76 TStrTableStrMap m_constantBuffers;
77 TConstantBufferParamArray m_constantBufferParams;
78 QByteArray m_codeBuilder;
79 QByteArray m_finalBuilder;
80 QSSGShaderGeneratorStage m_stage;
81 QSSGShaderGeneratorStageFlags m_enabledStages;
82 QList<QByteArray> m_addedFunctions;
83 TStrTableStrMap m_addedTypeDeclarations;
84 TStrTableStrMap m_addedDefinitions;
85 QSSGShaderResourceMergeContext *m_mergeContext = nullptr;
86
87 explicit QSSGStageGeneratorBase(QSSGShaderGeneratorStage inStage);
88 virtual ~QSSGStageGeneratorBase() = default;
89
90 virtual void begin(QSSGShaderGeneratorStageFlags inEnabledStages);
91
92 virtual void addIncoming(const QByteArray &name, const QByteArray &type);
93 virtual void addOutgoing(const QByteArray &name, const QByteArray &type);
94
95 virtual void addFlatIncoming(const QByteArray &name, const QByteArray &type);
96 virtual void addFlatOutgoing(const QByteArray &name, const QByteArray &type);
97
98 virtual void addUniform(const QByteArray &name, const QByteArray &type);
99
100 virtual void addUniformArray(const QByteArray &name, const QByteArray &type, quint32 size);
101
102 virtual void addConstantBuffer(const QByteArray &name, const QByteArray &layout);
103 virtual void addConstantBufferParam(const QByteArray &cbName, const QByteArray &paramName, const QByteArray &type);
104
105 virtual QSSGStageGeneratorBase &operator<<(const QByteArray &data);
106 virtual void append(const QByteArray &data);
107 QSSGShaderGeneratorStage stage() const;
108
109 void addShaderPass2Marker(ShaderItemType itemType);
110
111 void addShaderItemMap(ShaderItemType itemType, const TStrTableStrMap &itemMap, ShaderItemMapFlags flags = {});
112
113 virtual void addShaderIncomingMap();
114
115 virtual void addShaderUniformMap();
116
117 virtual void addShaderOutgoingMap();
118
119 virtual void addShaderConstantBufferItemMap(const QByteArray &itemType, const TStrTableStrMap &cbMap, TConstantBufferParamArray cbParamsArray);
120
121 virtual void appendShaderCode() final;
122
123 virtual void addInclude(const QByteArray &name) final;
124
125 void buildShaderSourcePass1(QSSGShaderResourceMergeContext *mergeContext);
126
127 QByteArray buildShaderSourcePass2(QSSGShaderResourceMergeContext *mergeContext);
128
129 virtual void addFunction(const QByteArray &functionName) final;
130
131 virtual void addDefinition(const QByteArray &name, const QByteArray &value) final;
132
133 virtual void addTypeDeclaration(const QByteArray &typeName, const QByteArray &snippet) final;
134};
135
136Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGStageGeneratorBase::ShaderItemMapFlags)
137
138struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGVertexShaderGenerator final : public QSSGStageGeneratorBase
139{
140 QSSGVertexShaderGenerator();
141};
142
143struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGFragmentShaderGenerator final : public QSSGStageGeneratorBase
144{
145 QSSGFragmentShaderGenerator();
146 void addShaderIncomingMap() override;
147 void addShaderOutgoingMap() override;
148};
149
150class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGProgramGenerator
151{
152 Q_DISABLE_COPY(QSSGProgramGenerator)
153public:
154 QSSGProgramGenerator() = default;
157
159
160 static constexpr QSSGShaderGeneratorStageFlags defaultFlags() { return QSSGShaderGeneratorStageFlags(QSSGShaderGeneratorStage::Vertex | QSSGShaderGeneratorStage::Fragment); }
161
162 void linkStages();
163
164 void beginProgram(QSSGShaderGeneratorStageFlags inEnabledStages = defaultFlags());
165
167
168 QSSGStageGeneratorBase &internalGetStage(QSSGShaderGeneratorStage inStage);
169 // get the stage or nullptr if it has not been created.
170 QSSGStageGeneratorBase *getStage(QSSGShaderGeneratorStage inStage);
171
172 void registerShaderMetaDataFromSource(QSSGShaderResourceMergeContext *mergeContext,
173 const QByteArray &contents,
174 QSSGShaderGeneratorStage stage);
175
176 QSSGRhiShaderPipelinePtr compileGeneratedRhiShader(const QByteArray &inMaterialInfoString,
177 const QSSGShaderFeatures &inFeatureSet,
178 QSSGShaderLibraryManager &shaderLibraryManager,
179 QSSGShaderCache &theCache,
180 QSSGRhiShaderPipeline::StageFlags stageFlags,
181 int viewCount,
182 bool perTargetCompilation);
183};
184
185QT_END_NAMESPACE
186#endif
QSSGRhiShaderPipelinePtr compileGeneratedRhiShader(const QByteArray &inMaterialInfoString, const QSSGShaderFeatures &inFeatureSet, QSSGShaderLibraryManager &shaderLibraryManager, QSSGShaderCache &theCache, QSSGRhiShaderPipeline::StageFlags stageFlags, int viewCount, bool perTargetCompilation)
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
void beginProgram(QSSGShaderGeneratorStageFlags inEnabledStages=defaultFlags())
QSSGFragmentShaderGenerator m_fs
friend class QSSGRenderContextInterface
static void addEndCond(QByteArray &block, const T &var)
QSSGShaderGeneratedProgramOutput(const char *vs, const char *fs)