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
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#include <QtCore/qhash.h>
30#include <QtCore/qsize.h>
31
33
34struct QSSGRenderMesh;
35struct QSSGLoadedTexture;
36class QSSGRhiContext;
37class QSSGMeshBVH;
38class QSGTexture;
39class QSSGRenderGeometry;
40class QSSGRenderTextureData;
41struct QSSGRenderModel;
42struct QSSGRenderImage;
43struct QSSGRenderResourceLoader;
44struct QSSGRenderLayer;
45struct QSSGRenderSkin;
46
47// There is one QSSGBufferManager per QSSGRenderContextInterface, and so per
48// QQuickWindow, and by extension, per scenegraph render thread. This is
49// essential here because graphics resources (vertex/index buffers, textures)
50// are always specific to one render thread, they cannot be used and shared
51// between different threads (and so windows). This is ensured by design, by
52// having a dedicated BufferManager for each render thread (window).
53
55class QQuick3DRenderExtension;
56
58{
61
62 inline bool isCompatible(const QSSGMeshProcessingOptions &other) const
63 {
64 // if lightmap UVs are wanted, the request can only use other's data
65 // if the lightmap key is identical
66 return lightmapPath == other.lightmapPath && lightmapKey == other.lightmapKey;
67 }
68};
69
70class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGBufferManager
71{
72 Q_DISABLE_COPY(QSSGBufferManager)
73public:
74 enum MipMode : quint8 {
75 MipModeFollowRenderImage,
76 MipModeEnable,
77 MipModeDisable,
78 MipModeBsdf
79 };
80
84 Q_DECLARE_FLAGS(LoadRenderImageFlags, LoadRenderImageFlag)
85
92
94 QSSGRenderTextureData *data;
97 };
98
104
111
116
118 ~QSSGBufferManager();
119
121
122 void releaseCachedResources();
123 // called on the destuction of a layer to release its referenced resources
124 void releaseResourcesForLayer(QSSGRenderLayer *layer);
125
126 QSSGRenderImageTexture loadRenderImage(const QSSGRenderImage *image,
127 MipMode inMipMode = MipModeFollowRenderImage,
128 LoadRenderImageFlags flags = LoadWithFlippedY);
129 QSSGRenderImageTexture loadLightmap(const QSSGRenderModel &model);
130 QSSGRenderImageTexture loadSkinmap(QSSGRenderTextureData *skin);
131
132 QSSGRenderMesh *getMeshForPicking(const QSSGRenderModel &model) const;
133 QSSGBounds3 getModelBounds(const QSSGRenderModel *model);
134
135 QSSGRenderMesh *loadMesh(const QSSGRenderModel &model);
136 QSSGMesh::Mesh loadLightmapMesh(const QSSGRenderModel &model);
137
138 // Called at the end of the frame to release unreferenced geometry and textures
139 void cleanupUnreferencedBuffers(quint32 frameId, QSSGRenderLayer *layer);
140 void resetUsageCounters(quint32 frameId, QSSGRenderLayer *layer);
141
142 void releaseGeometry(QSSGRenderGeometry *geometry);
143 void releaseTextureData(const QSSGRenderTextureData *data);
145 void releaseExtensionResult(const QSSGRenderExtension &rext);
146
148
149 void processResourceLoader(const QSSGRenderResourceLoader *loader);
150
151 static std::unique_ptr<QSSGMeshBVH> loadMeshBVH(const QSSGRenderPath &inSourcePath);
152 static std::unique_ptr<QSSGMeshBVH> loadMeshBVH(QSSGRenderGeometry *geometry);
153 static std::unique_ptr<QSSGMeshBVH> loadMeshBVH(const QSSGMesh::Mesh &mesh);
154
155 static QSSGMesh::Mesh loadMeshData(const QSSGRenderPath &inSourcePath);
156 QSSGMesh::Mesh loadMeshData(const QSSGRenderGeometry *geometry);
157
158 void registerExtensionResult(const QSSGRenderExtension &extensions, QRhiTexture *texture);
159
160 static QRhiTexture::Format toRhiFormat(const QSSGRenderTextureFormat format);
161
162 static void registerMeshData(const QString &assetId, const QVector<QSSGMesh::Mesh> &meshData);
163 static void unregisterMeshData(const QString &assetId);
164 static QString runtimeMeshSourceName(const QString &assetId, qsizetype meshId);
165 static QString primitivePath(const QString &primitive);
166
168
169 void increaseMemoryStat(QRhiTexture *texture);
170 void decreaseMemoryStat(QRhiTexture *texture);
173
174 // Views for testing
175 const QHash<ImageCacheKey, ImageData> &getImageMap() const { return imageMap; }
176 const QHash<CustomImageCacheKey, ImageData> &getCustomTextureMap() const { return customTextureMap; }
177 const QHash<QSGTexture *, ImageData> &getSGImageMap() const { return qsgImageMap; }
178 const QHash<QSSGRenderPath, MeshData> &getMeshMap() const { return meshMap; }
179 const QHash<QSSGRenderGeometry *, MeshData> &getCustomMeshMap() const { return customMeshMap; }
180
181 void setLightmapSource(const QString &source);
182 void setCurrentlyLightmapBaking(bool value);
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 setRhiTexture(QSSGRenderImageTexture &texture,
196 const QSSGLoadedTexture *inTexture,
197 MipMode inMipMode,
198 CreateRhiTextureFlags inFlags,
199 const QString &debugObjectName,
200 bool *wasTextureCreated = nullptr);
201
202 QSSGRenderMesh *loadRenderMesh(const QSSGRenderPath &inSourcePath, QSSGMeshProcessingOptions options);
203 QSSGRenderMesh *loadRenderMesh(QSSGRenderGeometry *geometry, QSSGMeshProcessingOptions options);
204
205 QSSGRenderMesh *createRenderMesh(const QSSGMesh::Mesh &mesh, const QString &debugObjectName = {});
206 QSSGRenderImageTexture loadTextureData(QSSGRenderTextureData *data, MipMode inMipMode);
207 bool createEnvironmentMap(const QSSGLoadedTexture *inImage, QSSGRenderImageTexture *outTexture, const QString &debugObjectName);
208
209 void releaseMesh(const QSSGRenderPath &inSourcePath);
210 void releaseImage(const ImageCacheKey &key);
211
212 QSSGRenderContextInterface *m_contextInterface = nullptr; // ContextInterfaces owns BufferManager
213
214 // These store the actual buffer handles
215 QHash<ImageCacheKey, ImageData> imageMap; // Textures (specificed by path)
216 QHash<CustomImageCacheKey, ImageData> customTextureMap; // Textures (QQuick3DTextureData)
217 QHash<QSGTexture *, ImageData> qsgImageMap; // Textures (from Qt Quick)
218 QHash<const QSSGRenderExtension *, ImageData> renderExtensionTexture; // Textures (from QQuick3DRenderExtension)
219 QHash<QSSGRenderPath, MeshData> meshMap; // Meshes (specififed by path)
220 QHash<QSSGRenderGeometry *, MeshData> customMeshMap; // Meshes (QQuick3DGeometry)
221
222 QRhiResourceUpdateBatch *meshBufferUpdates = nullptr;
223 QMutex meshBufferMutex;
224
225 quint32 frameCleanupIndex = 0;
226 quint32 frameResetIndex = 0;
227 QSSGRenderLayer *currentLayer = nullptr;
228 MemoryStats stats;
229
230 QString lightmapSource;
231 bool lightmapFileValid = false;
232 bool lightmapSourceDirty = true;
233 bool currentlyLightmapBaking = false;
234 bool validateLightmap();
235};
236
237Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGBufferManager::LoadRenderImageFlags)
238
239inline size_t qHash(const QSSGBufferManager::ImageCacheKey &k, size_t seed) Q_DECL_NOTHROW
240{
241 return qHash(k.path, seed) ^ k.mipMode ^ k.type ^ qHash(k.key, seed);
242}
243
244inline bool operator==(const QSSGBufferManager::ImageCacheKey &a, const QSSGBufferManager::ImageCacheKey &b) Q_DECL_NOTHROW
245{
246 return a.path == b.path && a.mipMode == b.mipMode && a.type == b.type && a.key == b.key;
247}
248
249size_t qHash(const QSSGBufferManager::CustomImageCacheKey &k, size_t seed) noexcept;
250
251inline bool operator==(const QSSGBufferManager::CustomImageCacheKey &a, const QSSGBufferManager::CustomImageCacheKey &b) Q_DECL_NOTHROW
252{
253 return a.data == b.data && a.pixelSize == b.pixelSize && a.mipMode == b.mipMode;
254}
255
256QT_END_NAMESPACE
257
258#endif
void decreaseMemoryStat(QSSGRenderMesh *mesh)
void setRenderContextInterface(QSSGRenderContextInterface *ctx)
QSSGRenderImageTexture loadSkinmap(QSSGRenderTextureData *skin)
void increaseMemoryStat(QSSGRenderMesh *mesh)
static std::unique_ptr< QSSGMeshBVH > loadMeshBVH(const QSSGRenderPath &inSourcePath)
const QHash< ImageCacheKey, ImageData > & getImageMap() const
void releaseGeometry(QSSGRenderGeometry *geometry)
const QHash< QSGTexture *, ImageData > & getSGImageMap() const
const QHash< CustomImageCacheKey, ImageData > & getCustomTextureMap() const
static QRhiTexture::Format toRhiFormat(const QSSGRenderTextureFormat format)
void increaseMemoryStat(QRhiTexture *texture)
static std::unique_ptr< QSSGMeshBVH > loadMeshBVH(QSSGRenderGeometry *geometry)
void releaseResourcesForLayer(QSSGRenderLayer *layer)
void cleanupUnreferencedBuffers(quint32 frameId, QSSGRenderLayer *layer)
QSSGRenderMesh * getMeshForPicking(const QSSGRenderModel &model) const
static QSSGMesh::Mesh loadMeshData(const QSSGRenderPath &inSourcePath)
QSSGMesh::Mesh loadLightmapMesh(const QSSGRenderModel &model)
QSSGMesh::Mesh loadMeshData(const QSSGRenderGeometry *geometry)
QSSGRenderImageTexture loadRenderImage(const QSSGRenderImage *image, MipMode inMipMode=MipModeFollowRenderImage, LoadRenderImageFlags flags=LoadWithFlippedY)
void registerExtensionResult(const QSSGRenderExtension &extensions, QRhiTexture *texture)
QSSGRenderMesh * loadMesh(const QSSGRenderModel &model)
static void unregisterMeshData(const QString &assetId)
static QString primitivePath(const QString &primitive)
void releaseTextureData(const QSSGRenderTextureData *data)
void releaseExtensionResult(const QSSGRenderExtension &rext)
QSSGRenderImageTexture loadLightmap(const QSSGRenderModel &model)
void setLightmapSource(const QString &source)
static void registerMeshData(const QString &assetId, const QVector< QSSGMesh::Mesh > &meshData)
const QHash< QSSGRenderPath, MeshData > & getMeshMap() const
void setCurrentlyLightmapBaking(bool value)
void decreaseMemoryStat(QRhiTexture *texture)
static QString runtimeMeshSourceName(const QString &assetId, qsizetype meshId)
void resetUsageCounters(quint32 frameId, QSSGRenderLayer *layer)
QSSGBounds3 getModelBounds(const QSSGRenderModel *model)
void releaseTextureData(const CustomImageCacheKey &key)
const QHash< QSSGRenderGeometry *, MeshData > & getCustomMeshMap() const
void processResourceLoader(const QSSGRenderResourceLoader *loader)
friend class QSSGRenderContextInterface
QHash< QSSGRenderLayer *, uint32_t > usageCounts
QHash< QSSGRenderLayer *, uint32_t > usageCounts
bool isCompatible(const QSSGMeshProcessingOptions &other) const
QSSGRenderMesh(QSSGRenderDrawMode inDrawMode, QSSGRenderWinding inWinding)
std::unique_ptr< QSSGMeshBVH > bvh
QSSGRenderDrawMode drawMode
QSSGRenderWinding winding
QSSGRhiBufferPtr indexBuffer
QSSGRhiInputAssemblerState ia
quint32 lodOffset(int lodLevel) const
QSSGMeshBVHNode::Handle bvhRoot
quint32 lodCount(int lodLevel) const
QVector< Lod > lods
QSSGRenderSubset & operator=(const QSSGRenderSubset &inOther)
QRhiTexture * targetsTexture
QSSGRhiBufferPtr vertexBuffer
QSSGRenderSubset(const QSSGRenderSubset &inOther)
QSSGRenderSubset()=default