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
qssgrenderer_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_RENDERER_P_H
6#define QSSG_RENDERER_P_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 <private/qssgrenderpickresult_p.h>
20#include <private/qssgrhicontext_p.h>
21#include <private/qssgrhiquadrenderer_p.h>
22
23#include <QtCore/qpointer.h>
24
25#include <vector>
26
27QT_BEGIN_NAMESPACE
28
29class QSSGShaderCache;
30class QSSGProgramGenerator;
31class QSSGShaderLibraryManager;
32class QSSGBufferManager;
35struct QSSGRenderNode;
36struct QSSGRenderItem2D;
37struct QSSGRenderRay;
38class QSSGSubsetRenderable;
40struct QSSGShaderFeatures;
42class QSGRenderContext;
43
44class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRenderer
45{
46 Q_DISABLE_COPY(QSSGRenderer)
47public:
48 QSSGRenderer();
49 ~QSSGRenderer();
50
51 // Returns true if this layer or a sibling was dirty.
52 bool prepareLayerForRender(QSSGRenderLayer &inLayer);
53
54 void rhiPrepare(QSSGRenderLayer &inLayer);
55 void rhiRender(QSSGRenderLayer &inLayer);
56
57 // Clients need to call this every frame in order for various subsystems to release
58 // temporary per-frame allocated objects.
59 void beginFrame(QSSGRenderLayer &layer, bool allowRecursion = true);
60
61 // When allowRecursion is true, the cleanup is only done when all
62 // beginFrames got their corresponding endFrame. This is indicated by the
63 // return value (false if nothing's been done due to pending "frames")
64 bool endFrame(QSSGRenderLayer &layer, bool allowRecursion = true);
65
66 // Get the number of times EndFrame has been called
67 [[nodiscard]] constexpr quint32 frameCount() const { return m_frameCount; }
68
69 void setViewport(QRect inViewport) { m_viewport = inViewport; }
70 QRect viewport() const { return m_viewport; }
71
72 void setDpr(float dpr) { m_dpr = dpr; }
73 float dpr() const { return m_dpr; }
74
75 void setScissorRect(QRect inScissorRect) { m_scissorRect = inScissorRect; }
76 QRect scissorRect() const { return m_scissorRect; }
77
78 quint32 frameDepth() const { return m_activeFrameRef; }
79
82
83 QSSGRenderContextInterface *contextInterface() const { return m_contextInterface; }
84
85 // Before we start rendering a sublayer(s), e.g., Item2D with View3Ds,
86 // we need to inform the renderer about it, so we can restore the state as we
87 // return from the sublayer(s) rendering. The state will be saved in the data set
88 // for the layer.
91
92 void releaseItem2DData(const QSSGRenderItem2D &item2D);
93
94protected:
95 void cleanupResources(QList<QSSGRenderGraphObject*> &resources);
96 void cleanupResources(QSet<QSSGRenderGraphObject*> &resources);
97
98private:
99 friend class QSSGRendererPrivate;
104 friend class QSSGCleanupObject;
105
106 QSSGLayerRenderData *getOrCreateLayerRenderData(QSSGRenderLayer &layer);
107 void beginLayerRender(QSSGLayerRenderData &inLayer);
108 void endLayerRender();
109 void addMaterialDirtyClear(QSSGRenderGraphObject *material);
110 void cleanupUnreferencedBuffers(QSSGRenderLayer *inLayer);
111 void resetResourceCounters(QSSGRenderLayer *inLayer);
112 void releaseCachedResources();
113
114 void registerItem2DData(QSSGRenderItem2DData &data);
115 void unregisterItem2DData(QSSGRenderItem2DData &data);
116
117 QSSGRenderContextInterface *m_contextInterface = nullptr; // We're own by the context interface
118
119 bool m_globalPickingEnabled = false;
120
121 // Temporary information stored only when rendering a particular layer.
122 QSSGLayerRenderData *m_currentLayer = nullptr;
123
124 QSet<QSSGRenderGraphObject *> m_materialClearDirty;
125
126 QPointer<QSGRenderContext> m_qsgRenderContext;
127
128 // Item2D data (per layer).
129 // Note that the data is own by the layer.
130 std::vector<QSSGRenderItem2DData *> m_item2DDatas;
131
132 mutable std::unique_ptr<QSSGRhiQuadRenderer> m_rhiQuadRenderer;
133 mutable std::unique_ptr<QSSGRhiCubeRenderer> m_rhiCubeRenderer;
134
135 quint32 m_activeFrameRef = 0;
136 quint32 m_frameCount = 0;
137
138 // Viewport that this render context should use
139 QRect m_viewport;
140 float m_dpr = 1.0;
141 QRect m_scissorRect;
142};
143
144class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRendererPrivate
145{
146 QSSGRendererPrivate() = default;
147public:
148 using PickResultList = QVarLengthArray<QSSGRenderPickResult, 20>; // Lets assume most items are filtered out already
149
150 static QSSGRhiShaderPipelinePtr generateRhiShaderPipelineImpl(QSSGSubsetRenderable &renderable,
151 QSSGShaderLibraryManager &shaderLibraryManager,
152 QSSGShaderCache &shaderCache,
153 QSSGProgramGenerator &shaderProgramGenerator,
154 const QSSGShaderDefaultMaterialKeyProperties &shaderKeyProperties,
155 const QSSGShaderFeatures &featureSet,
156 QByteArray &shaderString);
157 static QSSGRhiShaderPipelinePtr generateRhiShaderPipeline(QSSGRenderer &renderer,
158 QSSGSubsetRenderable &inRenderable,
159 const QSSGShaderFeatures &inFeatureSet);
160
161 static QSSGRhiShaderPipelinePtr getShaderPipelineForDefaultMaterial(QSSGRenderer &renderer,
162 QSSGSubsetRenderable &inRenderable,
163 const QSSGShaderFeatures &inFeatureSet);
164
165 static void getLayerHitObjectList(const QSSGRenderLayer &layer,
166 QSSGBufferManager &bufferManager,
167 const QSSGRenderRay &ray,
168 bool inPickEverything,
169 PickResultList &outIntersectionResult);
170 static void intersectRayWithSubsetRenderable(const QSSGRenderLayer &layer, QSSGBufferManager &bufferManager,
171 const QSSGRenderRay &inRay,
172 const QSSGRenderNode &node,
173 PickResultList &outIntersectionResultList);
174 static void intersectRayWithItem2D(const QSSGRenderLayer &layer, const QSSGRenderRay &inRay,
175 const QSSGRenderItem2D &item2D,
176 PickResultList &outIntersectionResultList);
177
178 static PickResultList syncPickAll(const QSSGRenderContextInterface &ctx,
179 const QSSGRenderLayer &layer,
180 const QSSGRenderRay &ray);
181
182 static PickResultList syncPick(const QSSGRenderContextInterface &ctx,
183 const QSSGRenderLayer &layer,
184 const QSSGRenderRay &ray,
185 QSSGRenderNode *target = nullptr);
186
187 static PickResultList syncPickSubset(const QSSGRenderLayer &layer,
188 QSSGBufferManager &bufferManager,
189 const QSSGRenderRay &ray,
190 QVarLengthArray<QSSGRenderNode *> subset);
191
192 // Setting this true enables picking for all the models, regardless of
193 // the models pickable property.
194 static bool isGlobalPickingEnabled(const QSSGRenderer &renderer) { return renderer.m_globalPickingEnabled; }
195 static void setGlobalPickingEnabled(QSSGRenderer &renderer, bool isEnabled);
196
197 static void setRenderContextInterface(QSSGRenderer &renderer, QSSGRenderContextInterface *ctx);
198 static void setSgRenderContext(QSSGRenderer &renderer, QSGRenderContext *sgRenderCtx);
199
200 static QSSGLayerRenderData *getCurrentRenderData(const QSSGRenderer &renderer) { return renderer.m_currentLayer; }
201
202 static QSGRenderContext *getSgRenderContext(const QSSGRenderer &renderer);
203
204 static constexpr float minimumRenderOpacity = .01f;
205};
206
207QT_END_NAMESPACE
208
209#endif // QSSG_RENDERER_P_H
QSSGRhiShaderPipelinePtr debugObjectShader
QSSGRhiGraphicsPipelineState ps
void renderPass(QSSGRenderer &renderer) final
Type passType() const final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
QSSGRenderLayer * layer
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiShaderPipelinePtr gridShader
void resetForFrame() final
Type passType() const final
Type passType() const final
std::vector< QSGRenderer * > prepdItem2DRenderers
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QSSGShaderFeatures shaderFeatures
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiRenderableTexture * rhiAccumTexture
QRhiShaderResourceBindings * compositeSrb
QSSGRhiShaderPipelinePtr compositeShaderPipeline
QSSGRenderLayer::OITMethod method
void resetForFrame() final
Type passType() const final
QSSGRhiRenderableTexture * rhiRevealageTexture
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
void setMethod(QSSGRenderLayer::OITMethod m)
QSSGRhiRenderableTexture * rhiRevealageTexture
void setMethod(QSSGRenderLayer::OITMethod m)
QSSGShaderFeatures shaderFeatures
QSSGRenderLayer::OITMethod method
QRhiShaderResourceBindings * clearSrb
QSSGRenderableObjectList sortedTransparentObjects
QRhiTextureRenderTarget * renderTarget
void resetForFrame() final
QSSGRhiShaderPipelinePtr clearPipeline
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiRenderableTexture * rhiDepthTexture
QSSGRhiGraphicsPipelineState ps
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QSSGRhiRenderableTexture * rhiAccumTexture
static void prep(const QSSGRenderContextInterface &ctx, QSSGLayerRenderData &data, QSSGPassKey passKey, QSSGRhiGraphicsPipelineState &ps, QSSGShaderFeatures shaderFeatures, QRhiRenderPassDescriptor *rpDesc, const QSSGRenderableObjectList &sortedOpaqueObjects)
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QSSGShaderFeatures shaderFeatures
QSSGRhiGraphicsPipelineState ps
static void render(const QSSGRenderContextInterface &ctx, const QSSGRhiGraphicsPipelineState &ps, const QSSGRenderableObjectList &sortedOpaqueObjects)
QSSGRenderableObjectList sortedOpaqueObjects
QRect viewport() const
Returns the viewport rectangle.
QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer)
const QSSGLayerRenderPreparationResultFlags & getFlags() const
virtual ~QSSGRenderPass()
virtual void resetForFrame()=0
virtual Type passType() const =0
virtual void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data)=0
virtual void renderPass(QSSGRenderer &renderer)=0
void releaseItem2DData(const QSSGRenderItem2D &item2D)
const std::unique_ptr< QSSGRhiQuadRenderer > & rhiQuadRenderer() const
quint32 frameDepth() const
float dpr() const
friend class QSSGRenderContextInterface
QRect scissorRect() const
void cleanupResources(QSet< QSSGRenderGraphObject * > &resources)
void setViewport(QRect inViewport)
void beginSubLayerRender(QSSGLayerRenderData &inLayer)
const std::unique_ptr< QSSGRhiCubeRenderer > & rhiCubeRenderer() const
void setDpr(float dpr)
void setScissorRect(QRect inScissorRect)
void endSubLayerRender(QSSGLayerRenderData &inLayer)
QSSGRenderContextInterface * contextInterface() const
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
std::shared_ptr< QSSGRenderReflectionMap > reflectionMapManager
QSSGRenderableObjectList reflectionPassObjects
QSSGRhiGraphicsPipelineState ps
QList< QSSGRenderReflectionProbe * > reflectionProbes
Type passType() const final
Type passType() const final
QSSGRhiRenderableTexture * rhiAoTexture
const QSSGRhiRenderableTexture * rhiDepthTexture
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
QSSGRhiShaderPipelinePtr ssaoShaderPipeline
QSSGAmbientOcclusionSettings aoSettings
void renderPass(QSSGRenderer &renderer) final
const QSSGRenderCamera * camera
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QSSGRhiGraphicsPipelineState ps
Type passType() const final
std::optional< SkyboxPass > skyboxPass
QSSGShaderFeatures shaderFeatures
QSSGRenderableObjectList sortedOpaqueObjects
std::optional< SkyboxCubeMapPass > skyboxCubeMapPass
QSSGRhiRenderableTexture * rhiScreenTexture
QSSGRenderableObjectList sortedScreenTextureObjects
const QSSGRhiRenderableTexture * rhiScreenTexture
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
Type passType() const final
QSSGRenderCamera * camera
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGBounds3 castingObjectsBox
QSSGShaderLightList globalLights
QSSGRenderableObjectList shadowPassObjects
QSSGRhiGraphicsPipelineState ps
QSSGBounds3 receivingObjectsBox
void resetForFrame() final
std::unique_ptr< QSSGRenderCamera > debugCamera
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
std::shared_ptr< QSSGRenderShadowMap > shadowMapManager
QRhiRenderPassDescriptor * rpDesc
QSSGRenderLayer * layer
void renderPass(QSSGRenderer &renderer) final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiShaderPipelinePtr skyBoxCubeShader
QSSGRhiGraphicsPipelineState ps
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QRhiRenderPassDescriptor * rpDesc
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
Type passType() const final
QSSGRenderLayer * layer
QSSGRhiGraphicsPipelineState ps
static void prep(const QSSGRenderContextInterface &ctx, QSSGLayerRenderData &data, QSSGPassKey passKey, QSSGRhiGraphicsPipelineState &ps, QSSGShaderFeatures shaderFeatures, QRhiRenderPassDescriptor *rpDesc, const QSSGRenderableObjectList &sortedTransparentObjects, bool oit=false)
QSSGRenderableObjectList sortedTransparentObjects
static void render(const QSSGRenderContextInterface &ctx, const QSSGRhiGraphicsPipelineState &ps, const QSSGRenderableObjectList &sortedTransparentObjects)
void renderPass(QSSGRenderer &renderer) final
QSSGShaderFeatures shaderFeatures
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QList< QSSGRenderExtension * > extensions
Type passType() const final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
bool hasData() const
void resetForFrame() final
void renderPass(QSSGRenderer &renderer) final
QSSGRenderableObjectList renderedOpaqueDepthPrepassObjects
Type passType() const final
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRenderableObjectList renderedDepthWriteObjects
QSSGLayerRenderPreparationResultFlag
static const char * effect_fragment_main_with_tonemapping
static const char * effect_vertex_main_post
static const char * effect_vertex_main_pre
static const char * effect_vertex_main_position
static const char * effect_fragment_main
QVector< QSSGRenderableObjectHandle > renderables
QSSGBakedLightingModel(const QSSGRenderModel *model, const QVector< QSSGRenderableObjectHandle > &renderables)
const QSSGRenderModel * model
QSSGDefaultMaterialPreparationResult(QSSGShaderDefaultMaterialKey inMaterialKey)
QSSGShaderDefaultMaterialKey materialKey
QRhiTextureRenderTarget * oitRenderTarget
QRhiRenderPassDescriptor * renderPassDescriptor