5#ifndef QSSG_RENDER_BUFFER_MANAGER_H
6#define QSSG_RENDER_BUFFER_MANAGER_H
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>
26#include <QtQuick3DUtils/private/qquick3dprofiler_p.h>
28#include <QtCore/QMutex>
29#include <QtCore/qhash.h>
30#include <QtCore/qsize.h>
35struct QSSGLoadedTexture;
39class QSSGRenderGeometry;
40class QSSGRenderTextureData;
41struct QSSGRenderModel;
42struct QSSGRenderImage;
43struct QSSGRenderResourceLoader;
44struct QSSGRenderLayer;
55class QQuick3DRenderExtension;
66 return lightmapPath == other.lightmapPath && lightmapKey == other.lightmapKey;
72 Q_DISABLE_COPY(QSSGBufferManager)
74 enum MipMode : quint8 {
75 MipModeFollowRenderImage,
94 QSSGRenderTextureData *
data;
118 ~QSSGBufferManager();
122 void releaseCachedResources();
162 static void registerMeshData(
const QString &assetId,
const QVector<QSSGMesh::Mesh> &meshData);
186 QRhiResourceUpdateBatch *meshBufferUpdateBatch();
188 static QSSGMesh::Mesh loadPrimitive(
const QString &inRelativePath);
189 enum CreateRhiTextureFlag {
190 ScanForTransparency = 0x01,
194 Q_DECLARE_FLAGS(CreateRhiTextureFlags, CreateRhiTextureFlag)
195 bool setRhiTexture(QSSGRenderImageTexture &texture,
196 const QSSGLoadedTexture *inTexture,
198 CreateRhiTextureFlags inFlags,
199 const QString &debugObjectName,
200 bool *wasTextureCreated =
nullptr);
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);
209 void releaseMesh(
const QSSGRenderPath &inSourcePath);
215 QHash<ImageCacheKey, ImageData> imageMap;
216 QHash<CustomImageCacheKey, ImageData> customTextureMap;
217 QHash<QSGTexture *, ImageData> qsgImageMap;
218 QHash<
const QSSGRenderExtension *, ImageData> renderExtensionTexture;
219 QHash<QSSGRenderPath, MeshData> meshMap;
220 QHash<QSSGRenderGeometry *, MeshData> customMeshMap;
222 QRhiResourceUpdateBatch *meshBufferUpdates =
nullptr;
223 QMutex meshBufferMutex;
225 quint32 frameCleanupIndex = 0;
226 quint32 frameResetIndex = 0;
227 QSSGRenderLayer *currentLayer =
nullptr;
230 QString lightmapSource;
231 bool lightmapFileValid =
false;
232 bool lightmapSourceDirty =
true;
233 bool currentlyLightmapBaking =
false;
234 bool validateLightmap();
237Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGBufferManager::LoadRenderImageFlags)
239inline size_t qHash(
const QSSGBufferManager::ImageCacheKey &k, size_t seed) Q_DECL_NOTHROW
241 return qHash(k.path, seed) ^ k.mipMode ^ k.type ^ qHash(k.key, seed);
244inline bool operator==(
const QSSGBufferManager::ImageCacheKey &a,
const QSSGBufferManager::ImageCacheKey &b) Q_DECL_NOTHROW
246 return a.path == b.path && a.mipMode == b.mipMode && a.type == b.type && a.key == b.key;
249size_t qHash(
const QSSGBufferManager::CustomImageCacheKey &k, size_t seed)
noexcept;
251inline bool operator==(
const QSSGBufferManager::CustomImageCacheKey &a,
const QSSGBufferManager::CustomImageCacheKey &b) Q_DECL_NOTHROW
253 return a.data == b.data && a.pixelSize == b.pixelSize && a.mipMode == b.mipMode;
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 commitBufferResourceUpdates()
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)
QMutex * meshUpdateMutex()
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
QSSGRenderTextureData * data
QHash< QSSGRenderLayer *, uint32_t > usageCounts
QSSGRenderImageTexture renderImageTexture
QSSGMeshProcessingOptions options
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
QSSGRenderSubset & operator=(const QSSGRenderSubset &inOther)
QRhiTexture * targetsTexture
QSSGRhiBufferPtr vertexBuffer
QSSGRenderSubset(const QSSGRenderSubset &inOther)
QSSGRenderSubset()=default