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
qssgrenderdata_p.h
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#ifndef QSSGRENDERDATA_P_H
5#define QSSGRENDERDATA_P_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 <QtGui/qmatrix4x4.h>
19
21
22#include <vector>
23#include <unordered_map>
24#include <memory>
25
27
28struct QSSGRenderNode;
29class QSSGRenderRoot;
30
31class QThreadPool;
32
33class QSGRenderContext;
34class QSGRenderer;
35
36// Per window node data
38{
40public:
46
48 {
51 };
52
54
56 using GlobalOpacityStore = std::vector<float>;
60
63
64 void reindex(QSSGRenderRoot *rootNode);
65
66 [[nodiscard]] quint32 version() const { return m_version; }
67
68 // NOTE: The node count is the number of nodes in the "world" tree.
69 // This is not the the same as the storage size. as some nodes
70 // may not be stored in the data or use the same storage location!
71 [[nodiscard]] size_t nodeCount() const { return m_nodeCount; }
72 [[nodiscard]] size_t storageSize() const { return m_size; }
73
74 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h, QMatrix4x4 defaultValue) const;
75 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h) const;
76 [[nodiscard]] QMatrix4x4 getGlobalTransform(const QSSGRenderNode &node) const;
77 [[nodiscard]] float getGlobalOpacity(QSSGRenderNodeHandle h, float defaultValue = 1.0f) const;
78 [[nodiscard]] float getGlobalOpacity(const QSSGRenderNode &node) const;
79 [[nodiscard]] InstanceTransforms getInstanceTransforms(QSSGRenderNodeHandle h) const;
80 [[nodiscard]] InstanceTransforms getInstanceTransforms(const QSSGRenderNode &node) const;
81
82 [[nodiscard]] LayerNodeView getLayerNodeView(QSSGRenderLayerHandle h) const;
83 [[nodiscard]] LayerNodeView getLayerNodeView(const QSSGRenderLayer &layer) const;
84
90
91#if QT_CONFIG(thread)
92 // NOTE: Thread pool for parallel processing of render data.
93 // This thread pool is not intended for async calls.
94 // For long running tasks use the global thread pool instead.
95 // (Threads executed here are expected to be done before the sync has ended).
96 const std::unique_ptr<QThreadPool> &threadPool() const;
97#endif // QT_CONFIG(thread)
98
99private:
100 void collectNodes(QSSGRenderRoot *rootNode);
101 void updateGlobalState();
102
103#if QT_CONFIG(thread)
105#endif // QT_CONFIG(thread)
106
107 size_t m_size = 0;
108 size_t m_nodeCount = 0;
109 quint32 m_version = 0;
110};
111
113
115{
116 QSSGRenderDataHelpers() = delete;
117public:
118 enum class Strategy
119 {
120 Initial, // Initial calculation of ALL global variables
121 Update, // Update calculation of ONLY changed global variables
122 };
123
130
132
133 /*!
134 \brief calcGlobalNodeData
135 \param node The node to calculate the global data for.
136 \param version The version of the node current node tree.
137 \param globalTransforms The global transforms store.
138 \param globalOpacities The global opacities store.
139 \return true if the data was updated, false otherwise.
140
141 The function is used to calculate the global node data for the given node.
142 It will use the given strategy to determine if it should calculate
143 the initial values or update the existing values based on the node's dirty state.
144
145 NOTE: This function assumes the output data is already allocated and can be directly
146 indexed!!!
147 */
148 template <Strategy strategy>
149 static bool calcGlobalNodeData(QSSGRenderNode *node,
150 const quint32 version,
151 QSSGGlobalRenderNodeData::GlobalTransformStore &globalTransforms,
152 QSSGGlobalRenderNodeData::GlobalOpacityStore &globalOpacities)
153 {
154 if constexpr (strategy == Strategy::Initial)
155 return calcGlobalVariablesIndexed(node, version, globalTransforms, globalOpacities);
156 else
157 return updateGlobalNodeDataIndexed(node, version, globalTransforms, globalOpacities);
158 }
159
160 /*!
161 \brief calcInstanceTransforms
162 \param node The node to calculate the instance transforms for.
163 \param version The version of the node current node tree.
164 \param globalTransforms The global transforms store.
165 \param instanceTransforms The instance transforms store.
166 \return true if the data was updated, false otherwise.
167
168 The function is used to calculate the instance transforms for the given node.
169
170 NOTE: This function assumes the output data is already allocated and can be directly
171 indexed!!!
172 */
173 static bool calcInstanceTransforms(QSSGRenderNode *node,
174 const quint32 version,
175 QSSGGlobalRenderNodeData::GlobalTransformStore &globalTransforms,
176 QSSGGlobalRenderNodeData::InstanceTransformStore &instanceTransforms);
177
178
179 /*!
180 \brief updateGlobalNodeState
181 \param node The node to update the global state for.
182 \param version The version of the node current node tree.
183 \return The result of the update.
184
185 The function is used to update the global state flagsfor the given node,
186 meaning the global active and pickable state of the node.
187 */
188 static GlobalStateResult updateGlobalNodeState(QSSGRenderNode *node, const quint32 version);
189private:
190 static bool updateGlobalNodeDataIndexed(QSSGRenderNode *node,
191 const quint32 version,
192 QSSGGlobalRenderNodeData::GlobalTransformStore &globalTransforms,
193 QSSGGlobalRenderNodeData::GlobalOpacityStore &globalOpacities);
194 static bool calcGlobalVariablesIndexed(QSSGRenderNode *node,
195 const quint32 version,
196 QSSGGlobalRenderNodeData::GlobalTransformStore &globalTransforms,
197 QSSGGlobalRenderNodeData::GlobalOpacityStore &globalOpacities);
198};
199
200// Per layer model data
202{
204public:
206
209
214
215 [[nodiscard]] ModelViewProjections getModelViewProjection(QSSGRenderModelHandle h) const;
216 [[nodiscard]] ModelViewProjections getModelViewProjection(const QSSGRenderModel &model) const;
217
218 [[nodiscard]] QMatrix3x3 getNormalMatrix(QSSGRenderModelHandle h, QMatrix3x3 defaultValue) const;
219 [[nodiscard]] QMatrix3x3 getNormalMatrix(const QSSGRenderModel &model) const;
220
221 [[nodiscard]] QSSGRenderMesh *getMesh(QSSGRenderModelHandle h) const;
222 [[nodiscard]] QSSGRenderMesh *getMesh(const QSSGRenderModel &model) const;
223
224 [[nodiscard]] MaterialList getMaterials(QSSGRenderModelHandle h) const;
225 [[nodiscard]] MaterialList getMaterials(const QSSGRenderModel &model) const;
226
227 [[nodiscard]] const QSSGGlobalRenderNodeDataPtr &globalNodeData() const { return m_gnd; }
228
229 void updateModelData(QSSGModelsView &models, QSSGRenderer *renderer, const QSSGRenderCameraDataList &renderCameraData);
230
231private:
232 ModelViewProjectionStore modelViewProjections;
233 NormalMatrixStore normalMatrices;
234 MeshStore meshes;
235 MaterialStore materials;
236
237 void prepareMeshData(const QSSGModelsView &models, QSSGRenderer *renderer);
238 void prepareMaterials(const QSSGModelsView &models);
239
241
242 quint32 m_version = 0;
243};
244
246{
248public:
251
254
256
257 [[nodiscard]] ModelViewProjections getModelViewProjection(QSSGRenderItem2DHandle h) const;
258 [[nodiscard]] ModelViewProjections getModelViewProjection(const QSSGRenderItem2D &item) const;
259
260 [[nodiscard]] Item2DRenderer getItem2DRenderer(const QSSGRenderItem2D &item) const;
262
263 [[nodiscard]] const QSSGGlobalRenderNodeDataPtr &globalNodeData() const { return m_gnd; }
264
265 void updateItem2DData(QSSGItem2DsView &items, QSSGRenderer *renderer, const QSSGRenderCameraDataList &renderCameraData);
266
267 void releaseRenderData(const QSSGRenderItem2D &item);
268 void releaseAll();
269
270private:
271 // The association between the 2D item and its renderer and render pass descriptor, is cached and has
272 // a strong connection to the item itself. We therefore use a map here. The other stores are
273 // indexed stores as those are pure data.
275
277
278 QPointer<QSGRenderContext> item2DRenderContext;
279 Item2DRendererStore item2DRenderers;
280 std::unique_ptr<QRhiRenderPassDescriptor> rpd;
281 ModelViewProjectionStore modelViewProjections;
282
283 const QMatrix4x4 flipMatrix { 1.0f, 0.0f, 0.0f, 0.0f,
284 0.0f, -1.0f, 0.0f, 0.0f,
285 0.0f, 0.0f, 1.0f, 0.0f,
286 0.0f, 0.0f, 0.0f, 1.0f };
287
288
289 quint32 m_version = 0;
290};
291
292QT_END_NAMESPACE
293
294#endif // QSSGRENDERDATA_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.
InstanceTransforms getInstanceTransforms(QSSGRenderNodeHandle h) const
float getGlobalOpacity(const QSSGRenderNode &node) const
LayerNodeView getLayerNodeView(const QSSGRenderLayer &layer) const
float getGlobalOpacity(QSSGRenderNodeHandle h, float defaultValue=1.0f) const
InstanceTransformStore instanceTransforms
GlobalOpacityStore globalOpacities
QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h) const
QMatrix4x4 getGlobalTransform(const QSSGRenderNode &node) const
LayerNodeView getLayerNodeView(QSSGRenderLayerHandle h) const
QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h, QMatrix4x4 defaultValue) const
InstanceTransforms getInstanceTransforms(const QSSGRenderNode &node) const
void reindex(QSSGRenderRoot *rootNode)
GlobalTransformStore globalTransforms
LayerNodeViewStore layerNodes
QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer)
const QSSGLayerRenderPreparationResultFlags & getFlags() const
static bool calcGlobalNodeData(QSSGRenderNode *node, const quint32 version, QSSGGlobalRenderNodeData::GlobalTransformStore &globalTransforms, QSSGGlobalRenderNodeData::GlobalOpacityStore &globalOpacities)
calcGlobalNodeData
static bool calcInstanceTransforms(QSSGRenderNode *node, const quint32 version, QSSGGlobalRenderNodeData::GlobalTransformStore &globalTransforms, QSSGGlobalRenderNodeData::InstanceTransformStore &instanceTransforms)
calcInstanceTransforms
static GlobalStateResult updateGlobalNodeState(QSSGRenderNode *node, const quint32 version)
updateGlobalNodeState
const std::unique_ptr< QRhiRenderPassDescriptor > & getItem2DRenderPassDescriptor() const
void releaseRenderData(const QSSGRenderItem2D &item)
void updateItem2DData(QSSGItem2DsView &items, QSSGRenderer *renderer, const QSSGRenderCameraDataList &renderCameraData)
Item2DRenderer getItem2DRenderer(const QSSGRenderItem2D &item) const
ModelViewProjections getModelViewProjection(QSSGRenderItem2DHandle h) const
const QSSGGlobalRenderNodeDataPtr & globalNodeData() const
ModelViewProjections getModelViewProjection(const QSSGRenderItem2D &item) const
void updateModelData(QSSGModelsView &models, QSSGRenderer *renderer, const QSSGRenderCameraDataList &renderCameraData)
QMatrix3x3 getNormalMatrix(QSSGRenderModelHandle h, QMatrix3x3 defaultValue) const
QMatrix3x3 getNormalMatrix(const QSSGRenderModel &model) const
QSSGRenderMesh * getMesh(QSSGRenderModelHandle h) const
const QSSGGlobalRenderNodeDataPtr & globalNodeData() const
MaterialList getMaterials(QSSGRenderModelHandle h) const
ModelViewProjections getModelViewProjection(QSSGRenderModelHandle h) const
QSSGRenderMesh * getMesh(const QSSGRenderModel &model) const
ModelViewProjections getModelViewProjection(const QSSGRenderModel &model) const
MaterialList getMaterials(const QSSGRenderModel &model) 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
std::shared_ptr< QSSGGlobalRenderNodeData > QSSGGlobalRenderNodeDataPtr
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