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
qssgrenderbuffermanager_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_RENDER_BUFFER_MANAGER_H
6#define QSSG_RENDER_BUFFER_MANAGER_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 <QtQuick3DRuntimeRender/private/qtquick3druntimerenderglobal_p.h>
20#include <QtQuick3DRuntimeRender/private/qssgrenderimagetexture_p.h>
21#include <QtQuick3DRuntimeRender/private/qssgrendermesh_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrendererutil_p.h>
23#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
24#include <QtQuick3DUtils/private/qssgmesh_p.h>
25
26#include <QtQuick3DUtils/private/qquick3dprofiler_p.h>
27
28#include <QtCore/QMutex>
29
31
32struct QSSGRenderMesh;
34class QSSGRhiContext;
35class QSSGMeshBVH;
36class QSGTexture;
39struct QSSGRenderModel;
40struct QSSGRenderImage;
42struct QSSGRenderLayer;
43struct QSSGRenderSkin;
44
45// There is one QSSGBufferManager per QSSGRenderContextInterface, and so per
46// QQuickWindow, and by extension, per scenegraph render thread. This is
47// essential here because graphics resources (vertex/index buffers, textures)
48// are always specific to one render thread, they cannot be used and shared
49// between different threads (and so windows). This is ensured by design, by
50// having a dedicated BufferManager for each render thread (window).
51
54
56{
57 bool wantsLightmapUVs = false;
60
62 {
63 // a mesh postprocessing request with no-lightmap-UVs is compatible
64 // with a previously processed mesh regardless of having generated
65 // lightmap UVs or not
67 return true;
68
69 // if lightmap UVs are wanted, the request can only use other's data
70 // if that generated lightmap UVs with the matching resolution
71 return other.wantsLightmapUVs && lightmapBaseResolution == other.lightmapBaseResolution;
72
73 // meshFileOverride plays no role here
74 }
75};
76
77class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGBufferManager
78{
79 Q_DISABLE_COPY(QSSGBufferManager)
80public:
86
91
92 struct ImageData {
94 QHash<QSSGRenderLayer*, uint32_t> usageCounts;
95 uint32_t generationId = 0;
96 };
97
98 struct MeshData {
99 QSSGRenderMesh *mesh = nullptr;
100 QHash<QSSGRenderLayer*, uint32_t> usageCounts;
101 uint32_t generationId = 0;
103 };
104
105 struct MemoryStats {
106 quint64 meshDataSize = 0;
108 };
109
116
118 LoadWithFlippedY = 0x01
119 };
120 Q_DECLARE_FLAGS(LoadRenderImageFlags, LoadRenderImageFlag)
121
124
125 void setRenderContextInterface(QSSGRenderContextInterface *ctx);
126
127 void releaseCachedResources();
128 // called on the destuction of a layer to release its referenced resources
129 void releaseResourcesForLayer(QSSGRenderLayer *layer);
130
131 QSSGRenderImageTexture loadRenderImage(const QSSGRenderImage *image,
132 MipMode inMipMode = MipModeFollowRenderImage,
133 LoadRenderImageFlags flags = LoadWithFlippedY);
134 QSSGRenderImageTexture loadLightmap(const QSSGRenderModel &model);
136
137 QSSGRenderMesh *getMeshForPicking(const QSSGRenderModel &model) const;
138 QSSGBounds3 getModelBounds(const QSSGRenderModel *model) const;
139
140 QSSGRenderMesh *loadMesh(const QSSGRenderModel *model);
141
142 // Called at the end of the frame to release unreferenced geometry and textures
143 void cleanupUnreferencedBuffers(quint32 frameId, QSSGRenderLayer *layer);
144 void resetUsageCounters(quint32 frameId, QSSGRenderLayer *layer);
145
146 void releaseGeometry(QSSGRenderGeometry *geometry);
147 void releaseTextureData(const QSSGRenderTextureData *data);
148 void releaseTextureData(const CustomImageCacheKey &key);
149 void releaseExtensionResult(const QSSGRenderExtension &rext);
150
151 void commitBufferResourceUpdates();
152
153 void processResourceLoader(const QSSGRenderResourceLoader *loader);
154
155 static std::unique_ptr<QSSGMeshBVH> loadMeshBVH(const QSSGRenderPath &inSourcePath);
156 static std::unique_ptr<QSSGMeshBVH> loadMeshBVH(QSSGRenderGeometry *geometry);
157
158 static QSSGMesh::Mesh loadMeshData(const QSSGRenderPath &inSourcePath);
159 QSSGMesh::Mesh loadMeshData(const QSSGRenderGeometry *geometry);
160
161 void registerExtensionResult(const QSSGRenderExtension &extensions, QRhiTexture *texture);
162
163 static QRhiTexture::Format toRhiFormat(const QSSGRenderTextureFormat format);
164
165 static void registerMeshData(const QString &assetId, const QVector<QSSGMesh::Mesh> &meshData);
166 static void unregisterMeshData(const QString &assetId);
167 static QString runtimeMeshSourceName(const QString &assetId, qsizetype meshId);
168 static QString primitivePath(const QString &primitive);
169
170 QMutex *meshUpdateMutex();
171
172 void increaseMemoryStat(QRhiTexture *texture);
173 void decreaseMemoryStat(QRhiTexture *texture);
174 void increaseMemoryStat(QSSGRenderMesh *mesh);
175 void decreaseMemoryStat(QSSGRenderMesh *mesh);
176
177 // Views for testing
178 const QHash<ImageCacheKey, ImageData> &getImageMap() const { return imageMap; }
179 const QHash<CustomImageCacheKey, ImageData> &getCustomTextureMap() const { return customTextureMap; }
180 const QHash<QSGTexture *, ImageData> &getSGImageMap() const { return qsgImageMap; }
181 const QHash<QSSGRenderPath, MeshData> &getMeshMap() const { return meshMap; }
182 const QHash<QSSGRenderGeometry *, MeshData> &getCustomMeshMap() const { return customMeshMap; }
183
184private:
185 void clear();
186 QRhiResourceUpdateBatch *meshBufferUpdateBatch();
187
188 static QSSGMesh::Mesh loadPrimitive(const QString &inRelativePath);
189 enum CreateRhiTextureFlag {
190 ScanForTransparency = 0x01,
191 CubeMap = 0x02,
192 Texture3D = 0x04
193 };
194 Q_DECLARE_FLAGS(CreateRhiTextureFlags, CreateRhiTextureFlag)
195 bool createRhiTexture(QSSGRenderImageTexture &texture,
196 const QSSGLoadedTexture *inTexture,
197 MipMode inMipMode,
198 CreateRhiTextureFlags inFlags,
199 const QString &debugObjectName);
200
201 QSSGRenderMesh *loadRenderMesh(const QSSGRenderPath &inSourcePath, QSSGMeshProcessingOptions options);
202 QSSGRenderMesh *loadRenderMesh(QSSGRenderGeometry *geometry, QSSGMeshProcessingOptions options);
203
204 QSSGRenderMesh *createRenderMesh(const QSSGMesh::Mesh &mesh, const QString &debugObjectName = {});
205 QSSGRenderImageTexture loadTextureData(QSSGRenderTextureData *data, MipMode inMipMode);
206 bool createEnvironmentMap(const QSSGLoadedTexture *inImage, QSSGRenderImageTexture *outTexture, const QString &debugObjectName);
207
208 void releaseMesh(const QSSGRenderPath &inSourcePath);
209 void releaseImage(const ImageCacheKey &key);
210
211 QSSGRenderContextInterface *m_contextInterface = nullptr; // ContextInterfaces owns BufferManager
212
213 // These store the actual buffer handles
214 QHash<ImageCacheKey, ImageData> imageMap; // Textures (specificed by path)
215 QHash<CustomImageCacheKey, ImageData> customTextureMap; // Textures (QQuick3DTextureData)
216 QHash<QSGTexture *, ImageData> qsgImageMap; // Textures (from Qt Quick)
217 QHash<const QSSGRenderExtension *, ImageData> renderExtensionTexture; // Textures (from QQuick3DRenderExtension)
218 QHash<QSSGRenderPath, MeshData> meshMap; // Meshes (specififed by path)
219 QHash<QSSGRenderGeometry *, MeshData> customMeshMap; // Meshes (QQuick3DGeometry)
220
221 QRhiResourceUpdateBatch *meshBufferUpdates = nullptr;
222 QMutex meshBufferMutex;
223
224 quint32 frameCleanupIndex = 0;
225 quint32 frameResetIndex = 0;
226 QSSGRenderLayer *currentLayer = nullptr;
227 MemoryStats stats;
228};
229
230Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGBufferManager::LoadRenderImageFlags)
231
232inline size_t qHash(const QSSGBufferManager::ImageCacheKey &k, size_t seed) Q_DECL_NOTHROW
233{
234 return qHash(k.path, seed) ^ k.mipMode ^ k.type;
235}
236
238{
239 return a.path == b.path && a.mipMode == b.mipMode && a.type == b.type;
240}
241
243{
244 return qHash(k.data, seed) ^ k.mipMode;
245}
246
248{
249 return a.data == b.data && a.mipMode == b.mipMode;
250}
251
253
254#endif
\inmodule QtCore
Definition qmutex.h:281
\inmodule QtGui
Definition qrhi.h:1731
\inmodule QtGui
Definition qrhi.h:895
Format
Specifies the texture format.
Definition qrhi.h:914
\inmodule QtQuick
Definition qsgtexture.h:20
Class representing 3D range or axis aligned bounding box.
const QHash< ImageCacheKey, ImageData > & getImageMap() const
const QHash< QSGTexture *, ImageData > & getSGImageMap() const
const QHash< CustomImageCacheKey, ImageData > & getCustomTextureMap() const
const QHash< QSSGRenderPath, MeshData > & getMeshMap() const
const QHash< QSSGRenderGeometry *, MeshData > & getCustomMeshMap() const
\inmodule QtQuick3D
\inmodule QtQuick3D
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
EGLContext ctx
b clear()
Combined button and popup list for selecting options.
Definition image.cpp:4
#define Q_DECL_NOTHROW
EGLOutputLayerEXT layer
#define Q_DECLARE_FLAGS(Flags, Enum)
Definition qflags.h:174
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
Definition qflags.h:194
GLboolean GLboolean GLboolean b
GLuint64 key
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLbitfield flags
GLenum GLuint texture
GLint GLsizei GLsizei GLenum format
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
Definition qrandom.cpp:196
bool operator==(const QSSGBufferManager::ImageCacheKey &a, const QSSGBufferManager::ImageCacheKey &b) Q_DECL_NOTHROW
size_t qHash(const QSSGBufferManager::ImageCacheKey &k, size_t seed) Q_DECL_NOTHROW
unsigned int quint32
Definition qtypes.h:50
unsigned long long quint64
Definition qtypes.h:61
ptrdiff_t qsizetype
Definition qtypes.h:165
unsigned int uint
Definition qtypes.h:34
static size_t imageDataSize(const xcb_image_t *image)
QSqlQueryModel * model
[16]
QSharedPointer< T > other(t)
[5]
QHash< QSSGRenderLayer *, uint32_t > usageCounts
QSSGRenderImageTexture renderImageTexture
QHash< QSSGRenderLayer *, uint32_t > usageCounts
bool isCompatible(const QSSGMeshProcessingOptions &other) const