1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#ifndef QSSGRENDERPASS_H
5#define QSSGRENDERPASS_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qglobal.h>
19
20#include <ssg/qssgrenderhelpers.h>
21#include <QtQuick3DUtils/private/qssgaosettings_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrhicontext_p.h>
23#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
24#include <QtQuick3DRuntimeRender/private/qssgrenderableobjects_p.h>
25#include "qssgrenderer_p.h"
26
27QT_BEGIN_NAMESPACE
28
29class QSSGRenderShadowMap;
30class QSSGRenderReflectionMap;
31class QSSGLayerRenderData;
32class QSSGRenderCamera;
33struct QSSGRenderItem2D;
34
35class QSSGRenderPass
36{
37public:
38 enum class Type
39 {
40 Standalone,
41 Main,
42 Extension
43 };
44 // Input:
45
46 virtual ~QSSGRenderPass();
47 virtual void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) = 0;
48 virtual void renderPass(QSSGRenderer &renderer) = 0;
49 virtual Type passType() const = 0;
50 virtual void resetForFrame() = 0;
51
52 // Output:
53
54 // Flags: Debug markers(?)
55
56 // Dependency
57};
58
59class ShadowMapPass : public QSSGRenderPass
60{
61public:
62 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
63 void renderPass(QSSGRenderer &renderer) final;
64 Type passType() const final { return Type::Standalone; }
65 void resetForFrame() final;
66
67 std::shared_ptr<QSSGRenderShadowMap> shadowMapManager;
68 QSSGRenderableObjectList shadowPassObjects;
69 QSSGShaderLightList globalLights;
70 QSSGRenderCamera *camera = nullptr;
71 std::unique_ptr<QSSGRenderCamera> debugCamera;
72 QSSGRhiGraphicsPipelineState ps;
73 QSSGBounds3 castingObjectsBox;
74 QSSGBounds3 receivingObjectsBox;
75 bool enabled = false;
76};
77
78class ReflectionMapPass : public QSSGRenderPass
79{
80public:
81 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
82 void renderPass(QSSGRenderer &renderer) final;
83 Type passType() const final { return Type::Standalone; }
84 void resetForFrame() final;
85
86 std::shared_ptr<QSSGRenderReflectionMap> reflectionMapManager;
87 QList<QSSGRenderReflectionProbe *> reflectionProbes;
88 QSSGRenderableObjectList reflectionPassObjects;
89 QSSGRhiGraphicsPipelineState ps;
90};
91
92class ZPrePassPass : public QSSGRenderPass
93{
94public:
95 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
96 void renderPass(QSSGRenderer &renderer) final;
97 Type passType() const final { return Type::Main; }
98 void resetForFrame() final;
99
100 QSSGRenderableObjectList renderedDepthWriteObjects;
101 QSSGRenderableObjectList renderedOpaqueDepthPrepassObjects;
102 QSSGRhiGraphicsPipelineState ps;
103 bool active = false;
104};
105
106class SSAOMapPass : public QSSGRenderPass
107{
108public:
109 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
110 void renderPass(QSSGRenderer &renderer) final;
111 Type passType() const final { return Type::Standalone; }
112 void resetForFrame() final;
113
114 const QSSGRhiRenderableTexture *rhiDepthTexture = nullptr;
115 const QSSGRenderCamera *camera = nullptr;
116 QSSGAmbientOcclusionSettings aoSettings;
117 QSSGRhiGraphicsPipelineState ps;
118 QSSGRhiRenderableTexture *rhiAoTexture = nullptr;
119 QSSGRhiShaderPipelinePtr ssaoShaderPipeline;
120};
121
122class Q_QUICK3DRUNTIMERENDER_EXPORT DepthMapPass : public QSSGRenderPass
123{
124public:
125 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
126 void renderPass(QSSGRenderer &renderer) final;
127 Type passType() const final { return Type::Standalone; }
128 void resetForFrame() final;
129 void setMultisamplingEnabled(bool enabled) { m_multisampling = enabled; }
130 bool isMultisamplingEnabled() const { return m_multisampling; }
131
132 QSSGRenderableObjectList sortedOpaqueObjects;
133 QSSGRenderableObjectList sortedTransparentObjects;
134 QSSGRhiGraphicsPipelineState ps;
135 QSSGRhiRenderableTexture *rhiDepthTexture = nullptr;
136 bool m_multisampling = false;
137};
138
139class SkyboxPass : public QSSGRenderPass
140{
141public:
142 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
143 void renderPass(QSSGRenderer &renderer) final;
144 Type passType() const final { return Type::Main; }
145 void resetForFrame() final;
146
147 QSSGRenderLayer *layer = nullptr;
148 QRhiRenderPassDescriptor *rpDesc = nullptr;
149 QSSGRhiGraphicsPipelineState ps;
150 bool skipTonemapping = false;
151 bool skipPrep = false;
152};
153
154class SkyboxCubeMapPass : public QSSGRenderPass
155{
156public:
157 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
158 void renderPass(QSSGRenderer &renderer) final;
159 Type passType() const final { return Type::Main; }
160 void resetForFrame() final;
161
162 QSSGRhiShaderPipelinePtr skyBoxCubeShader;
163 QSSGRenderLayer *layer = nullptr;
164 QRhiRenderPassDescriptor *rpDesc = nullptr;
165 QSSGRhiGraphicsPipelineState ps;
166 bool skipTonemapping = false;
167};
168
169class ScreenMapPass : public QSSGRenderPass
170{
171public:
172 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
173 void renderPass(QSSGRenderer &renderer) final;
174 Type passType() const final { return Type::Standalone; }
175 void resetForFrame() final;
176
177 QSSGRhiRenderableTexture *rhiScreenTexture = nullptr;
178 std::optional<SkyboxPass> skyboxPass;
179 std::optional<SkyboxCubeMapPass> skyboxCubeMapPass;
180 QSSGShaderFeatures shaderFeatures;
181 QSSGRenderableObjectList sortedOpaqueObjects;
182 QSSGRhiGraphicsPipelineState ps;
183 QColor clearColor{Qt::transparent};
184 bool wantsMips = false;
185};
186
187class ScreenReflectionPass : public QSSGRenderPass
188{
189public:
190 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
191 void renderPass(QSSGRenderer &renderer) final;
192 Type passType() const final { return Type::Main; }
193 void resetForFrame() final;
194
195 QSSGRenderableObjectList sortedScreenTextureObjects;
196 const QSSGRhiRenderableTexture *rhiScreenTexture = nullptr;
197 QSSGRhiGraphicsPipelineState ps {};
198};
199
200class OpaquePass : public QSSGRenderPass
201{
202public:
203 static void prep(const QSSGRenderContextInterface &ctx,
204 QSSGLayerRenderData &data,
205 QSSGPassKey passKey,
206 QSSGRhiGraphicsPipelineState &ps,
207 QSSGShaderFeatures shaderFeatures,
208 QRhiRenderPassDescriptor *rpDesc,
209 const QSSGRenderableObjectList &sortedOpaqueObjects);
210
211 static void render(const QSSGRenderContextInterface &ctx,
212 const QSSGRhiGraphicsPipelineState &ps,
213 const QSSGRenderableObjectList &sortedOpaqueObjects);
214
215 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
216 void renderPass(QSSGRenderer &renderer) final;
217 Type passType() const final { return Type::Main; }
218 void resetForFrame() final;
219
220 QSSGRenderableObjectList sortedOpaqueObjects;
221 QSSGRhiGraphicsPipelineState ps;
222 QSSGShaderFeatures shaderFeatures;
223};
224
225struct QSSGCameraRenderData;
226
227class TransparentPass : public QSSGRenderPass
228{
229public:
230 static void prep(const QSSGRenderContextInterface &ctx,
231 QSSGLayerRenderData &data,
232 QSSGPassKey passKey,
233 QSSGRhiGraphicsPipelineState &ps,
234 QSSGShaderFeatures shaderFeatures,
235 QRhiRenderPassDescriptor *rpDesc,
236 const QSSGRenderableObjectList &sortedTransparentObjects,
237 bool oit = false);
238
239 static void render(const QSSGRenderContextInterface &ctx,
240 const QSSGRhiGraphicsPipelineState &ps,
241 const QSSGRenderableObjectList &sortedTransparentObjects);
242
243
244 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
245 void renderPass(QSSGRenderer &renderer) final;
246 Type passType() const final { return Type::Main; }
247 void resetForFrame() final;
248
249 QSSGRenderableObjectList sortedTransparentObjects;
250 QSSGRhiGraphicsPipelineState ps;
251 QSSGShaderFeatures shaderFeatures;
252};
253
254class Item2DPass : public QSSGRenderPass
255{
256public:
257 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
258 void renderPass(QSSGRenderer &renderer) final;
259 Type passType() const final { return Type::Main; }
260 void resetForFrame() final;
261
262protected:
263 [[nodiscard]] QSSGRenderer::Item2DData getItem2DData(QSSGRenderItem2D *item2D);
264
265 QSSGRenderer::Item2DDataMap item2DDataMap;
266 QList<QSSGRenderItem2D *> item2Ds;
267 std::vector<QSGRenderer *> prepdItem2DRenderers;
268 QSSGRhiGraphicsPipelineState ps {};
269};
270
271class InfiniteGridPass : public QSSGRenderPass
272{
273public:
274 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
275 void renderPass(QSSGRenderer &renderer) final;
276 Type passType() const final { return Type::Main; }
277 void resetForFrame() final;
278
279 QSSGRhiShaderPipelinePtr gridShader;
280 QSSGRhiGraphicsPipelineState ps {};
281 QSSGRenderLayer *layer = nullptr;
282};
283
284class DebugDrawPass : public QSSGRenderPass
285{
286public:
287 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
288 void renderPass(QSSGRenderer &renderer) final;
289 Type passType() const final { return Type::Main; }
290 void resetForFrame() final;
291
292 QSSGRhiShaderPipelinePtr debugObjectShader;
293 QSSGRhiGraphicsPipelineState ps;
294};
295
296class QSSGRenderExtension;
297
298class UserPass : public QSSGRenderPass
299{
300public:
301 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
302 void renderPass(QSSGRenderer &renderer) final;
303 Type passType() const final { return Type::Extension; }
304 void resetForFrame() final;
305
306 bool hasData() const { return extensions.size() != 0; }
307
308 QList<QSSGRenderExtension *> extensions;
309};
310
311class OITRenderPass : public QSSGRenderPass
312{
313public:
314 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
315 void renderPass(QSSGRenderer &renderer) final;
316 Type passType() const final;
317 void resetForFrame() final;
318 void setMethod(QSSGRenderLayer::OITMethod m) { method = m; }
319
320 QSSGRenderLayer::OITMethod method;
321
322 QSSGRhiShaderPipelinePtr clearPipeline;
323 QRhiShaderResourceBindings *clearSrb = nullptr;
324
325 QSSGRenderableObjectList sortedTransparentObjects;
326 QSSGRhiGraphicsPipelineState ps;
327 QSSGShaderFeatures shaderFeatures;
328 QSSGRhiRenderableTexture *rhiAccumTexture = nullptr;
329 QSSGRhiRenderableTexture *rhiRevealageTexture = nullptr;
330 QSSGRhiRenderableTexture *rhiDepthTexture = nullptr;
331 QRhiTextureRenderTarget *renderTarget = nullptr;
332};
333
334class OITCompositePass : public QSSGRenderPass
335{
336public:
337 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
338 void renderPass(QSSGRenderer &renderer) final;
339 Type passType() const final { return Type::Main; }
340 void resetForFrame() final;
341 void setMethod(QSSGRenderLayer::OITMethod m) { method = m; }
342 QSSGRenderLayer::OITMethod method;
343 QRhiShaderResourceBindings *compositeSrb = nullptr;
344 QSSGRhiGraphicsPipelineState ps;
345 QSSGShaderFeatures shaderFeatures;
346 QSSGRhiShaderPipelinePtr compositeShaderPipeline;
347 QSSGRhiRenderableTexture *rhiAccumTexture = nullptr;
348 QSSGRhiRenderableTexture *rhiRevealageTexture = nullptr;
349};
350
351QT_END_NAMESPACE
352
353#endif // QSSGRENDERPASS_H
354

source code of qtquick3d/src/runtimerender/rendererimpl/qssgrenderpass_p.h