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
26QT_BEGIN_NAMESPACE
27
28class QSSGRenderer;
29class QSSGRenderShadowMap;
30class QSSGRenderReflectionMap;
31class QSSGLayerRenderData;
32struct 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
130 QSSGRenderableObjectList sortedOpaqueObjects;
131 QSSGRenderableObjectList sortedTransparentObjects;
132 QSSGRhiGraphicsPipelineState ps;
133 QSSGRhiRenderableTexture *rhiDepthTexture = nullptr;
134};
135
136class SkyboxPass : public QSSGRenderPass
137{
138public:
139 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
140 void renderPass(QSSGRenderer &renderer) final;
141 Type passType() const final { return Type::Main; }
142 void resetForFrame() final;
143
144 QSSGRenderLayer *layer = nullptr;
145 QRhiRenderPassDescriptor *rpDesc = nullptr;
146 QSSGRhiGraphicsPipelineState ps;
147 bool skipTonemapping = false;
148 bool skipPrep = false;
149};
150
151class SkyboxCubeMapPass : public QSSGRenderPass
152{
153public:
154 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
155 void renderPass(QSSGRenderer &renderer) final;
156 Type passType() const final { return Type::Main; }
157 void resetForFrame() final;
158
159 QSSGRhiShaderPipelinePtr skyBoxCubeShader;
160 QSSGRenderLayer *layer = nullptr;
161 QRhiRenderPassDescriptor *rpDesc = nullptr;
162 QSSGRhiGraphicsPipelineState ps;
163 bool skipTonemapping = false;
164};
165
166class ScreenMapPass : public QSSGRenderPass
167{
168public:
169 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
170 void renderPass(QSSGRenderer &renderer) final;
171 Type passType() const final { return Type::Standalone; }
172 void resetForFrame() final;
173
174 QSSGRhiRenderableTexture *rhiScreenTexture = nullptr;
175 std::optional<SkyboxPass> skyboxPass;
176 std::optional<SkyboxCubeMapPass> skyboxCubeMapPass;
177 QSSGShaderFeatures shaderFeatures;
178 QSSGRenderableObjectList sortedOpaqueObjects;
179 QSSGRhiGraphicsPipelineState ps;
180 QColor clearColor{Qt::transparent};
181 bool wantsMips = false;
182};
183
184class ScreenReflectionPass : public QSSGRenderPass
185{
186public:
187 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
188 void renderPass(QSSGRenderer &renderer) final;
189 Type passType() const final { return Type::Main; }
190 void resetForFrame() final;
191
192 QSSGRenderableObjectList sortedScreenTextureObjects;
193 const QSSGRhiRenderableTexture *rhiScreenTexture = nullptr;
194 QSSGRhiGraphicsPipelineState ps {};
195};
196
197class OpaquePass : public QSSGRenderPass
198{
199public:
200 static void prep(const QSSGRenderContextInterface &ctx,
201 QSSGLayerRenderData &data,
202 QSSGPassKey passKey,
203 QSSGRhiGraphicsPipelineState &ps,
204 QSSGShaderFeatures shaderFeatures,
205 QRhiRenderPassDescriptor *rpDesc,
206 const QSSGRenderableObjectList &sortedOpaqueObjects);
207
208 static void render(const QSSGRenderContextInterface &ctx,
209 const QSSGRhiGraphicsPipelineState &ps,
210 const QSSGRenderableObjectList &sortedOpaqueObjects);
211
212 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
213 void renderPass(QSSGRenderer &renderer) final;
214 Type passType() const final { return Type::Main; }
215 void resetForFrame() final;
216
217 QSSGRenderableObjectList sortedOpaqueObjects;
218 QSSGRhiGraphicsPipelineState ps;
219 QSSGShaderFeatures shaderFeatures;
220};
221
222struct QSSGCameraRenderData;
223
224class TransparentPass : public QSSGRenderPass
225{
226public:
227 static void prep(const QSSGRenderContextInterface &ctx,
228 QSSGLayerRenderData &data,
229 QSSGPassKey passKey,
230 QSSGRhiGraphicsPipelineState &ps,
231 QSSGShaderFeatures shaderFeatures,
232 QRhiRenderPassDescriptor *rpDesc,
233 const QSSGRenderableObjectList &sortedTransparentObjects);
234
235 static void render(const QSSGRenderContextInterface &ctx,
236 const QSSGRhiGraphicsPipelineState &ps,
237 const QSSGRenderableObjectList &sortedTransparentObjects);
238
239
240 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
241 void renderPass(QSSGRenderer &renderer) final;
242 Type passType() const final { return Type::Main; }
243 void resetForFrame() final;
244
245 QSSGRenderableObjectList sortedTransparentObjects;
246 QSSGRhiGraphicsPipelineState ps;
247 QSSGShaderFeatures shaderFeatures;
248};
249
250class Item2DPass : public QSSGRenderPass
251{
252public:
253 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
254 void renderPass(QSSGRenderer &renderer) final;
255 Type passType() const final { return Type::Main; }
256 void resetForFrame() final;
257
258 QList<QSSGRenderItem2D *> item2Ds;
259 QSSGRhiGraphicsPipelineState ps {};
260};
261
262class InfiniteGridPass : public QSSGRenderPass
263{
264public:
265 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
266 void renderPass(QSSGRenderer &renderer) final;
267 Type passType() const final { return Type::Main; }
268 void resetForFrame() final;
269
270 QSSGRhiShaderPipelinePtr gridShader;
271 QSSGRhiGraphicsPipelineState ps {};
272 QSSGRenderLayer *layer = nullptr;
273};
274
275class DebugDrawPass : public QSSGRenderPass
276{
277public:
278 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
279 void renderPass(QSSGRenderer &renderer) final;
280 Type passType() const final { return Type::Main; }
281 void resetForFrame() final;
282
283 QSSGRhiShaderPipelinePtr debugObjectShader;
284 QSSGRhiGraphicsPipelineState ps;
285};
286
287class QSSGRenderExtension;
288
289class UserPass : public QSSGRenderPass
290{
291public:
292 void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final;
293 void renderPass(QSSGRenderer &renderer) final;
294 Type passType() const final { return Type::Extension; }
295 void resetForFrame() final;
296
297 bool hasData() const { return extensions.size() != 0; }
298
299 QList<QSSGRenderExtension *> extensions;
300};
301
302QT_END_NAMESPACE
303
304#endif // QSSGRENDERPASS_H
305

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

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