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
5#ifndef QSSG_LAYER_RENDER_DATA_H
6#define QSSG_LAYER_RENDER_DATA_H
7
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include <QtQuick3DRuntimeRender/private/qssgrenderitem2d_p.h>
21#include <QtQuick3DRuntimeRender/private/qssgrenderer_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
23#include <QtQuick3DRuntimeRender/private/qssgrenderableobjects_p.h>
24#include <QtQuick3DRuntimeRender/private/qssgrendershadowmap_p.h>
25#include <QtQuick3DRuntimeRender/private/qssgrendereffect_p.h>
26#include <QtQuick3DRuntimeRender/private/qssgrenderresourceloader_p.h>
27#include <QtQuick3DRuntimeRender/private/qssgrenderreflectionmap_p.h>
28#include <QtQuick3DRuntimeRender/private/qssgrendercamera_p.h>
29#include <QtQuick3DRuntimeRender/private/qssgrhicontext_p.h>
30#include <QtQuick3DRuntimeRender/private/qssgperframeallocator_p.h>
31#include <QtQuick3DRuntimeRender/private/qssgshadermapkey_p.h>
32#include <QtQuick3DRuntimeRender/private/qssglightmapbaker_p.h>
33#include <ssg/qssgrenderextensions.h>
34
35#include <QtQuick3DUtils/private/qssgrenderbasetypes_p.h>
36
37#include <optional>
38#include <unordered_map>
39
42
44
46
47class QSGRenderer;
48
50{
51 // Was the data in this layer dirty (meaning re-render to texture, possibly)
53
54 // Was the data in this layer dirty *or* this layer *or* any effect dirty.
55 WasDirty = 1 << 1,
56
58
59 // SSAO should be done in a separate pass
60 // Note that having an AO pass necessitates a DepthTexture so this flag should
61 // never be set without the RequiresDepthTexture flag as well.
63
64 // if some light cause shadow
65 // we need a separate per light shadow map pass
67
69
70 // set together with RequiresScreenTexture when SCREEN_MIP_TEXTURE is used
72
73 // Set when material has custom blend mode(not SourceOver)
75
76 // Set when multisampled depth texture is required
78
80};
81
83{
84 bool wasLayerDataDirty() const
85 {
87 }
88 void setLayerDataDirty(bool inValue)
89 {
91 }
92
93 bool wasDirty() const { return this->operator&(QSSGLayerRenderPreparationResultFlag::WasDirty); }
94 void setWasDirty(bool inValue) { setFlag(QSSGLayerRenderPreparationResultFlag::WasDirty, inValue); }
95
97 {
99 }
100 void setRequiresDepthTexture(bool inValue)
101 {
103 }
104
113
115 void setRequiresSsaoPass(bool inValue)
116 {
118 }
119
121 {
123 }
128
130 {
132 }
137
146
155
157 {
159 }
164};
165
167{
168public:
169 enum class State : quint8
170 {
171 Null = 0,
174 };
175
177 QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer);
178
179 void setState(State state) { m_state = state; }
180 State getState() const { return m_state; }
181 bool isNull() const { return !layer && m_state == State::Null; }
182 bool isLayerVisible() const;
183 QSize textureDimensions() const;
184 QRectF getViewport() const { return viewport; }
185 const QSSGLayerRenderPreparationResultFlags &getFlags() const { return flags; }
186 QSSGRenderLayer *getLayer() const { return layer; }
187
188private:
190 friend class QSSGFrameData;
191
193 QRectF viewport;
194 QSSGRenderLayer *layer = nullptr;
195 State m_state = State::Null;
196};
197
208
210{
211 QSSGBakedLightingModel(const QSSGRenderModel *model, const QVector<QSSGRenderableObjectHandle> &renderables)
212 : model(model),
214 { }
215
218};
219
221{
224 void reset()
225 {
226 delete oitRenderTarget;
227 delete renderPassDescriptor;
228 oitRenderTarget = nullptr;
229 renderPassDescriptor = nullptr;
230 }
231};
232
233class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGLayerRenderData
234{
235public:
236 enum Enum {
237 MAX_AA_LEVELS = 8,
238 MAX_TEMPORAL_AA_LEVELS = 2,
239 };
240
241 using InstanceTransforms = QSSGGlobalRenderNodeData::InstanceTransforms;
242 using ModelViewProjections = QSSGRenderModelData::ModelViewProjections;
243
244 using QSSGModelsView = QSSGDataView<QSSGRenderModel *>;
245 using QSSGParticlesView = QSSGDataView<QSSGRenderParticles *>;
246 using QSSGItem2DsView = QSSGDataView<QSSGRenderItem2D *>;
247 using QSSGCamerasView = QSSGDataView<QSSGRenderCamera *>;
248 using QSSGLightsView = QSSGDataView<QSSGRenderLight *>;
249 using QSSGReflectionProbesView = QSSGDataView<QSSGRenderReflectionProbe *>;
250 using QSSGNonCategorizedView = QSSGDataView<QSSGRenderNode *>;
251
252 using RenderableFilter = std::function<bool(QSSGModelContext *)>;
253
254 QSSGLayerRenderData(QSSGRenderLayer &inLayer, QSSGRenderer &inRenderer);
255 ~QSSGLayerRenderData();
256
257 typedef QVector<QSSGModelContext *> TModelContextPtrList;
258 using RenderableNodeEntries = QVector<QSSGRenderableNodeEntry>;
259 using RenderableItem2DEntries = QVector<QSSGRenderItem2D *>;
260
261 void prepareImageForRender(QSSGRenderImage &inImage,
262 QSSGRenderableImage::Type inMapType,
263 QSSGRenderableImage *&ioFirstImage,
264 QSSGRenderableImage *&ioNextImage,
265 QSSGRenderableObjectFlags &ioFlags,
266 QSSGShaderDefaultMaterialKey &ioGeneratedShaderKey,
267 quint32 inImageIndex, QSSGRenderDefaultMaterial *inMaterial = nullptr);
268
269 void setVertexInputPresence(const QSSGRenderableObjectFlags &renderableFlags,
270 QSSGShaderDefaultMaterialKey &key);
271
272 static void prepareModelBoneTextures(const QSSGRenderContextInterface &contextInterface,
273 const RenderableNodeEntries &renderableModels);
274
275 // Helper functions used during PrepareForRender and PrepareAndRender
276 // Updates lights with model receivesShadows. Do not pass globalLights.
277 bool prepareModelsForRender(QSSGRenderContextInterface &ctx,
278 const RenderableNodeEntries &renderableModels,
279 QSSGLayerRenderPreparationResultFlags &ioFlags,
280 const QSSGRenderCameraList &allCameras,
281 const QSSGRenderCameraDataList &allCameraData,
282 TModelContextPtrList &modelContexts,
283 QSSGRenderableObjectList &opaqueObjects,
284 QSSGRenderableObjectList &transparentObjects,
285 QSSGRenderableObjectList &screenTextureObjects,
286 float lodThreshold = 0.0f);
287 bool prepareParticlesForRender(const RenderableNodeEntries &renderableParticles, const QSSGRenderCameraData &cameraData, QSSGLayerRenderPreparationResultFlags &ioFlags);
288
289 void prepareResourceLoaders();
290
291 void prepareForRender();
292 // Helper function used during prepareForRender
293 void prepareReflectionProbesForRender();
294
295 static qsizetype frustumCulling(const QSSGClippingFrustum &clipFrustum, const QSSGRenderableObjectList &renderables, QSSGRenderableObjectList &visibleRenderables);
296 [[nodiscard]] static qsizetype frustumCullingInline(const QSSGClippingFrustum &clipFrustum, QSSGRenderableObjectList &renderables);
297
298
299 // 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).
300 const QSSGRenderableObjectList &getSortedOpaqueRenderableObjects(const QSSGRenderCamera &camera, size_t index = 0);
301 // If layer depth test is false, this may also contain opaque objects.
302 const QSSGRenderableObjectList &getSortedTransparentRenderableObjects(const QSSGRenderCamera &camera, size_t index = 0);
303 const QSSGRenderableObjectList &getSortedScreenTextureRenderableObjects(const QSSGRenderCamera &camera, size_t index = 0);
304 const QVector<QSSGBakedLightingModel> &getSortedBakedLightingModels();
305 const RenderableItem2DEntries &getRenderableItem2Ds();
306 const QSSGRenderableObjectList &getSortedRenderedDepthWriteObjects(const QSSGRenderCamera &camera, size_t index = 0);
307 const QSSGRenderableObjectList &getSortedrenderedOpaqueDepthPrepassObjects(const QSSGRenderCamera &camera, size_t index = 0);
308
309 void resetForFrame();
310
311 QSSGFrameData &getFrameData();
312
313 ShadowMapPass shadowMapPass;
314 ReflectionMapPass reflectionMapPass;
315 ZPrePassPass zPrePassPass;
316 SSAOMapPass ssaoMapPass;
317 DepthMapPass depthMapPass;
318 DepthMapPass depthMapPassMS;
319 ScreenMapPass screenMapPass;
320 ScreenReflectionPass reflectionPass;
321 Item2DPass item2DPass;
322 SkyboxPass skyboxPass;
323 SkyboxCubeMapPass skyboxCubeMapPass;
324 static constexpr size_t USERPASSES = 3; // See QSSGRenderLayer::RenderExtensionMode::Count
325 UserPass userPasses[USERPASSES];
326 OpaquePass opaquePass;
327 TransparentPass transparentPass;
328 OITRenderPass oitRenderPass;
329 OITCompositePass oitCompositePass;
330 InfiniteGridPass infiniteGridPass;
331 DebugDrawPass debugDrawPass;
332 NormalPass normalPass;
333
334 // Built-in passes
335 QVarLengthArray<QSSGRenderPass *, 16> activePasses;
336
337 QSSGRenderLayer &layer;
338 QSSGRenderer *renderer = nullptr;
339 // List of nodes we can render, not all may be active. Found by doing a depth-first
340 // search through m_FirstChild if length is zero.
341
342 using LayerNodes = std::vector<QSSGRenderNode *>;
343 QSSGGlobalRenderNodeData::LayerNodeView layerNodes;
344 LayerNodes layerNodesCategorized;
345
346 // renderableNodes have all lights, but properties configured for specific node
347 RenderableNodeEntries renderableModels;
348 RenderableNodeEntries renderableParticles;
349
350 // Views into the collected nodes (unsorted)
351 QSSGModelsView modelsView;
352 QSSGParticlesView particlesView;
353 QSSGItem2DsView item2DsView;
354 QSSGCamerasView camerasView;
355 QSSGLightsView lightsView;
356 QSSGReflectionProbesView reflectionProbesView;
357 QSSGNonCategorizedView nonCategorizedView;
358
359 // Results of prepare for render.
360 QSSGRenderCameraList renderedCameras; // multiple items with multiview, one otherwise (or zero if no cameras at all)
361 QSSGShaderLightList globalLights; // All non-scoped lights
362
363 QVector<QSSGBakedLightingModel> bakedLightingModels;
364 // Sorted lists of the rendered objects. There may be other transforms applied so
365 // it is simplest to duplicate the lists.
366 QVector<QSSGBakedLightingModel> renderedBakedLightingModels;
367 RenderableItem2DEntries renderedItem2Ds;
368
369 QSSGLayerRenderPreparationResult layerPrepResult;
370 std::optional<QSSGRenderCameraDataList> renderedCameraData;
371
372 TModelContextPtrList modelContexts;
373
374
375 bool tooManyLightsWarningShown = false;
376 bool tooManyDirectionalLightsWarningShown = false;
377 bool oitWarningUnsupportedShown = false;
378 bool oitWarningInvalidBlendModeShown = false;
379 bool orderIndependentTransparencyEnabled = false;
380
381 std::unique_ptr<QSSGLightmapBaker> lightmapBaker = nullptr;
382
383 QSSGShaderFeatures getShaderFeatures() const { return features; }
384 QSSGRhiGraphicsPipelineState getPipelineState() const { return ps; }
385
386 void initializeLightmapBaking(QSSGLightmapBaker::Context &ctx);
387 void maybeProcessLightmapBaking();
388
389 [[nodiscard]] QSSGRenderGraphObject *getCamera(QSSGCameraId id) const;
390 [[nodiscard]] QSSGRenderCamera *activeCamera() const { return !renderedCameras.isEmpty() ? renderedCameras[0] : nullptr; }
391
392 [[nodiscard]] QSSGRenderCameraData getCameraRenderData(const QSSGRenderCamera *camera);
393 [[nodiscard]] QSSGRenderCameraData getCameraRenderData(const QSSGRenderCamera *camera) const;
394
395 void setLightmapTexture(const QSSGModelContext &modelContext, QRhiTexture *lightmapTexture);
396 [[nodiscard]] QRhiTexture *getLightmapTexture(const QSSGModelContext &modelContext) const;
397
398 void setBonemapTexture(const QSSGModelContext &modelContext, QRhiTexture *bonemapTexture);
399 [[nodiscard]] QRhiTexture *getBonemapTexture(const QSSGModelContext &modelContext) const;
400
401 [[nodiscard]] QSSGRenderContextInterface *contextInterface() const;
402 // Note: temp. API to report the state of the z-prepass step
403 [[nodiscard]] bool isZPrePassActive() const { return zPrePassActive; }
404 void setZPrePassPrepResult(bool res) { zPrePassActive = res; }
405
406 // Exposed as const, as we often need to use this to look-up values from a specific key.
407 [[nodiscard]] const QSSGShaderDefaultMaterialKeyProperties &getDefaultMaterialPropertyTable() const
408 {
409 return defaultMaterialShaderKeyProperties;
410 }
411
412 struct GlobalRenderProperties
413 {
414 bool isYUpInFramebuffer = true;
415 bool isYUpInNDC = true;
416 bool isClipDepthZeroToOne = true;
417 };
418
419 [[nodiscard]] static GlobalRenderProperties globalRenderProperties(const QSSGRenderContextInterface &ctx);
420
421 // Temp. API. Ideally there shouldn't be a reason for anyone to hold onto these,
422 // but we follow the existing pattern for now.
423 const QSSGRenderShadowMapPtr &requestShadowMapManager();
424 const QSSGRenderReflectionMapPtr &requestReflectionMapManager();
425 const QSSGRenderShadowMapPtr &getShadowMapManager() const { return shadowMapManager; }
426 const QSSGRenderReflectionMapPtr &getReflectionMapManager() const { return reflectionMapManager; }
427
428 QSSGOITRenderContext &getOitRenderContext() { return oitRenderContext; }
429
430 static bool prepareInstancing(QSSGRhiContext *rhiCtx,
431 QSSGSubsetRenderable *renderable,
432 const QVector3D &cameraDirection,
433 const QVector3D &cameraPosition,
434 float minThreshold,
435 float maxThreshold);
436
437 [[nodiscard]] QSSGRhiRenderableTexture *getRenderResult(QSSGFrameData::RenderResult id) { return &renderResults[size_t(id)]; }
438 [[nodiscard]] const QSSGRhiRenderableTexture *getRenderResult(QSSGFrameData::RenderResult id) const { return &renderResults[size_t(id)]; }
439 [[nodiscard]] static inline const std::unique_ptr<QSSGPerFrameAllocator> &perFrameAllocator(QSSGRenderContextInterface &ctx);
440 [[nodiscard]] static inline QSSGLayerRenderData *getCurrent(const QSSGRenderer &renderer) { return renderer.m_currentLayer; }
441 void saveRenderState(const QSSGRenderer &renderer);
442 void restoreRenderState(QSSGRenderer &renderer);
443
444 static void setTonemapFeatures(QSSGShaderFeatures &features, QSSGRenderLayer::TonemapMode tonemapMode)
445 {
446 features.set(QSSGShaderFeatures::Feature::LinearTonemapping,
447 tonemapMode == QSSGRenderLayer::TonemapMode::Linear);
448 features.set(QSSGShaderFeatures::Feature::AcesTonemapping,
449 tonemapMode == QSSGRenderLayer::TonemapMode::Aces);
450 features.set(QSSGShaderFeatures::Feature::HejlDawsonTonemapping,
451 tonemapMode == QSSGRenderLayer::TonemapMode::HejlDawson);
452 features.set(QSSGShaderFeatures::Feature::FilmicTonemapping,
453 tonemapMode == QSSGRenderLayer::TonemapMode::Filmic);
454 features.set(QSSGShaderFeatures::Feature::ForceIblExposure,
455 tonemapMode == QSSGRenderLayer::TonemapMode::Custom);
456 }
457
458 QSSGPrepContextId getOrCreateExtensionContext(const QSSGRenderExtension &ext,
459 QSSGRenderCamera *camera = nullptr,
460 quint32 slot = 0);
461
462 // Model API
463 QSSGRenderablesId createRenderables(QSSGPrepContextId prepId, const QSSGNodeIdList &nodes, QSSGRenderHelpers::CreateFlags createFlags);
464 void setGlobalTransform(QSSGRenderablesId renderablesId, const QSSGRenderModel &model, const QMatrix4x4 &mvp);
465 QMatrix4x4 getGlobalTransform(QSSGPrepContextId prepId, const QSSGRenderModel &model);
466 void setGlobalOpacity(QSSGRenderablesId renderablesId, const QSSGRenderModel &model, float opacity);
467 float getGlobalOpacity(QSSGPrepContextId prepId, const QSSGRenderModel &model);
468 [[nodiscard]] QMatrix4x4 getModelMvps(QSSGPrepContextId prepId, const QSSGRenderModel &model) const;
469 void setModelMaterials(QSSGRenderablesId renderablesId, const QSSGRenderModel &model, const QList<QSSGResourceId> &materials);
470 void setModelMaterials(const QSSGRenderablesId renderablesId, const QList<QSSGResourceId> &materials);
471 [[nodiscard]] QSSGPrepResultId prepareModelsForRender(QSSGRenderContextInterface &contextInterface,
472 QSSGPrepContextId prepId,
473 QSSGRenderablesId renderablesId,
474 float lodThreshold);
475
476 // Convenience wrappers for getting values from the node, model store.
477 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h, QMatrix4x4 defaultValue) const
478 {
479 return nodeData->getGlobalTransform(h, defaultValue);
480 }
481 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h) const
482 {
483 return nodeData->getGlobalTransform(h, QMatrix4x4());
484 }
485 [[nodiscard]] QMatrix4x4 getGlobalTransform(const QSSGRenderNode &node) const
486 {
487 return nodeData->getGlobalTransform(node.h, node.localTransform);
488 }
489 [[nodiscard]] QMatrix3x3 getNormalMatrix(QSSGRenderModelHandle h) const
490 {
491 return modelData->getNormalMatrix(h, QMatrix3x3(Qt::Uninitialized));
492 }
493 [[nodiscard]] QMatrix3x3 getNormalMatrix(const QSSGRenderModel &model) const
494 {
495 return modelData->getNormalMatrix(model);
496 }
497 [[nodiscard]] ModelViewProjections getModelMvps(QSSGRenderModelHandle h) const
498 {
499 return modelData->getModelViewProjection(h);
500 }
501 [[nodiscard]] ModelViewProjections getModelMvps(const QSSGRenderModel &model) const
502 {
503 return modelData->getModelViewProjection(model);
504 }
505 [[nodiscard]] InstanceTransforms getInstanceTransforms(QSSGRenderNodeHandle h) const
506 {
507 return nodeData->getInstanceTransforms(h);
508 }
509 [[nodiscard]] InstanceTransforms getInstanceTransforms(const QSSGRenderNode &node) const
510 {
511 return nodeData->getInstanceTransforms(node.h);
512 }
513 [[nodiscard]] float getGlobalOpacity(QSSGRenderNodeHandle h, float defaultValue = 1.0f) const
514 {
515 return nodeData->getGlobalOpacity(h, defaultValue);
516 }
517 [[nodiscard]] float getGlobalOpacity(const QSSGRenderNode &node) const
518 {
519 return nodeData->getGlobalOpacity(node.h);
520 }
521
522 //
523 [[nodiscard]] QSSGRenderItem2DData::Item2DRenderer getItem2DRenderer(const QSSGRenderItem2D &item) const
524 {
525 return item2DData->getItem2DRenderer(item);
526 }
527
528 [[nodiscard]] const std::unique_ptr<QRhiRenderPassDescriptor> &getItem2DRenderPassDescriptor() const
529 {
530 return item2DData->getItem2DRenderPassDescriptor();
531 }
532
533 [[nodiscard]] ModelViewProjections getItem2DMvps(QSSGRenderItem2DHandle h) const
534 {
535 return item2DData->getModelViewProjection(h);
536 }
537
538 [[nodiscard]] ModelViewProjections getItem2DMvps(const QSSGRenderItem2D &item) const
539 {
540 return item2DData->getModelViewProjection(item);
541 }
542
543
544 //
545 void prepareRenderables(QSSGRenderContextInterface &ctx,
546 QSSGPrepResultId prepId,
547 QRhiRenderPassDescriptor *renderPassDescriptor,
548 const QSSGRhiGraphicsPipelineState &ps,
549 QSSGRenderablesFilters filter);
550 void renderRenderables(QSSGRenderContextInterface &ctx,
551 QSSGPrepResultId prepId);
552
553 static bool calculateGlobalVariables(QSSGRenderNode &node,
554 std::vector<QMatrix4x4> &globalTransforms,
555 std::vector<float> &globalOpacities);
556
557 QSSGRenderCameraData getCameraDataImpl(const QSSGRenderCamera *camera) const;
558
559 static QSSGNodeIdList filter(const QSSGGlobalRenderNodeData::LayerNodeView &layerNodes,
560 quint32 layerMask,
561 quint32 typeMask);
562
563private:
564 friend class QSSGRenderer;
565 friend class QSSGRendererPrivate;
566 friend class QSSGFrameData;
567 friend class QSSGModelHelpers;
568 friend class QSSGRenderHelpers;
569
570 class ExtensionContext
571 {
572 public:
573 explicit ExtensionContext() = default;
574 explicit ExtensionContext(const QSSGRenderExtension &ownerExt, QSSGRenderCamera *cam, size_t idx, quint32 slot)
575 : owner(&ownerExt), camera(cam), ps{}, filter{0}, index(idx), slot(slot)
576 { }
577 const QSSGRenderExtension *owner = nullptr;
578 QSSGRenderCamera *camera = nullptr;
579 QSSGRhiGraphicsPipelineState ps[3] {};
580 QSSGRenderablesFilters filter { 0 };
581 size_t index = 0; // index into the model store
582 quint32 slot = 0;
583 };
584
585 std::vector<ExtensionContext> extContexts { ExtensionContext{ /* 0 - Always available */ } };
586 std::vector<RenderableNodeEntries> renderableModelStore { RenderableNodeEntries{ /* 0 - Always available */ } };
587 std::vector<TModelContextPtrList> modelContextStore { TModelContextPtrList{ /* 0 - Always available */ }};
588 std::vector<QSSGRenderableObjectList> renderableObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
589 std::vector<QSSGRenderableObjectList> opaqueObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
590 std::vector<QSSGRenderableObjectList> transparentObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
591 std::vector<QSSGRenderableObjectList> screenTextureObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
592
593 std::shared_ptr<QSSGGlobalRenderNodeData> nodeData;
594 std::unique_ptr<QSSGRenderModelData> modelData;
595 std::unique_ptr<QSSGRenderItem2DData> item2DData;
596
597 // Soreted cache (per camera and extension)
598 using PerCameraCache = std::unordered_map<const QSSGRenderCamera *, QSSGRenderableObjectList>;
599 std::vector<PerCameraCache> sortedOpaqueObjectCache { PerCameraCache{ /* 0 - Always available */ } };
600 std::vector<PerCameraCache> sortedTransparentObjectCache { PerCameraCache{ /* 0 - Always available */ } };
601 std::vector<PerCameraCache> sortedScreenTextureObjectCache { PerCameraCache{ /* 0 - Always available */ } };
602 std::vector<PerCameraCache> sortedOpaqueDepthPrepassCache { PerCameraCache{ /* 0 - Always available */ } };
603 std::vector<PerCameraCache> sortedDepthWriteCache { PerCameraCache{ /* 0 - Always available */ } };
604
605 [[nodiscard]] const QSSGRenderCameraDataList &getCachedCameraDatas();
606 void ensureCachedCameraDatas();
607 void updateSortedDepthObjectsListImp(const QSSGRenderCamera &camera, size_t index);
608
609
610 QSSGDefaultMaterialPreparationResult prepareDefaultMaterialForRender(QSSGRenderDefaultMaterial &inMaterial,
611 QSSGRenderableObjectFlags &inExistingFlags,
612 float inOpacity,
613 bool hasAnyLights,
614 bool anyLightHasShadows,
615 QSSGLayerRenderPreparationResultFlags &ioFlags);
616
617 QSSGDefaultMaterialPreparationResult prepareCustomMaterialForRender(QSSGRenderCustomMaterial &inMaterial,
618 QSSGRenderableObjectFlags &inExistingFlags,
619 float inOpacity, bool alreadyDirty,
620 bool hasAnyLights, bool anyLightHasShadows,
621 QSSGLayerRenderPreparationResultFlags &ioFlags);
622
623 static void prepareModelMaterials(RenderableNodeEntries &renderableModels, bool cullUnrenderables);
624 static void prepareModelMaterials(const RenderableNodeEntries::ConstIterator &begin,
625 const RenderableNodeEntries::ConstIterator &end);
626
627 // Persistent data
628 QHash<QSSGShaderMapKey, QSSGRhiShaderPipelinePtr> shaderMap;
629
630 // Cached buffer.
631 QByteArray generatedShaderString;
632
633 // Saved render state (for sublayers)
634 struct SavedRenderState
635 {
636 QRect viewport;
637 QRect scissorRect;
638 float dpr = 1.0;
639 };
640
641 std::optional<SavedRenderState> savedRenderState;
642
643 // Note: Re-used to avoid expensive initialization.
644 // - Should be revisit, as we can do better.
645 QSSGShaderDefaultMaterialKeyProperties defaultMaterialShaderKeyProperties;
646 QSSGFrameData frameData;
647 QSSGRhiGraphicsPipelineState ps; // Base pipleline state
648 QSSGShaderFeatures features; // Base feature set
649 quint32 version = 0;
650 bool particlesEnabled = true;
651 bool hasDepthWriteObjects = false;
652 bool zPrePassActive = false;
653 // NOTE: For the time being we need to keep track of extensions modifying the renderables
654 // because then we need to reset the lists.
655 // FIXME: This should be revisited, as we can do better (hence the verbose name).
656 bool renderablesModifiedByExtension = false;
657 enum class DepthPrepassObject : quint8
658 {
659 None = 0x0,
660 ScreenTexture = 0x1,
661 Transparent = 0x2,
662 Opaque = 0x4
663 };
664 using DepthPrepassObjectStateT = std::underlying_type_t<DepthPrepassObject>;
665 DepthPrepassObjectStateT depthPrepassObjectsState { DepthPrepassObjectStateT(DepthPrepassObject::None) };
666 QSSGRenderShadowMapPtr shadowMapManager;
667 QSSGRenderReflectionMapPtr reflectionMapManager;
668 QHash<const QSSGModelContext *, QRhiTexture *> lightmapTextures;
669 QHash<const QSSGModelContext *, QRhiTexture *> bonemapTextures;
670 QSSGRhiRenderableTexture renderResults[7] {};
671 QSSGOITRenderContext oitRenderContext;
672};
673
674QT_END_NAMESPACE
675
676#endif // QSSG_LAYER_RENDER_DATA_H
QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer)
const QSSGLayerRenderPreparationResultFlags & getFlags() const
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