Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
24
25class QSSGShaderCache;
31struct QSSGRenderNode;
32struct QSSGRenderItem2D;
33struct QSSGRenderRay;
37
38class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRenderer
39{
40 Q_DISABLE_COPY(QSSGRenderer)
41public:
44
45 // Returns true if this layer or a sibling was dirty.
46 bool prepareLayerForRender(QSSGRenderLayer &inLayer);
47
48 void rhiPrepare(QSSGRenderLayer &inLayer);
49 void rhiRender(QSSGRenderLayer &inLayer);
50
51 // Clients need to call this every frame in order for various subsystems to release
52 // temporary per-frame allocated objects.
53 void beginFrame(QSSGRenderLayer &layer, bool allowRecursion = true);
54
55 // When allowRecursion is true, the cleanup is only done when all
56 // beginFrames got their corresponding endFrame. This is indicated by the
57 // return value (false if nothing's been done due to pending "frames")
58 bool endFrame(QSSGRenderLayer &layer, bool allowRecursion = true);
59
60 // Get the number of times EndFrame has been called
61 [[nodiscard]] constexpr quint32 frameCount() const { return m_frameCount; }
62
63 void setViewport(QRect inViewport) { m_viewport = inViewport; }
64 QRect viewport() const { return m_viewport; }
65
66 void setDpr(float dpr) { m_dpr = dpr; }
67 float dpr() const { return m_dpr; }
68
69 void setScissorRect(QRect inScissorRect) { m_scissorRect = inScissorRect; }
70 QRect scissorRect() const { return m_scissorRect; }
71
72 const std::unique_ptr<QSSGRhiQuadRenderer> &rhiQuadRenderer() const;
73 const std::unique_ptr<QSSGRhiCubeRenderer> &rhiCubeRenderer() const;
74
75 QSSGRenderContextInterface *contextInterface() const { return m_contextInterface; }
76
77protected:
78 void cleanupResources(QList<QSSGRenderGraphObject*> &resources);
79 void cleanupResources(QSet<QSSGRenderGraphObject*> &resources);
80
81private:
82 friend class QSSGRendererPrivate;
83 friend class QSSGLayerRenderData;
87
88 QSSGLayerRenderData *getOrCreateLayerRenderData(QSSGRenderLayer &layer);
89 void beginLayerRender(QSSGLayerRenderData &inLayer);
90 void endLayerRender();
91 void addMaterialDirtyClear(QSSGRenderGraphObject *material);
92 void cleanupUnreferencedBuffers(QSSGRenderLayer *inLayer);
93 void resetResourceCounters(QSSGRenderLayer *inLayer);
94 void releaseCachedResources();
95
96 QSSGRenderContextInterface *m_contextInterface = nullptr; // We're own by the context interface
97
98 bool m_globalPickingEnabled = false;
99
100 // Temporary information stored only when rendering a particular layer.
101 QSSGLayerRenderData *m_currentLayer = nullptr;
102 QByteArray m_generatedShaderString;
103
104 QSet<QSSGRenderGraphObject *> m_materialClearDirty;
105
106 mutable std::unique_ptr<QSSGRhiQuadRenderer> m_rhiQuadRenderer;
107 mutable std::unique_ptr<QSSGRhiCubeRenderer> m_rhiCubeRenderer;
108
109 quint32 m_activeFrameRef = 0;
110 quint32 m_frameCount = 0;
111
112 // Viewport that this render context should use
113 QRect m_viewport;
114 float m_dpr = 1.0;
115 QRect m_scissorRect;
116};
117
118class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRendererPrivate
119{
120 QSSGRendererPrivate() = default;
121public:
122 using PickResultList = QVarLengthArray<QSSGRenderPickResult, 20>; // Lets assume most items are filtered out already
123
124 static QSSGRhiShaderPipelinePtr generateRhiShaderPipelineImpl(QSSGSubsetRenderable &renderable,
125 QSSGShaderLibraryManager &shaderLibraryManager,
126 QSSGShaderCache &shaderCache,
127 QSSGProgramGenerator &shaderProgramGenerator,
128 const QSSGShaderDefaultMaterialKeyProperties &shaderKeyProperties,
129 const QSSGShaderFeatures &featureSet,
130 QByteArray &shaderString);
131 static QSSGRhiShaderPipelinePtr generateRhiShaderPipeline(QSSGRenderer &renderer,
132 QSSGSubsetRenderable &inRenderable,
133 const QSSGShaderFeatures &inFeatureSet);
134
135 static QSSGRhiShaderPipelinePtr getShaderPipelineForDefaultMaterial(QSSGRenderer &renderer,
136 QSSGSubsetRenderable &inRenderable,
137 const QSSGShaderFeatures &inFeatureSet);
138
139 static void getLayerHitObjectList(const QSSGRenderLayer &layer,
140 QSSGBufferManager &bufferManager,
141 const QSSGRenderRay &ray,
142 bool inPickEverything,
143 PickResultList &outIntersectionResult);
144 static void intersectRayWithSubsetRenderable(QSSGBufferManager &bufferManager,
145 const QSSGRenderRay &inRay,
146 const QSSGRenderNode &node,
147 PickResultList &outIntersectionResultList);
148 static void intersectRayWithItem2D(const QSSGRenderRay &inRay,
149 const QSSGRenderItem2D &item2D,
150 PickResultList &outIntersectionResultList);
151
152 static PickResultList syncPickAll(const QSSGRenderContextInterface &ctx,
153 const QSSGRenderLayer &layer,
154 const QSSGRenderRay &ray);
155
156 static PickResultList syncPick(const QSSGRenderContextInterface &ctx,
157 const QSSGRenderLayer &layer,
158 const QSSGRenderRay &ray,
159 QSSGRenderNode *target = nullptr);
160
161 static PickResultList syncPickSubset(const QSSGRenderLayer &layer,
162 QSSGBufferManager &bufferManager,
163 const QSSGRenderRay &ray,
164 QVarLengthArray<QSSGRenderNode *> subset);
165
166 // Setting this true enables picking for all the models, regardless of
167 // the models pickable property.
168 static bool isGlobalPickingEnabled(const QSSGRenderer &renderer) { return renderer.m_globalPickingEnabled; }
169 static void setGlobalPickingEnabled(QSSGRenderer &renderer, bool isEnabled);
170
171 static void setRenderContextInterface(QSSGRenderer &renderer, QSSGRenderContextInterface *ctx);
172};
173
175
176#endif // QSSG_RENDERER_P_H
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore\reentrant
Definition qrect.h:30
static bool isGlobalPickingEnabled(const QSSGRenderer &renderer)
float dpr() const
QRect scissorRect() const
QRect viewport() const
void setViewport(QRect inViewport)
constexpr quint32 frameCount() const
void setDpr(float dpr)
void setScissorRect(QRect inScissorRect)
QSSGRenderContextInterface * contextInterface() const
EGLContext ctx
Combined button and popup list for selecting options.
EGLOutputLayerEXT layer
GLenum target
static QT_BEGIN_NAMESPACE qreal dpr(const QWindow *w)
std::shared_ptr< QSSGRhiShaderPipeline > QSSGRhiShaderPipelinePtr
unsigned int quint32
Definition qtypes.h:50
QSvgRenderer * renderer
[0]