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// Qt-Security score:significant reason:default
5
6
7#ifndef QSSG_RENDERER_P_H
8#define QSSG_RENDERER_P_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 <private/qssgrenderpickresult_p.h>
22#include <private/qssgrhicontext_p.h>
23#include <private/qssgrhiquadrenderer_p.h>
24
25#include <QtCore/qpointer.h>
26
27#include <vector>
28
29QT_BEGIN_NAMESPACE
30
31class QSSGShaderCache;
32class QSSGProgramGenerator;
33class QSSGShaderLibraryManager;
34class QSSGBufferManager;
37struct QSSGRenderNode;
38struct QSSGRenderItem2D;
39struct QSSGRenderRay;
40class QSSGSubsetRenderable;
42struct QSSGShaderFeatures;
44class QSGRenderContext;
45class QSSGFrustum;
47
48class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRenderer
49{
50 Q_DISABLE_COPY(QSSGRenderer)
51public:
52 QSSGRenderer();
53 ~QSSGRenderer();
54
55 // Returns true if this layer or a sibling was dirty.
56 bool prepareLayerForRender(QSSGRenderLayer &inLayer);
57
58 void rhiPrepare(QSSGRenderLayer &inLayer);
59 void rhiRender(QSSGRenderLayer &inLayer);
60
61 // Clients need to call this every frame in order for various subsystems to release
62 // temporary per-frame allocated objects.
63 void beginFrame(QSSGRenderLayer &layer, bool allowRecursion = true);
64
65 // When allowRecursion is true, the cleanup is only done when all
66 // beginFrames got their corresponding endFrame. This is indicated by the
67 // return value (false if nothing's been done due to pending "frames")
68 bool endFrame(QSSGRenderLayer &layer, bool allowRecursion = true);
69
70 // Get the number of times EndFrame has been called
71 [[nodiscard]] constexpr quint32 frameCount() const { return m_frameCount; }
72
73 void setViewport(QRect inViewport) { m_viewport = inViewport; }
74 QRect viewport() const { return m_viewport; }
75
76 void setDpr(float dpr) { m_dpr = dpr; }
77 float dpr() const { return m_dpr; }
78
79 void setScissorRect(QRect inScissorRect) { m_scissorRect = inScissorRect; }
80 QRect scissorRect() const { return m_scissorRect; }
81
82 quint32 frameDepth() const { return m_activeFrameRef; }
83
86
87 QSSGRenderContextInterface *contextInterface() const { return m_contextInterface; }
88
89 // Before we start rendering a sublayer(s), e.g., Item2D with View3Ds,
90 // we need to inform the renderer about it, so we can restore the state as we
91 // return from the sublayer(s) rendering. The state will be saved in the data set
92 // for the layer.
95
96 void releaseItem2DData(const QSSGRenderItem2D &item2D);
97
98protected:
99 void cleanupResources(QList<QSSGRenderGraphObject*> &resources);
100 void cleanupResources(QSet<QSSGRenderGraphObject*> &resources);
101
102private:
103 friend class QSSGRendererPrivate;
108 friend class QSSGCleanupObject;
110
111 QSSGLayerRenderData *getOrCreateLayerRenderData(QSSGRenderLayer &layer);
112 void beginLayerRender(QSSGLayerRenderData &inLayer);
113 void endLayerRender();
114 void addMaterialDirtyClear(QSSGRenderGraphObject *material);
115 void cleanupUnreferencedBuffers(QSSGRenderLayer *inLayer);
116 void resetResourceCounters(QSSGRenderLayer *inLayer);
117 void releaseCachedResources();
118
119 void registerItem2DData(QSSGRenderItem2DData &data);
120 void unregisterItem2DData(QSSGRenderItem2DData &data);
121
122 QSSGRenderContextInterface *m_contextInterface = nullptr; // We're own by the context interface
123
124 bool m_globalPickingEnabled = false;
125
126 // Temporary information stored only when rendering a particular layer.
127 QSSGLayerRenderData *m_currentLayer = nullptr;
128
129 QSet<QSSGRenderGraphObject *> m_materialClearDirty;
130
131 QPointer<QSGRenderContext> m_qsgRenderContext;
132
133 // Item2D data (per layer).
134 // Note that the data is own by the layer.
135 std::vector<QSSGRenderItem2DData *> m_item2DDatas;
136
137 mutable std::unique_ptr<QSSGRhiQuadRenderer> m_rhiQuadRenderer;
138 mutable std::unique_ptr<QSSGRhiCubeRenderer> m_rhiCubeRenderer;
139
140 quint32 m_activeFrameRef = 0;
141 quint32 m_frameCount = 0;
142
143 // Viewport that this render context should use
144 QRect m_viewport;
145 float m_dpr = 1.0;
146 QRect m_scissorRect;
147};
148
149class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRendererPrivate
150{
151 QSSGRendererPrivate() = default;
152public:
153 using PickResultList = QVarLengthArray<QSSGRenderPickResult, 20>; // Lets assume most items are filtered out already
154
155 static QSSGRhiShaderPipelinePtr generateRhiShaderPipelineImpl(QSSGSubsetRenderable &renderable,
156 QSSGShaderLibraryManager &shaderLibraryManager,
157 QSSGShaderCache &shaderCache,
158 QSSGProgramGenerator &shaderProgramGenerator,
159 const QSSGShaderDefaultMaterialKeyProperties &shaderKeyProperties,
160 const QSSGShaderFeatures &featureSet,
161 const QSSGUserShaderAugmentation &shaderAugmentation,
162 QByteArray &shaderString);
163 static QSSGRhiShaderPipelinePtr generateRhiShaderPipeline(QSSGRenderer &renderer,
164 QSSGSubsetRenderable &inRenderable,
165 const QSSGShaderFeatures &inFeatureSet,
166 const QSSGUserShaderAugmentation &shaderAugmentation);
167
168 static QSSGRhiShaderPipelinePtr getShaderPipelineForDefaultMaterial(QSSGRenderer &renderer,
169 QSSGSubsetRenderable &inRenderable,
170 const QSSGShaderFeatures &inFeatureSet,
171 const QSSGUserShaderAugmentation &shaderAugmentation);
172
173 static void getLayerHitObjectList(const QSSGRenderLayer &layer,
174 QSSGBufferManager &bufferManager,
175 const QSSGRenderRay &ray,
176 bool inPickEverything,
177 PickResultList &outIntersectionResult);
178 static void intersectRayWithSubsetRenderable(const QSSGRenderLayer &layer, QSSGBufferManager &bufferManager,
179 const QSSGRenderRay &inRay,
180 const QSSGRenderNode &node,
181 PickResultList &outIntersectionResultList);
182 static void intersectRayWithItem2D(const QSSGRenderLayer &layer, const QSSGRenderRay &inRay,
183 const QSSGRenderItem2D &item2D,
184 PickResultList &outIntersectionResultList);
185
186 static std::optional<QSSGRenderPickResult> closestPointOnSubsetRenderable(const QSSGRenderLayer &layer,
187 QSSGBufferManager &bufferManager,
188 const QVector3D &center,
189 float radiusSquared,
190 const QSSGRenderNode &node);
191
192 static PickResultList syncPickAll(const QSSGRenderContextInterface &ctx,
193 const QSSGRenderLayer &layer,
194 const QSSGRenderRay &ray);
195
196 static PickResultList syncPick(const QSSGRenderContextInterface &ctx,
197 const QSSGRenderLayer &layer,
198 const QSSGRenderRay &ray,
199 QSSGRenderNode *target = nullptr);
200
201 static PickResultList syncPickSubset(const QSSGRenderLayer &layer,
202 QSSGBufferManager &bufferManager,
203 const QSSGRenderRay &ray,
204 QVarLengthArray<QSSGRenderNode *> subset);
205
206 static std::optional<QSSGRenderPickResult> syncPickClosestPoint(const QSSGRenderContextInterface &ctx,
207 const QSSGRenderLayer &layer,
208 const QVector3D &center,
209 const float radiusSquared,
210 QSSGRenderNode *target = nullptr);
211
212 static QList<const QSSGRenderNode *> syncPickInFrustum(const QSSGRenderContextInterface &ctx,
213 const QSSGRenderLayer &layer,
214 const QSSGFrustum &frustum);
215
216 // Setting this true enables picking for all the models, regardless of
217 // the models pickable property.
218 static bool isGlobalPickingEnabled(const QSSGRenderer &renderer) { return renderer.m_globalPickingEnabled; }
219 static void setGlobalPickingEnabled(QSSGRenderer &renderer, bool isEnabled);
220
221 static void setRenderContextInterface(QSSGRenderer &renderer, QSSGRenderContextInterface *ctx);
222 static void setSgRenderContext(QSSGRenderer &renderer, QSGRenderContext *sgRenderCtx);
223
224 static QSSGLayerRenderData *getCurrentRenderData(const QSSGRenderer &renderer) { return renderer.m_currentLayer; }
225
226 static QSGRenderContext *getSgRenderContext(const QSSGRenderer &renderer);
227
228 static constexpr float minimumRenderOpacity = .01f;
229};
230
231QT_END_NAMESPACE
232
233#endif // QSSG_RENDERER_P_H
QSSGRhiShaderPipelinePtr debugObjectShader
QSSGRhiGraphicsPipelineState ps
Type passType() const final
void resetForFrame() final
QSSGRhiGraphicsPipelineState ps
QSSGRenderLayer * layer
QSSGRhiShaderPipelinePtr gridShader
void resetForFrame() final
Type passType() const final
Type passType() const final
std::vector< QSGRenderer * > prepdItem2DRenderers
void resetForFrame() final
static constexpr int MaxBuckets
QSSGRhiGraphicsPipelineState ps
QSSGRenderMotionVectorMapPtr motionVectorMapManager
QSSGRenderableObjectList motionVectorPassObjects[MaxBuckets]
Type passType() const final
QSSGRhiRenderableTexture * rhiMotionVectorTexture
QSSGRenderCamera * camera
QSSGShaderFeatures shaderFeatures
QSSGRhiRenderableTexture * rhiABufferImage
QSSGRhiRenderableTexture * rhiAccumTexture
QRhiShaderResourceBindings * compositeSrb
QSSGRhiShaderPipelinePtr compositeShaderPipeline
QRhiBuffer * rhiAuxBuffer
QSSGRhiRenderableTexture * rhiAuxiliaryImage
QSSGRenderLayer::OITMethod method
QRhiBuffer * rhiABuffer
void resetForFrame() final
Type passType() const final
QSSGRhiRenderableTexture * rhiRevealageTexture
QSSGRhiGraphicsPipelineState ps
void setMethod(QSSGRenderLayer::OITMethod m)
QSSGRhiRenderableTexture * rhiRevealageTexture
QRhiResourceUpdateBatch * rub
void setMethod(QSSGRenderLayer::OITMethod m)
QSSGRhiRenderableTexture * rhiABufferImage
QList< QRhiReadbackResult * > results
QRhiBuffer * rhiABuffer
quint32 reportedNodeCount
QSSGShaderFeatures shaderFeatures
QSSGRenderLayer::OITMethod method
QRhiShaderResourceBindings * clearSrb
QSSGRenderableObjectList sortedTransparentObjects
QSSGRhiRenderableTexture * rhiAuxiliaryImage
QSSGRhiRenderableTexture * rhiCounterImage
QRhiTextureRenderTarget * renderTarget
QRhiBuffer * rhiAuxBuffer
void resetForFrame() final
QSSGRhiShaderPipelinePtr clearPipeline
QSSGRhiRenderableTexture * rhiDepthTexture
QSSGRhiGraphicsPipelineState ps
QRhiTexture * readbackImage
Type passType() const final
QRhiBuffer * rhiCounterBuffer
QSSGRhiRenderableTexture * rhiAccumTexture
static void prep(const QSSGRenderContextInterface &ctx, QSSGLayerRenderData &data, QSSGPassKey passKey, QSSGRhiGraphicsPipelineState &ps, QSSGShaderFeatures shaderFeatures, QRhiRenderPassDescriptor *rpDesc, const QSSGRenderableObjectList &sortedOpaqueObjects)
void resetForFrame() final
Type passType() const 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
friend class QSSGParticleRenderer
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 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 resetForFrame() final
QSSGRhiShaderPipelinePtr ssaoShaderPipeline
QSSGAmbientOcclusionSettings aoSettings
const QSSGRenderCamera * camera
QSSGRhiGraphicsPipelineState ps
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
QSSGRhiGraphicsPipelineState ps
Type passType() const final
QSSGRenderCamera * camera
QSSGBounds3 castingObjectsBox
QSSGShaderLightList globalLights
QSSGRenderableObjectList shadowPassObjects
QSSGRhiGraphicsPipelineState ps
QSSGBounds3 receivingObjectsBox
void resetForFrame() final
std::unique_ptr< QSSGRenderCamera > debugCamera
Type passType() const final
std::shared_ptr< QSSGRenderShadowMap > shadowMapManager
QRhiRenderPassDescriptor * rpDesc
QSSGRenderLayer * layer
QSSGRhiShaderPipelinePtr skyBoxCubeShader
QSSGRhiGraphicsPipelineState ps
void resetForFrame() final
Type passType() const final
void resetForFrame() final
QRhiRenderPassDescriptor * rpDesc
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)
QSSGShaderFeatures shaderFeatures
QSSGRhiGraphicsPipelineState ps
void resetForFrame() final
Type passType() const final
Type passType() const final
QList< QSSGRenderExtension * > extensions
void resetForFrame() final
bool hasData() const
void resetForFrame() final
static constexpr size_t MAX_SUBPASS_DEPTH
QList< QSSGRenderUserPass * > userPasses
std::vector< UserPassData > userPassData
Type passType() const final
std::set< QSSGResourceId > visitedPasses
void resetForFrame() final
QSSGRenderableObjectList renderedOpaqueDepthPrepassObjects
Type passType() const final
QSSGRhiGraphicsPipelineState ps
QSSGRenderableObjectList renderedDepthWriteObjects
QSSGRenderResult::Key toInternalRenderResultKey(QSSGFrameData::RenderResult id)
Combined button and popup list for selecting options.
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
QSSGRhiRenderableTextureV2Ptr renderableTexture
std::optional< SkyboxCubeMapPass > skyboxCubeMapPass
std::vector< UserPassData > subPassData
QSSGRhiGraphicsPipelineState ps
QSSGShaderDefineList shaderDefines
QRhiDepthStencilClearValue depthStencilClearValue
QSSGRenderableObjectList renderables
std::optional< SkyboxPass > skyboxPass
std::optional< Item2DPass > item2DPass