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