7#ifndef QSSG_RENDER_BUFFER_MANAGER_H
8#define QSSG_RENDER_BUFFER_MANAGER_H
21#include <QtQuick3DRuntimeRender/private/qtquick3druntimerenderglobal_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrenderimagetexture_p.h>
23#include <QtQuick3DRuntimeRender/private/qssgrendermesh_p.h>
24#include <QtQuick3DRuntimeRender/private/qssgrendererutil_p.h>
25#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
26#include <QtQuick3DRuntimeRender/private/qssguserrenderpassmanager_p.h>
27#include <QtQuick3DRuntimeRender/private/qssgrenderuserpass_p.h>
28#include <QtQuick3DUtils/private/qssgmesh_p.h>
30#include <QtQuick3DUtils/private/qquick3dprofiler_p.h>
32#include <QtCore/QMutex>
33#include <QtCore/qhash.h>
34#include <QtCore/qsize.h>
39struct QSSGLoadedTexture;
43class QSSGRenderGeometry;
44class QSSGRenderTextureData;
45struct QSSGRenderModel;
46struct QSSGRenderImage;
47struct QSSGRenderResourceLoader;
48struct QSSGRenderLayer;
59class QQuick3DRenderExtension;
70 return lightmapPath == other.lightmapPath && lightmapKey == other.lightmapKey;
76 Q_DISABLE_COPY(QSSGBufferManager)
78 enum MipMode : quint8 {
79 MipModeFollowRenderImage,
98 QSSGRenderTextureData *
data;
122 ~QSSGBufferManager();
126 void releaseCachedResources();
168 static void registerMeshData(
const QString &assetId,
const QVector<QSSGMesh::Mesh> &meshData);
194 QRhiResourceUpdateBatch *meshBufferUpdateBatch();
196 static QSSGMesh::Mesh loadPrimitive(
const QString &inRelativePath);
197 enum CreateRhiTextureFlag {
198 ScanForTransparency = 0x01,
202 Q_DECLARE_FLAGS(CreateRhiTextureFlags, CreateRhiTextureFlag)
203 bool setRhiTexture(QSSGRenderImageTexture &texture,
204 const QSSGLoadedTexture *inTexture,
206 CreateRhiTextureFlags inFlags,
207 const QString &debugObjectName,
208 bool *wasTextureCreated =
nullptr);
213 QSSGRenderMesh *createRenderMesh(
const QSSGMesh::Mesh &mesh,
const QString &debugObjectName = {});
214 bool createEnvironmentMap(
const QSSGLoadedTexture *inImage, QSSGRenderImageTexture *outTexture,
const QString &debugObjectName);
216 void releaseMesh(
const QSSGRenderPath &inSourcePath);
222 QHash<ImageCacheKey, ImageData> imageMap;
223 QHash<CustomImageCacheKey, ImageData> customTextureMap;
224 QHash<QSGTexture *, ImageData> qsgImageMap;
225 QHash<
const QSSGRenderExtension *, ImageData> renderExtensionTexture;
226 QHash<QSSGRenderPath, MeshData> meshMap;
227 QHash<QSSGRenderGeometry *, MeshData> customMeshMap;
229 using QSSGUserRenderPassManagerWeakPtr = std::weak_ptr<QSSGUserRenderPassManager>;
230 std::vector<QSSGUserRenderPassManagerWeakPtr> userRenderPassManagers;
232 QRhiResourceUpdateBatch *meshBufferUpdates =
nullptr;
233 QMutex meshBufferMutex;
235 quint32 frameCleanupIndex = 0;
236 quint32 frameResetIndex = 0;
237 QSSGRenderLayer *currentLayer =
nullptr;
240 QString lightmapSource;
241 bool lightmapFileValid =
false;
242 bool lightmapSourceDirty =
true;
243 bool currentlyLightmapBaking =
false;
244 bool validateLightmap();
247Q_DECLARE_OPERATORS_FOR_FLAGS(QSSGBufferManager::LoadRenderImageFlags)
249inline size_t qHash(
const QSSGBufferManager::ImageCacheKey &k, size_t seed) Q_DECL_NOTHROW
251 return qHash(k.path, seed) ^ k.mipMode ^ k.type ^ qHash(k.key, seed);
254inline bool operator==(
const QSSGBufferManager::ImageCacheKey &a,
const QSSGBufferManager::ImageCacheKey &b) Q_DECL_NOTHROW
256 return a.path == b.path && a.mipMode == b.mipMode && a.type == b.type && a.key == b.key;
259size_t qHash(
const QSSGBufferManager::CustomImageCacheKey &k, size_t seed)
noexcept;
261inline bool operator==(
const QSSGBufferManager::CustomImageCacheKey &a,
const QSSGBufferManager::CustomImageCacheKey &b) Q_DECL_NOTHROW
263 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)
void registerUserRenderPassManager(const QSSGUserRenderPassManagerPtr &userPassManager)
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)
void releaseUserRenderPass(const QSSGRenderUserPass &upass)
static void unregisterMeshData(const QString &assetId)
static QString primitivePath(const QString &primitive)
void releaseTextureData(const QSSGRenderTextureData *data)
void releaseExtensionResult(const QSSGRenderExtension &rext)
QSSGRenderImageTexture loadTextureData(QSSGRenderTextureData *data, MipMode inMipMode)
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
Combined button and popup list for selecting options.
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