308 MAX_TEMPORAL_AA_LEVELS = 2,
311 using InstanceTransforms = QSSGGlobalRenderNodeData::InstanceTransforms;
312 using ModelViewProjections = QSSGRenderModelData::ModelViewProjections;
314 using QSSGModelsView = QSSGDataView<QSSGRenderModel *>;
315 using QSSGParticlesView = QSSGDataView<QSSGRenderParticles *>;
316 using QSSGItem2DsView = QSSGDataView<QSSGRenderItem2D *>;
317 using QSSGCamerasView = QSSGDataView<QSSGRenderCamera *>;
318 using QSSGLightsView = QSSGDataView<QSSGRenderLight *>;
319 using QSSGReflectionProbesView = QSSGDataView<QSSGRenderReflectionProbe *>;
320 using QSSGNonCategorizedView = QSSGDataView<QSSGRenderNode *>;
322 using RenderableFilter = std::function<
bool(QSSGModelContext *)>;
324 QSSGLayerRenderData(QSSGRenderLayer &inLayer, QSSGRenderer &inRenderer);
325 ~QSSGLayerRenderData();
327 typedef QVector<QSSGModelContext *> TModelContextPtrList;
328 using RenderableNodeEntries = QVector<QSSGRenderableNodeEntry>;
329 using RenderableItem2DEntries = QVector<QSSGRenderItem2D *>;
331 void prepareImageForRender(QSSGRenderImage &inImage,
332 QSSGRenderableImage::Type inMapType,
333 QSSGRenderableImage *&ioFirstImage,
334 QSSGRenderableImage *&ioNextImage,
335 QSSGRenderableObjectFlags &ioFlags,
336 QSSGShaderDefaultMaterialKey &ioGeneratedShaderKey,
337 quint32 inImageIndex, QSSGRenderDefaultMaterial *inMaterial =
nullptr);
339 void setVertexInputPresence(
const QSSGRenderableObjectFlags &renderableFlags,
340 QSSGShaderDefaultMaterialKey &key);
342 static void prepareModelBoneTextures(
const QSSGRenderContextInterface &contextInterface,
343 const RenderableNodeEntries &renderableModels);
347 bool prepareModelsForRender(QSSGRenderContextInterface &ctx,
348 const RenderableNodeEntries &renderableModels,
349 QSSGLayerRenderPreparationResultFlags &ioFlags,
350 const QSSGRenderCameraList &allCameras,
351 const QSSGRenderCameraDataList &allCameraData,
352 TModelContextPtrList &modelContexts,
353 QSSGRenderableObjectList &opaqueObjects,
354 QSSGRenderableObjectList &transparentObjects,
355 QSSGRenderableObjectList &screenTextureObjects,
356 float lodThreshold = 0.0f);
357 bool prepareParticlesForRender(
const RenderableNodeEntries &renderableParticles,
const QSSGRenderCameraData &cameraData, QSSGLayerRenderPreparationResultFlags &ioFlags);
359 void prepareResourceLoaders();
361 void prepareForRender();
363 void prepareReflectionProbesForRender();
365 static qsizetype frustumCulling(
const QSSGClippingFrustum &clipFrustum,
const QSSGRenderableObjectList &renderables, QSSGRenderableObjectList &visibleRenderables);
366 [[nodiscard]]
static qsizetype frustumCullingInline(
const QSSGClippingFrustum &clipFrustum, QSSGRenderableObjectList &renderables);
368 [[nodiscard]]
static qsizetype filterLayerMaskInline(quint32 layerMask, QSSGRenderableObjectList &renderables);
372 const QSSGRenderableObjectList &getSortedOpaqueRenderableObjects(
const QSSGRenderCamera &camera, size_t index = 0, quint32 layerMask = 0xFFFFFFFF);
374 const QSSGRenderableObjectList &getSortedTransparentRenderableObjects(
const QSSGRenderCamera &camera, size_t index = 0, quint32 layerMask = 0xFFFFFFFF);
375 const QSSGRenderableObjectList &getSortedScreenTextureRenderableObjects(
const QSSGRenderCamera &camera, size_t index = 0);
376 const QVector<QSSGBakedLightingModel> &getSortedBakedLightingModels();
377 const RenderableItem2DEntries &getRenderableItem2Ds();
378 const QSSGRenderableObjectList &getSortedRenderedDepthWriteObjects(
const QSSGRenderCamera &camera, size_t index = 0);
379 const QSSGRenderableObjectList &getSortedrenderedOpaqueDepthPrepassObjects(
const QSSGRenderCamera &camera, size_t index = 0);
381 void resetForFrame();
383 QSSGFrameData &getFrameData();
385 ShadowMapPass shadowMapPass;
386 ReflectionMapPass reflectionMapPass;
387 ZPrePassPass zPrePassPass;
388 SSAOMapPass ssaoMapPass;
389 DepthMapPass depthMapPass;
390 DepthMapPass depthMapPassMS;
391 ScreenMapPass screenMapPass;
392 ScreenReflectionPass reflectionPass;
393 Item2DPass item2DPass;
394 SkyboxPass skyboxPass;
395 SkyboxCubeMapPass skyboxCubeMapPass;
396 UserRenderPass userRenderPasses;
397 static constexpr size_t USERPASSES = 3;
398 UserExtensionPass userPasses[USERPASSES];
399 OpaquePass opaquePass;
400 TransparentPass transparentPass;
401 OITRenderPass oitRenderPass;
402 OITCompositePass oitCompositePass;
403 InfiniteGridPass infiniteGridPass;
404 DebugDrawPass debugDrawPass;
405 NormalPass normalPass;
406 MotionVectorMapPass motionVectorMapPass;
409 QVarLengthArray<QSSGRenderPass *, 16> activePasses;
411 QSSGRenderLayer &layer;
412 QSSGRenderer *renderer =
nullptr;
416 using LayerNodes = std::vector<QSSGRenderNode *>;
417 QSSGGlobalRenderNodeData::LayerNodeView layerNodes;
418 LayerNodes layerNodesCategorized;
421 RenderableNodeEntries renderableModels;
422 RenderableNodeEntries renderableParticles;
425 QSSGModelsView modelsView;
426 QSSGParticlesView particlesView;
427 QSSGItem2DsView item2DsView;
428 QSSGCamerasView camerasView;
429 QSSGLightsView lightsView;
430 QSSGReflectionProbesView reflectionProbesView;
431 QSSGNonCategorizedView nonCategorizedView;
434 QSSGRenderCameraList renderedCameras;
435 QSSGShaderLightList globalLights;
437 QVector<QSSGBakedLightingModel> bakedLightingModels;
440 QVector<QSSGBakedLightingModel> renderedBakedLightingModels;
441 RenderableItem2DEntries renderedItem2Ds;
443 QSSGLayerRenderPreparationResult layerPrepResult;
444 std::optional<QSSGRenderCameraDataList> renderedCameraData;
446 TModelContextPtrList modelContexts;
448 QQsbCollection::EntryMap m_particleShaderEntries;
450 bool tooManyLightsWarningShown =
false;
451 bool tooManyDirectionalLightsWarningShown =
false;
452 bool oitWarningUnsupportedShown =
false;
453 bool oitWarningInvalidBlendModeShown =
false;
454 bool orderIndependentTransparencyEnabled =
false;
455 bool disableMainPasses =
true;
457 std::unique_ptr<QSSGLightmapBaker> lightmapBaker =
nullptr;
459 QSSGShaderFeatures getShaderFeatures()
const {
return features; }
460 QSSGRhiGraphicsPipelineState getPipelineState()
const {
return ps; }
462 void initializeLightmapBaking(QSSGLightmapBaker::Context &ctx);
463 void maybeProcessLightmapBaking();
465 [[nodiscard]] QSSGRenderGraphObject *getCamera(QSSGCameraId id)
const;
466 [[nodiscard]] QSSGRenderCamera *activeCamera()
const {
return !renderedCameras.isEmpty() ? renderedCameras[0] :
nullptr; }
468 [[nodiscard]] QSSGRenderCameraData getCameraRenderData(
const QSSGRenderCamera *camera);
469 [[nodiscard]] QSSGRenderCameraData getCameraRenderData(
const QSSGRenderCamera *camera)
const;
471 void setLightmapTexture(
const QSSGModelContext &modelContext, QRhiTexture *lightmapTexture);
472 [[nodiscard]] QRhiTexture *getLightmapTexture(
const QSSGModelContext &modelContext)
const;
474 void setBonemapTexture(
const QSSGModelContext &modelContext, QRhiTexture *bonemapTexture);
475 [[nodiscard]] QRhiTexture *getBonemapTexture(
const QSSGModelContext &modelContext)
const;
477 [[nodiscard]] QSSGRenderContextInterface *contextInterface()
const;
479 [[nodiscard]]
bool isZPrePassActive()
const {
return zPrePassActive; }
480 void setZPrePassPrepResult(
bool res) { zPrePassActive = res; }
483 [[nodiscard]]
const QSSGShaderDefaultMaterialKeyProperties &getDefaultMaterialPropertyTable()
const
485 return defaultMaterialShaderKeyProperties;
487 [[nodiscard]]
const QSSGShaderParticleMaterialKeyProperties &getParticleMaterialPropertyTable()
const
489 return particleMaterialShaderKeyProperties;
492 struct GlobalRenderProperties
494 bool isYUpInFramebuffer =
true;
495 bool isYUpInNDC =
true;
496 bool isClipDepthZeroToOne =
true;
499 [[nodiscard]]
static GlobalRenderProperties globalRenderProperties(
const QSSGRenderContextInterface &ctx);
503 const QSSGRenderShadowMapPtr &requestShadowMapManager();
504 const QSSGRenderReflectionMapPtr &requestReflectionMapManager();
505 const QSSGUserRenderPassManagerPtr &requestUserRenderPassManager();
506 const QSSGRenderMotionVectorMapPtr &requestMotionVectorMapManager();
507 const QSSGRenderShadowMapPtr &getShadowMapManager()
const {
return shadowMapManager; }
508 const QSSGRenderReflectionMapPtr &getReflectionMapManager()
const {
return reflectionMapManager; }
509 const QSSGUserRenderPassManagerPtr &getUserRenderPassManager()
const {
return userRenderPassManager; }
510 const QSSGRenderMotionVectorMapPtr &getMotionvectorMapManager()
const {
return motionVectorMapManager; }
512 QSSGOITRenderContext &getOitRenderContext() {
return oitRenderContext; }
513 const QSSGOITRenderContext &getOitRenderContextConst()
const {
return oitRenderContext; }
515 static bool prepareInstancing(QSSGRhiContext *rhiCtx,
516 QSSGSubsetRenderable *renderable,
517 const QVector3D &cameraDirection,
518 const QVector3D &cameraPosition,
522 [[nodiscard]] QSSGRhiRenderableTexture *getRenderResult(QSSGRenderResult::Key id) {
return &renderResults[size_t(id)]; }
523 [[nodiscard]]
const QSSGRhiRenderableTexture *getRenderResult(QSSGRenderResult::Key id)
const {
return &renderResults[size_t(id)]; }
524 [[nodiscard]]
static inline const std::unique_ptr<QSSGPerFrameAllocator> &perFrameAllocator(QSSGRenderContextInterface &ctx);
525 [[nodiscard]]
static inline QSSGLayerRenderData *getCurrent(
const QSSGRenderer &renderer) {
return renderer.m_currentLayer; }
526 void saveRenderState(
const QSSGRenderer &renderer);
527 void restoreRenderState(QSSGRenderer &renderer);
529 static void setTonemapFeatures(QSSGShaderFeatures &features, QSSGRenderLayer::TonemapMode tonemapMode)
531 features.set(QSSGShaderFeatures::Feature::LinearTonemapping,
532 tonemapMode == QSSGRenderLayer::TonemapMode::Linear);
533 features.set(QSSGShaderFeatures::Feature::AcesTonemapping,
534 tonemapMode == QSSGRenderLayer::TonemapMode::Aces);
535 features.set(QSSGShaderFeatures::Feature::HejlDawsonTonemapping,
536 tonemapMode == QSSGRenderLayer::TonemapMode::HejlDawson);
537 features.set(QSSGShaderFeatures::Feature::FilmicTonemapping,
538 tonemapMode == QSSGRenderLayer::TonemapMode::Filmic);
539 features.set(QSSGShaderFeatures::Feature::ForceIblExposure,
540 tonemapMode == QSSGRenderLayer::TonemapMode::Custom);
543 QSSGPrepContextId getOrCreateExtensionContext(
const QSSGRenderExtension &ext,
544 QSSGRenderCamera *camera =
nullptr,
548 QSSGRenderablesId createRenderables(QSSGPrepContextId prepId,
const QSSGNodeIdList &nodes, QSSGRenderHelpers::CreateFlags createFlags);
549 void setGlobalTransform(QSSGRenderablesId renderablesId,
const QSSGRenderModel &model,
const QMatrix4x4 &mvp);
550 QMatrix4x4 getGlobalTransform(QSSGPrepContextId prepId,
const QSSGRenderModel &model);
551 void setGlobalOpacity(QSSGRenderablesId renderablesId,
const QSSGRenderModel &model,
float opacity);
552 float getGlobalOpacity(QSSGPrepContextId prepId,
const QSSGRenderModel &model);
553 [[nodiscard]] QMatrix4x4 getModelMvps(QSSGPrepContextId prepId,
const QSSGRenderModel &model)
const;
554 void setModelMaterials(QSSGRenderablesId renderablesId,
const QSSGRenderModel &model,
const QList<QSSGResourceId> &materials);
555 void setModelMaterials(
const QSSGRenderablesId renderablesId,
const QList<QSSGResourceId> &materials);
556 [[nodiscard]] QSSGPrepResultId prepareModelsForRender(QSSGRenderContextInterface &contextInterface,
557 QSSGPrepContextId prepId,
558 QSSGRenderablesId renderablesId,
562 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h, QMatrix4x4 defaultValue)
const
564 return nodeData->getGlobalTransform(h, defaultValue);
566 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h)
const
568 return nodeData->getGlobalTransform(h, QMatrix4x4());
570 [[nodiscard]] QMatrix4x4 getGlobalTransform(
const QSSGRenderNode &node)
const
572 return nodeData->getGlobalTransform(node.h, node.localTransform);
574 [[nodiscard]] QMatrix3x3 getNormalMatrix(QSSGRenderModelHandle h)
const
576 return modelData->getNormalMatrix(h, QMatrix3x3(Qt::Uninitialized));
578 [[nodiscard]] QMatrix3x3 getNormalMatrix(
const QSSGRenderModel &model)
const
580 return modelData->getNormalMatrix(model);
582 [[nodiscard]] ModelViewProjections getModelMvps(QSSGRenderModelHandle h)
const
584 return modelData->getModelViewProjection(h);
586 [[nodiscard]] ModelViewProjections getModelMvps(
const QSSGRenderModel &model)
const
588 return modelData->getModelViewProjection(model);
590 [[nodiscard]] InstanceTransforms getInstanceTransforms(QSSGRenderNodeHandle h)
const
592 return nodeData->getInstanceTransforms(h);
594 [[nodiscard]] InstanceTransforms getInstanceTransforms(
const QSSGRenderNode &node)
const
596 return nodeData->getInstanceTransforms(node.h);
598 [[nodiscard]]
float getGlobalOpacity(QSSGRenderNodeHandle h,
float defaultValue = 1.0f)
const
600 return nodeData->getGlobalOpacity(h, defaultValue);
602 [[nodiscard]]
float getGlobalOpacity(
const QSSGRenderNode &node)
const
604 return nodeData->getGlobalOpacity(node.h);
608 [[nodiscard]] QSSGRenderItem2DData::Item2DRenderer getItem2DRenderer(
const QSSGRenderItem2D &item)
const
610 return item2DData->getItem2DRenderer(item);
613 [[nodiscard]] ModelViewProjections getItem2DMvps(QSSGRenderItem2DHandle h)
const
615 return item2DData->getModelViewProjection(h);
618 [[nodiscard]] ModelViewProjections getItem2DMvps(
const QSSGRenderItem2D &item)
const
620 return item2DData->getModelViewProjection(item);
625 void prepareRenderables(QSSGRenderContextInterface &ctx,
626 QSSGPrepResultId prepId,
627 QRhiRenderPassDescriptor *renderPassDescriptor,
628 const QSSGRhiGraphicsPipelineState &ps,
629 QSSGRenderablesFilters filter);
630 void renderRenderables(QSSGRenderContextInterface &ctx,
631 QSSGPrepResultId prepId);
633 static bool calculateGlobalVariables(QSSGRenderNode &node,
634 std::vector<QMatrix4x4> &globalTransforms,
635 std::vector<
float> &globalOpacities);
637 QSSGRenderCameraData getCameraDataImpl(
const QSSGRenderCamera *camera)
const;
639 static QSSGNodeIdList filter(
const QSSGGlobalRenderNodeData::LayerNodeView &layerNodes,
643 [[nodiscard]]
static QSSGLayerRenderData *getCurrent(
const QSSGFrameData &data) {
return data.getCurrent(); }
645 QSSGDefaultMaterialPreparationResult prepareDefaultMaterialForRender(QSSGRenderDefaultMaterial &inMaterial,
646 QSSGRenderableObjectFlags &inExistingFlags,
649 bool anyLightHasShadows,
650 QSSGLayerRenderPreparationResultFlags &ioFlags);
652 QSSGDefaultMaterialPreparationResult prepareCustomMaterialForRender(QSSGRenderCustomMaterial &inMaterial,
653 QSSGRenderableObjectFlags &inExistingFlags,
654 float inOpacity,
bool alreadyDirty,
656 bool anyLightHasShadows,
657 QSSGLayerRenderPreparationResultFlags &ioFlags);
660 friend class QSSGRenderer;
661 friend class QSSGRendererPrivate;
662 friend class QSSGFrameData;
663 friend class QSSGModelHelpers;
664 friend class QSSGRenderHelpers;
665 friend class QSSGParticleRenderer;
667 class ExtensionContext
670 explicit ExtensionContext() =
default;
671 explicit ExtensionContext(
const QSSGRenderExtension &ownerExt, QSSGRenderCamera *cam, size_t idx, quint32 slot)
672 : owner(&ownerExt), camera(cam), ps{}, filter{0}, index(idx), slot(slot)
674 const QSSGRenderExtension *owner =
nullptr;
675 QSSGRenderCamera *camera =
nullptr;
676 QSSGRhiGraphicsPipelineState ps[3] {};
677 QSSGRenderablesFilters filter { 0 };
682 std::vector<ExtensionContext> extContexts { ExtensionContext{ } };
683 std::vector<RenderableNodeEntries> renderableModelStore { RenderableNodeEntries{ } };
684 std::vector<TModelContextPtrList> modelContextStore { TModelContextPtrList{ }};
685 std::vector<QSSGRenderableObjectList> renderableObjectStore { QSSGRenderableObjectList{ }};
686 std::vector<QSSGRenderableObjectList> opaqueObjectStore { QSSGRenderableObjectList{ }};
687 std::vector<QSSGRenderableObjectList> transparentObjectStore { QSSGRenderableObjectList{ }};
688 std::vector<QSSGRenderableObjectList> screenTextureObjectStore { QSSGRenderableObjectList{ }};
690 std::shared_ptr<QSSGGlobalRenderNodeData> nodeData;
691 std::unique_ptr<QSSGRenderModelData> modelData;
692 std::unique_ptr<QSSGRenderItem2DData> item2DData;
695 using CameraKey = std::pair<
const QSSGRenderCamera*, uint32_t>;
697 struct CameraKeyHash {
698 std::size_t operator()(
const CameraKey& k)
const noexcept {
700 return std::hash<
const QSSGRenderCamera*>()(k.first) ^
701 (std::hash<uint32_t>()(k.second) << 1);
706 bool operator()(
const CameraKey& a,
const CameraKey& b)
const noexcept {
707 return a.first == b.first && a.second == b.second;
711 using PerCameraCache = std::unordered_map<CameraKey, QSSGRenderableObjectList, CameraKeyHash, CameraKeyEq>;
712 std::vector<PerCameraCache> sortedOpaqueObjectCache { PerCameraCache{ } };
713 std::vector<PerCameraCache> sortedTransparentObjectCache { PerCameraCache{ } };
714 std::vector<PerCameraCache> sortedScreenTextureObjectCache { PerCameraCache{ } };
715 std::vector<PerCameraCache> sortedOpaqueDepthPrepassCache { PerCameraCache{ } };
716 std::vector<PerCameraCache> sortedDepthWriteCache { PerCameraCache{ } };
718 [[nodiscard]]
const QSSGRenderCameraDataList &getCachedCameraDatas();
719 void ensureCachedCameraDatas();
720 void updateSortedDepthObjectsListImp(
const QSSGRenderCamera &camera, size_t index);
722 static void prepareModelMaterials(RenderableNodeEntries &renderableModels,
bool cullUnrenderables);
723 static void prepareModelMaterials(
const RenderableNodeEntries::ConstIterator &begin,
724 const RenderableNodeEntries::ConstIterator &end);
727 QHash<QSSGShaderMapKey, QSSGRhiShaderPipelinePtr> shaderMap;
728 QHash<QSSGParticleShaderMapKey, QSSGRhiShaderPipelinePtr> particleShaderMap;
731 QByteArray generatedShaderString;
734 struct SavedRenderState
741 std::optional<SavedRenderState> savedRenderState;
745 QSSGShaderDefaultMaterialKeyProperties defaultMaterialShaderKeyProperties;
746 QSSGShaderParticleMaterialKeyProperties particleMaterialShaderKeyProperties;
747 QSSGFrameData frameData;
748 QSSGRhiGraphicsPipelineState ps;
749 QSSGShaderFeatures features;
751 bool particlesEnabled =
true;
752 bool hasDepthWriteObjects =
false;
753 bool zPrePassActive =
false;
757 bool renderablesModifiedByExtension =
false;
758 enum class DepthPrepassObject : quint8
765 using DepthPrepassObjectStateT = std::underlying_type_t<DepthPrepassObject>;
766 DepthPrepassObjectStateT depthPrepassObjectsState { DepthPrepassObjectStateT(DepthPrepassObject::None) };
767 QSSGRenderShadowMapPtr shadowMapManager;
768 QSSGRenderReflectionMapPtr reflectionMapManager;
769 QSSGUserRenderPassManagerPtr userRenderPassManager;
770 QSSGRenderMotionVectorMapPtr motionVectorMapManager;
771 QHash<
const QSSGModelContext *, QRhiTexture *> lightmapTextures;
772 QHash<
const QSSGModelContext *, QRhiTexture *> bonemapTextures;
773 QSSGRhiRenderableTexture renderResults[size_t(QSSGRenderResult::Key::RenderResultCount)] {};
774 QSSGOITRenderContext oitRenderContext;