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
qssglayerrenderdata_p.h
Go to the documentation of this file.
1// Copyright (C) 2008-2012 NVIDIA Corporation.
2// Copyright (C) 2022 The Qt Company Ltd.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
4// Qt-Security score:significant reason:default
5
6
7#ifndef QSSG_LAYER_RENDER_DATA_H
8#define QSSG_LAYER_RENDER_DATA_H
9
10
11//
12// W A R N I N G
13// -------------
14//
15// This file is not part of the Qt API. It exists purely as an
16// implementation detail. This header file may change from version to
17// version without notice, or even be removed.
18//
19// We mean it.
20//
21
22#include <QtQuick3DRuntimeRender/private/qssgrenderitem2d_p.h>
23#include <QtQuick3DRuntimeRender/private/qssgrenderer_p.h>
24#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
25#include <QtQuick3DRuntimeRender/private/qssgrenderableobjects_p.h>
26#include <QtQuick3DRuntimeRender/private/qssgrendershadowmap_p.h>
27#include <QtQuick3DRuntimeRender/private/qssgrendereffect_p.h>
28#include <QtQuick3DRuntimeRender/private/qssgrenderresourceloader_p.h>
29#include <QtQuick3DRuntimeRender/private/qssgrenderreflectionmap_p.h>
30#include <QtQuick3DRuntimeRender/private/qssgrenderskymaterialmanager_p.h>
31#include <QtQuick3DRuntimeRender/private/qssgrendercamera_p.h>
32#include <QtQuick3DRuntimeRender/private/qssgrhicontext_p.h>
33#include <QtQuick3DRuntimeRender/private/qssgperframeallocator_p.h>
34#include <QtQuick3DRuntimeRender/private/qssgshadermapkey_p.h>
35#include <QtQuick3DRuntimeRender/private/qssglightmapbaker_p.h>
36#include <QtQuick3DRuntimeRender/private/qssguserrenderpassmanager_p.h>
37#include <ssg/qssgrenderextensions.h>
38
39#include <QtQuick3DUtils/private/qssgrenderbasetypes_p.h>
40
41#include <optional>
42#include <unordered_map>
43
46
48
50
51class QSGRenderer;
52
54{
55
73
74inline QSSGRenderResult::Key toInternalRenderResultKey(QSSGFrameData::RenderResult id)
75{
76 switch (id) {
77 case QSSGFrameData::RenderResult::AoTexture:
79 case QSSGFrameData::RenderResult::DepthTexture:
81 case QSSGFrameData::RenderResult::ScreenTexture:
83 case QSSGFrameData::RenderResult::NormalTexture:
85 case QSSGFrameData::RenderResult::MotionVectorTexture:
87 }
88
89 if (size_t(QSSGRenderResult::Key::CounterImage) > size_t(id))
90 return static_cast<QSSGRenderResult::Key>(size_t(id));
91
93}
94
95} // namespace QSSGRenderResult
96
98{
99 // Was the data in this layer dirty (meaning re-render to texture, possibly)
101
102 // Was the data in this layer dirty *or* this layer *or* any effect dirty.
103 WasDirty = 1 << 1,
104
106
107 // SSAO should be done in a separate pass
108 // Note that having an AO pass necessitates a DepthTexture so this flag should
109 // never be set without the RequiresDepthTexture flag as well.
111
112 // if some light cause shadow
113 // we need a separate per light shadow map pass
115
117
118 // set together with RequiresScreenTexture when SCREEN_MIP_TEXTURE is used
120
121 // Set when material has custom blend mode(not SourceOver)
123
124 // Set when multisampled depth texture is required
126
128
130
132};
133
135{
136 bool wasLayerDataDirty() const
137 {
139 }
140 void setLayerDataDirty(bool inValue)
141 {
143 }
144
145 bool wasDirty() const { return this->operator&(QSSGLayerRenderPreparationResultFlag::WasDirty); }
146 void setWasDirty(bool inValue) { setFlag(QSSGLayerRenderPreparationResultFlag::WasDirty, inValue); }
147
149 {
151 }
152 void setRequiresDepthTexture(bool inValue)
153 {
155 }
156
165
167 void setRequiresSsaoPass(bool inValue)
168 {
170 }
171
173 {
175 }
180
182 {
184 }
189
198
207
209 {
211 }
216
225
234};
235
237{
238public:
239 enum class State : quint8
240 {
241 Null = 0,
244 };
245
247 QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer);
248
249 void setState(State state) { m_state = state; }
250 State getState() const { return m_state; }
251 bool isNull() const { return !layer && m_state == State::Null; }
252 bool isLayerVisible() const;
253 QSize textureDimensions() const;
254 QRectF getViewport() const { return viewport; }
255 const QSSGLayerRenderPreparationResultFlags &getFlags() const { return flags; }
256 QSSGRenderLayer *getLayer() const { return layer; }
257
258private:
260 friend class QSSGFrameData;
261
263 QRectF viewport;
264 QSSGRenderLayer *layer = nullptr;
265 State m_state = State::Null;
266};
267
278
280{
281 QSSGBakedLightingModel(const QSSGRenderModel *model, const QVector<QSSGRenderableObjectHandle> &renderables)
282 : model(model),
284 { }
285
288};
289
291{
294 QRhiTexture *copyTexture = nullptr;
295 QRhiBuffer *aBuffer = nullptr;
298 void reset()
299 {
300 delete oitRenderTarget;
301 delete renderPassDescriptor;
302 delete copyTexture;
303 delete aBuffer;
304 delete auxBuffer;
305 delete counterBuffer;
306 oitRenderTarget = nullptr;
307 renderPassDescriptor = nullptr;
308 copyTexture = nullptr;
309 aBuffer = nullptr;
310 auxBuffer = nullptr;
311 counterBuffer = nullptr;
312 }
313};
314
315class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGLayerRenderData
316{
317public:
318 enum Enum {
319 MAX_AA_LEVELS = 8,
320 MAX_TEMPORAL_AA_LEVELS = 2,
321 };
322
323 using InstanceTransforms = QSSGGlobalRenderNodeData::InstanceTransforms;
324 using ModelViewProjections = QSSGRenderModelData::ModelViewProjections;
325
326 using QSSGModelsView = QSSGDataView<QSSGRenderModel *>;
327 using QSSGParticlesView = QSSGDataView<QSSGRenderParticles *>;
328 using QSSGItem2DsView = QSSGDataView<QSSGRenderItem2D *>;
329 using QSSGCamerasView = QSSGDataView<QSSGRenderCamera *>;
330 using QSSGLightsView = QSSGDataView<QSSGRenderLight *>;
331 using QSSGReflectionProbesView = QSSGDataView<QSSGRenderReflectionProbe *>;
332 using QSSGNonCategorizedView = QSSGDataView<QSSGRenderNode *>;
333
334 using RenderableFilter = std::function<bool(QSSGModelContext *)>;
335
336 QSSGLayerRenderData(QSSGRenderLayer &inLayer, QSSGRenderer &inRenderer);
337 ~QSSGLayerRenderData();
338
339 typedef QVector<QSSGModelContext *> TModelContextPtrList;
340 using RenderableNodeEntries = QVector<QSSGRenderableNodeEntry>;
341 using RenderableItem2DEntries = QVector<QSSGRenderItem2D *>;
342
343 void prepareImageForRender(QSSGRenderImage &inImage,
344 QSSGRenderableImage::Type inMapType,
345 QSSGRenderableImage *&ioFirstImage,
346 QSSGRenderableImage *&ioNextImage,
347 QSSGRenderableObjectFlags &ioFlags,
348 QSSGShaderDefaultMaterialKey &ioGeneratedShaderKey,
349 quint32 inImageIndex, QSSGRenderDefaultMaterial *inMaterial = nullptr);
350
351 void setVertexInputPresence(const QSSGRenderableObjectFlags &renderableFlags,
352 QSSGShaderDefaultMaterialKey &key);
353
354 static void prepareModelBoneTextures(const QSSGRenderContextInterface &contextInterface,
355 const RenderableNodeEntries &renderableModels);
356
357 // Helper functions used during PrepareForRender and PrepareAndRender
358 // Updates lights with model receivesShadows. Do not pass globalLights.
359 bool prepareModelsForRender(QSSGRenderContextInterface &ctx,
360 const RenderableNodeEntries &renderableModels,
361 QSSGLayerRenderPreparationResultFlags &ioFlags,
362 const QSSGRenderCameraList &allCameras,
363 const QSSGRenderCameraDataList &allCameraData,
364 TModelContextPtrList &modelContexts,
365 QSSGRenderableObjectList &opaqueObjects,
366 QSSGRenderableObjectList &transparentObjects,
367 QSSGRenderableObjectList &screenTextureObjects,
368 float lodThreshold = 0.0f);
369 bool prepareParticlesForRender(const RenderableNodeEntries &renderableParticles, const QSSGRenderCameraData &cameraData, QSSGLayerRenderPreparationResultFlags &ioFlags);
370
371 void prepareResourceLoaders();
372
373 void prepareForRender();
374 // Helper function used during prepareForRender
375 void prepareReflectionProbesForRender();
376
377 [[nodiscard]] static qsizetype frustumCullingInline(const QSSGClippingFrustum &clipFrustum, QSSGRenderableObjectList &renderables);
378
379 [[nodiscard]] static qsizetype filterLayerMaskInline(quint32 layerMask, QSSGRenderableObjectList &renderables);
380
381
382 // Per-frame cache of renderable objects post-sort (for the MAIN rendering camera, i.e., don't use these lists for rendering from a different camera).
383 const QSSGRenderableObjectList &getSortedOpaqueRenderableObjects(const QSSGRenderCamera &camera, size_t index = 0, quint32 layerMask = 0xFFFFFFFF);
384 // If layer depth test is false, this may also contain opaque objects.
385 const QSSGRenderableObjectList &getSortedTransparentRenderableObjects(const QSSGRenderCamera &camera, size_t index = 0, quint32 layerMask = 0xFFFFFFFF);
386 const QSSGRenderableObjectList &getSortedScreenTextureRenderableObjects(const QSSGRenderCamera &camera, size_t index = 0);
387 const QVector<QSSGBakedLightingModel> &getSortedBakedLightingModels();
388 const RenderableItem2DEntries &getRenderableItem2Ds();
389 const QSSGRenderableObjectList &getSortedRenderedDepthWriteObjects(const QSSGRenderCamera &camera, size_t index = 0);
390 const QSSGRenderableObjectList &getSortedrenderedOpaqueDepthPrepassObjects(const QSSGRenderCamera &camera, size_t index = 0);
391 void getShadowCastingObjects(const QSSGRenderCamera &camera,
392 QSSGRenderableObjectList &outObjects,
393 QSSGBounds3 &outBoundsCasting,
394 QSSGBounds3 &outBoundsReceiving);
395
396 void resetForFrame();
397
398 QSSGFrameData &getFrameData();
399
400 ShadowMapPass shadowMapPass;
401 ReflectionMapPass reflectionMapPass;
402 ZPrePassPass zPrePassPass;
403 SSAOMapPass ssaoMapPass;
404 DepthMapPass depthMapPass;
405 DepthMapPass depthMapPassMS;
406 SkyMaterialPass skyMaterialPass;
407 ScreenMapPass screenMapPass;
408 ScreenReflectionPass reflectionPass;
409 Item2DPass item2DPass;
410 SkyboxPass skyboxPass;
411 SkyboxCubeMapPass skyboxCubeMapPass;
412 UserRenderPass userRenderPasses;
413 static constexpr size_t USERPASSES = 3; // See QSSGRenderLayer::RenderExtensionMode::Count
414 UserExtensionPass userPasses[USERPASSES];
415 OpaquePass opaquePass;
416 TransparentPass transparentPass;
417 OITRenderPass oitRenderPass;
418 OITCompositePass oitCompositePass;
419 InfiniteGridPass infiniteGridPass;
420 DebugDrawPass debugDrawPass;
421 NormalPass normalPass;
422 MotionVectorMapPass motionVectorMapPass;
423
424 // Built-in passes
425 QVarLengthArray<QSSGRenderPass *, 16> activePasses;
426
427 QSSGRenderLayer &layer;
428 QSSGRenderer *renderer = nullptr;
429 // List of nodes we can render, not all may be active. Found by doing a depth-first
430 // search through m_FirstChild if length is zero.
431
432 using LayerNodes = std::vector<QSSGRenderNode *>;
433 QSSGGlobalRenderNodeData::LayerNodeView layerNodes;
434
435 // renderableNodes have all lights, but properties configured for specific node
436 RenderableNodeEntries renderableModels;
437 RenderableNodeEntries renderableParticles;
438
439 // Views into the collected nodes (unsorted)
440 class NodeCollection
441 {
442 Q_DISABLE_COPY(NodeCollection)
443 public:
444 NodeCollection() = default;
445
446 QSSGModelsView modelsView;
447 QSSGParticlesView particlesView;
448 QSSGItem2DsView item2DsView;
449 QSSGCamerasView camerasView;
450 QSSGLightsView lightsView;
451 QSSGReflectionProbesView reflectionProbesView;
452 QSSGNonCategorizedView nonCategorizedView;
453 LayerNodes layerNodesCategorized;
454 };
455 NodeCollection nodeCollection;
456 // FIXME: Convenience for now
457 QSSGModelsView &modelsView = nodeCollection.modelsView;
458 QSSGParticlesView &particlesView = nodeCollection.particlesView;
459 QSSGItem2DsView &item2DsView = nodeCollection.item2DsView;
460 QSSGCamerasView &camerasView = nodeCollection.camerasView;
461 QSSGLightsView &lightsView = nodeCollection.lightsView;
462 QSSGReflectionProbesView &reflectionProbesView = nodeCollection.reflectionProbesView;
463 QSSGNonCategorizedView &nonCategorizedView = nodeCollection.nonCategorizedView;
464
465 // Results of prepare for render.
466 QSSGRenderCameraList renderedCameras; // multiple items with multiview, one otherwise (or zero if no cameras at all)
467 QSSGShaderLightList globalLights; // All non-scoped lights
468
469 QVector<QSSGBakedLightingModel> bakedLightingModels;
470 // Sorted lists of the rendered objects. There may be other transforms applied so
471 // it is simplest to duplicate the lists.
472 QVector<QSSGBakedLightingModel> renderedBakedLightingModels;
473 RenderableItem2DEntries renderedItem2Ds;
474
475 QSSGLayerRenderPreparationResult layerPrepResult;
476 std::optional<QSSGRenderCameraDataList> renderedCameraData;
477
478 TModelContextPtrList modelContexts;
479
480 QQsbCollection::EntryMap m_particleShaderEntries;
481
482 bool nonExplicitCameraWithLayerMaskWarningShown = false;
483 bool tooManyLightsWarningShown = false;
484 bool tooManyDirectionalLightsWarningShown = false;
485 bool oitWarningUnsupportedShown = false;
486 bool oitWarningInvalidBlendModeShown = false;
487 bool orderIndependentTransparencyEnabled = false;
488 bool disableMainPasses = true;
489
490 std::unique_ptr<QSSGLightmapBaker> lightmapBaker = nullptr;
491
492 QSSGShaderFeatures getShaderFeatures() const { return features; }
493 QSSGRhiGraphicsPipelineState getPipelineState() const { return ps; }
494
495 void initializeLightmapBaking(QSSGLightmapBaker::Context &ctx);
496 void maybeProcessLightmapBaking();
497
498 [[nodiscard]] QSSGRenderGraphObject *getCamera(QSSGCameraId id) const;
499 [[nodiscard]] QSSGRenderCamera *activeCamera() const { return !renderedCameras.isEmpty() ? renderedCameras[0] : nullptr; }
500
501 [[nodiscard]] QSSGRenderCameraData getCameraRenderData(const QSSGRenderCamera *camera);
502 [[nodiscard]] QSSGRenderCameraData getCameraRenderData(const QSSGRenderCamera *camera) const;
503
504 void setLightmapTexture(const QSSGModelContext &modelContext, QRhiTexture *lightmapTexture);
505 [[nodiscard]] QRhiTexture *getLightmapTexture(const QSSGModelContext &modelContext) const;
506
507 void setBonemapTexture(const QSSGModelContext &modelContext, QRhiTexture *bonemapTexture);
508 [[nodiscard]] QRhiTexture *getBonemapTexture(const QSSGModelContext &modelContext) const;
509
510 [[nodiscard]] QSSGRenderContextInterface *contextInterface() const;
511 // Note: temp. API to report the state of the z-prepass step
512 [[nodiscard]] bool isZPrePassActive() const { return zPrePassActive; }
513 void setZPrePassPrepResult(bool res) { zPrePassActive = res; }
514
515 // Exposed as const, as we often need to use this to look-up values from a specific key.
516 [[nodiscard]] const QSSGShaderDefaultMaterialKeyProperties &getDefaultMaterialPropertyTable() const
517 {
518 return defaultMaterialShaderKeyProperties;
519 }
520 [[nodiscard]] const QSSGShaderParticleMaterialKeyProperties &getParticleMaterialPropertyTable() const
521 {
522 return particleMaterialShaderKeyProperties;
523 }
524
525 struct GlobalRenderProperties
526 {
527 bool isYUpInFramebuffer = true;
528 bool isYUpInNDC = true;
529 bool isClipDepthZeroToOne = true;
530 };
531
532 [[nodiscard]] static GlobalRenderProperties globalRenderProperties(const QSSGRenderContextInterface &ctx);
533
534 // Temp. API. Ideally there shouldn't be a reason for anyone to hold onto these,
535 // but we follow the existing pattern for now.
536 const QSSGRenderShadowMapPtr &requestShadowMapManager();
537 const QSSGRenderReflectionMapPtr &requestReflectionMapManager();
538 const QSSGRenderSkyMaterialManagerPtr &requestSkyMaterialManager();
539 const QSSGUserRenderPassManagerPtr &requestUserRenderPassManager();
540 const QSSGRenderMotionVectorMapPtr &requestMotionVectorMapManager();
541 const QSSGRenderShadowMapPtr &getShadowMapManager() const { return shadowMapManager; }
542 const QSSGRenderReflectionMapPtr &getReflectionMapManager() const { return reflectionMapManager; }
543 const QSSGRenderSkyMaterialManagerPtr &getSkyMaterialManager() const { return skyMaterialManager; }
544 const QSSGUserRenderPassManagerPtr &getUserRenderPassManager() const { return userRenderPassManager; }
545 const QSSGRenderMotionVectorMapPtr &getMotionvectorMapManager() const { return motionVectorMapManager; }
546
547 QSSGOITRenderContext &getOitRenderContext() { return oitRenderContext; }
548 const QSSGOITRenderContext &getOitRenderContextConst() const { return oitRenderContext; }
549
550 static bool prepareInstancing(QSSGRhiContext *rhiCtx,
551 QSSGSubsetRenderable *renderable,
552 const QVector3D &cameraDirection,
553 const QVector3D &cameraPosition,
554 float minThreshold,
555 float maxThreshold);
556
557 [[nodiscard]] QSSGRhiRenderableTexture *getRenderResult(QSSGRenderResult::Key id) { return &renderResults[size_t(id)]; }
558 [[nodiscard]] const QSSGRhiRenderableTexture *getRenderResult(QSSGRenderResult::Key id) const { return &renderResults[size_t(id)]; }
559
560 QSSGRenderImageTexture skyMaterialTexture; // Always a cubemap, might be IBL
561 void resolveLayerIblTexture();
562
563 [[nodiscard]] static inline const std::unique_ptr<QSSGPerFrameAllocator> &perFrameAllocator(QSSGRenderContextInterface &ctx);
564 [[nodiscard]] static inline QSSGLayerRenderData *getCurrent(const QSSGRenderer &renderer) { return renderer.m_currentLayer; }
565 void saveRenderState(const QSSGRenderer &renderer);
566 void restoreRenderState(QSSGRenderer &renderer);
567
568 static void setTonemapFeatures(QSSGShaderFeatures &features, QSSGRenderLayer::TonemapMode tonemapMode)
569 {
570 features.set(QSSGShaderFeatures::Feature::LinearTonemapping,
571 tonemapMode == QSSGRenderLayer::TonemapMode::Linear);
572 features.set(QSSGShaderFeatures::Feature::AcesTonemapping,
573 tonemapMode == QSSGRenderLayer::TonemapMode::Aces);
574 features.set(QSSGShaderFeatures::Feature::HejlDawsonTonemapping,
575 tonemapMode == QSSGRenderLayer::TonemapMode::HejlDawson);
576 features.set(QSSGShaderFeatures::Feature::FilmicTonemapping,
577 tonemapMode == QSSGRenderLayer::TonemapMode::Filmic);
578 features.set(QSSGShaderFeatures::Feature::ForceIblExposure,
579 tonemapMode == QSSGRenderLayer::TonemapMode::Custom);
580 }
581
582 QSSGPrepContextId getOrCreateExtensionContext(const QSSGRenderExtension &ext,
583 QSSGRenderCamera *camera = nullptr,
584 quint32 slot = 0);
585
586 // Model API
587 QSSGRenderablesId createRenderables(QSSGPrepContextId prepId, const QSSGNodeIdList &nodes, QSSGRenderHelpers::CreateFlags createFlags);
588 void setGlobalTransform(QSSGRenderablesId renderablesId, const QSSGRenderModel &model, const QMatrix4x4 &mvp);
589 QMatrix4x4 getGlobalTransform(QSSGPrepContextId prepId, const QSSGRenderModel &model);
590 void setGlobalOpacity(QSSGRenderablesId renderablesId, const QSSGRenderModel &model, float opacity);
591 float getGlobalOpacity(QSSGPrepContextId prepId, const QSSGRenderModel &model);
592 [[nodiscard]] QMatrix4x4 getModelMvps(QSSGPrepContextId prepId, const QSSGRenderModel &model) const;
593 void setModelMaterials(QSSGRenderablesId renderablesId, const QSSGRenderModel &model, const QList<QSSGResourceId> &materials);
594 void setModelMaterials(const QSSGRenderablesId renderablesId, const QList<QSSGResourceId> &materials);
595 [[nodiscard]] QSSGPrepResultId prepareModelsForRender(QSSGRenderContextInterface &contextInterface,
596 QSSGPrepContextId prepId,
597 QSSGRenderablesId renderablesId,
598 float lodThreshold);
599
600 // Convenience wrappers for getting values from the node, model store.
601 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h, const QMatrix4x4 &defaultValue) const
602 {
603 return nodeData->getGlobalTransform(h, defaultValue);
604 }
605 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h) const
606 {
607 return nodeData->getGlobalTransform(h, QMatrix4x4());
608 }
609 [[nodiscard]] QMatrix4x4 getGlobalTransform(const QSSGRenderNode &node) const
610 {
611 return nodeData->getGlobalTransform(node.h, node.localTransform);
612 }
613 [[nodiscard]] QMatrix3x3 getNormalMatrix(QSSGRenderNodeHandle h) const
614 {
615 return modelData->getNormalMatrix(h, QMatrix3x3(Qt::Uninitialized));
616 }
617 [[nodiscard]] QMatrix3x3 getNormalMatrix(const QSSGRenderModel &model) const
618 {
619 return modelData->getNormalMatrix(model);
620 }
621 [[nodiscard]] ModelViewProjections getModelMvps(QSSGRenderNodeHandle h) const
622 {
623 return modelData->getModelViewProjection(h);
624 }
625 [[nodiscard]] ModelViewProjections getModelMvps(const QSSGRenderModel &model) const
626 {
627 return modelData->getModelViewProjection(model);
628 }
629 [[nodiscard]] InstanceTransforms getInstanceTransforms(QSSGRenderNodeHandle h) const
630 {
631 return nodeData->getInstanceTransforms(h);
632 }
633 [[nodiscard]] InstanceTransforms getInstanceTransforms(const QSSGRenderNode &node) const
634 {
635 return nodeData->getInstanceTransforms(node.h);
636 }
637 [[nodiscard]] float getGlobalOpacity(QSSGRenderNodeHandle h, float defaultValue = 1.0f) const
638 {
639 return nodeData->getGlobalOpacity(h, defaultValue);
640 }
641 [[nodiscard]] float getGlobalOpacity(const QSSGRenderNode &node) const
642 {
643 return nodeData->getGlobalOpacity(node.h);
644 }
645
646 //
647 [[nodiscard]] QSSGRenderItem2DData::Item2DRenderer getItem2DRenderer(const QSSGRenderItem2D &item) const
648 {
649 return item2DData->getItem2DRenderer(item);
650 }
651
652 [[nodiscard]] ModelViewProjections getItem2DMvps(QSSGRenderNodeHandle h) const
653 {
654 return item2DData->getModelViewProjection(h);
655 }
656
657 [[nodiscard]] ModelViewProjections getItem2DMvps(const QSSGRenderItem2D &item) const
658 {
659 return item2DData->getModelViewProjection(item);
660 }
661
662
663 //
664 void prepareRenderables(QSSGRenderContextInterface &ctx,
665 QSSGPrepResultId prepId,
666 QRhiRenderPassDescriptor *renderPassDescriptor,
667 const QSSGRhiGraphicsPipelineState &ps,
668 QSSGRenderablesFilters filter);
669 void renderRenderables(QSSGRenderContextInterface &ctx,
670 QSSGPrepResultId prepId);
671
672 static bool calculateGlobalVariables(QSSGRenderNode &node,
673 std::vector<QMatrix4x4> &globalTransforms,
674 std::vector<float> &globalOpacities);
675
676 QSSGRenderCameraData getCameraDataImpl(const QSSGRenderCamera *camera) const;
677
678 static QSSGNodeIdList filter(const QSSGGlobalRenderNodeData::LayerNodeView &layerNodes,
679 quint32 layerMask,
680 quint32 typeMask);
681
682 [[nodiscard]] static QSSGLayerRenderData *getCurrent(const QSSGFrameData &data) { return data.getCurrent(); }
683
684 QSSGDefaultMaterialPreparationResult prepareDefaultMaterialForRender(QSSGRenderDefaultMaterial &inMaterial,
685 QSSGRenderableObjectFlags &inExistingFlags,
686 float inOpacity,
687 bool hasAnyLights,
688 bool anyLightHasShadows,
689 QSSGLayerRenderPreparationResultFlags &ioFlags);
690
691 QSSGDefaultMaterialPreparationResult prepareCustomMaterialForRender(QSSGRenderCustomMaterial &inMaterial,
692 QSSGRenderableObjectFlags &inExistingFlags,
693 float inOpacity, bool alreadyDirty,
694 bool hasAnyLights,
695 bool anyLightHasShadows,
696 QSSGLayerRenderPreparationResultFlags &ioFlags);
697
698 static void categorizeAndFilterNodes(const QSSGGlobalRenderNodeData::LayerNodeView &layerNodes,
699 QSSGLayerRenderData::NodeCollection &nodeCollection,
700 quint32 layerMask);
701 void updateFilteredLayerNodes(quint32 layerMask);
702private:
703 friend class QSSGRenderer;
704 friend class QSSGRendererPrivate;
705 friend class QSSGFrameData;
706 friend class QSSGModelHelpers;
707 friend class QSSGRenderHelpers;
708 friend class QSSGParticleRenderer;
709
710 class ExtensionContext
711 {
712 public:
713 explicit ExtensionContext() = default;
714 explicit ExtensionContext(const QSSGRenderExtension &ownerExt, QSSGRenderCamera *cam, size_t idx, quint32 slot)
715 : owner(&ownerExt), camera(cam), ps{}, filter{0}, index(idx), slot(slot)
716 { }
717 const QSSGRenderExtension *owner = nullptr;
718 QSSGRenderCamera *camera = nullptr;
719 QSSGRhiGraphicsPipelineState ps[3] {};
720 QSSGRenderablesFilters filter { 0 };
721 size_t index = 0; // index into the model store
722 quint32 slot = 0;
723 };
724
725 std::vector<ExtensionContext> extContexts { ExtensionContext{ /* 0 - Always available */ } };
726 std::vector<RenderableNodeEntries> renderableModelStore { RenderableNodeEntries{ /* 0 - Always available */ } };
727 std::vector<TModelContextPtrList> modelContextStore { TModelContextPtrList{ /* 0 - Always available */ }};
728 std::vector<QSSGRenderableObjectList> renderableObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
729 std::vector<QSSGRenderableObjectList> opaqueObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
730 std::vector<QSSGRenderableObjectList> transparentObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
731 std::vector<QSSGRenderableObjectList> screenTextureObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
732
733 std::shared_ptr<QSSGGlobalRenderNodeData> nodeData;
734 std::unique_ptr<QSSGRenderModelData> modelData;
735 std::unique_ptr<QSSGRenderItem2DData> item2DData;
736
737 // Soreted cache (per camera and extension)
738 using CameraKey = std::pair<const QSSGRenderCamera*, uint32_t>;
739
740 struct CameraKeyHash {
741 std::size_t operator()(const CameraKey& k) const noexcept {
742 // Hash combine: pointer hash ^ (uint hash shifted)
743 return std::hash<const QSSGRenderCamera*>()(k.first) ^
744 (std::hash<uint32_t>()(k.second) << 1);
745 }
746 };
747
748 struct CameraKeyEq {
749 bool operator()(const CameraKey& a, const CameraKey& b) const noexcept {
750 return a.first == b.first && a.second == b.second;
751 }
752 };
753
754 using PerCameraCache = std::unordered_map<CameraKey, QSSGRenderableObjectList, CameraKeyHash, CameraKeyEq>;
755 std::vector<PerCameraCache> sortedOpaqueObjectCache { PerCameraCache{ /* 0 - Always available */ } };
756 std::vector<PerCameraCache> sortedTransparentObjectCache { PerCameraCache{ /* 0 - Always available */ } };
757 std::vector<PerCameraCache> sortedScreenTextureObjectCache { PerCameraCache{ /* 0 - Always available */ } };
758 std::vector<PerCameraCache> sortedOpaqueDepthPrepassCache { PerCameraCache{ /* 0 - Always available */ } };
759 std::vector<PerCameraCache> sortedDepthWriteCache { PerCameraCache{ /* 0 - Always available */ } };
760
761 [[nodiscard]] const QSSGRenderCameraDataList &getCachedCameraDatas();
762 void ensureCachedCameraDatas();
763 void updateSortedDepthObjectsListImp(const QSSGRenderCamera &camera, size_t index);
764
765 static void prepareModelMaterials(RenderableNodeEntries &renderableModels, bool cullUnrenderables);
766 static void prepareModelMaterials(const RenderableNodeEntries::ConstIterator &begin,
767 const RenderableNodeEntries::ConstIterator &end);
768
769 // Persistent data
770 QHash<QSSGShaderMapKey, QSSGRhiShaderPipelinePtr> shaderMap;
771 QHash<QSSGParticleShaderMapKey, QSSGRhiShaderPipelinePtr> particleShaderMap;
772
773 // Cached buffer.
774 QByteArray generatedShaderString;
775
776 // Saved render state (for sublayers)
777 struct SavedRenderState
778 {
779 QRect viewport;
780 QRect scissorRect;
781 float dpr = 1.0;
782 };
783
784 std::optional<SavedRenderState> savedRenderState;
785
786 // Note: Re-used to avoid expensive initialization.
787 // - Should be revisit, as we can do better.
788 QSSGShaderDefaultMaterialKeyProperties defaultMaterialShaderKeyProperties;
789 QSSGShaderParticleMaterialKeyProperties particleMaterialShaderKeyProperties;
790 QSSGFrameData frameData;
791 QSSGRhiGraphicsPipelineState ps; // Base pipleline state
792 QSSGShaderFeatures features; // Base feature set
793 QSSGRenderNodeVersionType version = 0;
794 bool particlesEnabled = true;
795 bool hasDepthWriteObjects = false;
796 bool zPrePassActive = false;
797 // NOTE: For the time being we need to keep track of extensions modifying the renderables
798 // because then we need to reset the lists.
799 // FIXME: This should be revisited, as we can do better (hence the verbose name).
800 bool renderablesModifiedByExtension = false;
801 enum class DepthPrepassObject : quint8
802 {
803 None = 0x0,
804 ScreenTexture = 0x1,
805 Transparent = 0x2,
806 Opaque = 0x4
807 };
808 using DepthPrepassObjectStateT = std::underlying_type_t<DepthPrepassObject>;
809 DepthPrepassObjectStateT depthPrepassObjectsState { DepthPrepassObjectStateT(DepthPrepassObject::None) };
810 QSSGRenderShadowMapPtr shadowMapManager;
811 QSSGRenderReflectionMapPtr reflectionMapManager;
812 QSSGRenderSkyMaterialManagerPtr skyMaterialManager;
813 QSSGUserRenderPassManagerPtr userRenderPassManager;
814 QSSGRenderMotionVectorMapPtr motionVectorMapManager;
815 QHash<const QSSGModelContext *, QRhiTexture *> lightmapTextures;
816 QHash<const QSSGModelContext *, QRhiTexture *> bonemapTextures;
817 QSSGRhiRenderableTexture renderResults[size_t(QSSGRenderResult::Key::RenderResultCount)] {};
818 QSSGOITRenderContext oitRenderContext;
819};
820
821QT_END_NAMESPACE
822
823#endif // QSSG_LAYER_RENDER_DATA_H
QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer)
const QSSGLayerRenderPreparationResultFlags & getFlags() const
QSSGRenderResult::Key toInternalRenderResultKey(QSSGFrameData::RenderResult id)
Combined button and popup list for selecting options.
QSSGLayerRenderPreparationResultFlag
static const char * effect_fragment_main_with_tonemapping
static const char * effect_vertex_main_post
static const char * effect_vertex_main_pre
static const char * effect_vertex_main_position
static const char * effect_fragment_main
QVector< QSSGRenderableObjectHandle > renderables
QSSGBakedLightingModel(const QSSGRenderModel *model, const QVector< QSSGRenderableObjectHandle > &renderables)
const QSSGRenderModel * model
QSSGDefaultMaterialPreparationResult(QSSGShaderDefaultMaterialKey inMaterialKey)
QSSGShaderDefaultMaterialKey materialKey
QRhiTextureRenderTarget * oitRenderTarget
QRhiRenderPassDescriptor * renderPassDescriptor