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 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h) const;
479 [[nodiscard]] QMatrix4x4 getGlobalTransform(const QSSGRenderNode &node) const;
480
481 [[nodiscard]] QMatrix3x3 getNormalMatrix(QSSGRenderModelHandle h) const;
482 [[nodiscard]] QMatrix3x3 getNormalMatrix(const QSSGRenderModel &model) const;
483
484 [[nodiscard]] ModelViewProjections getModelMvps(QSSGRenderModelHandle h) const;
485 [[nodiscard]] ModelViewProjections getModelMvps(const QSSGRenderModel &model) const;
486
487 [[nodiscard]] InstanceTransforms getInstanceTransforms(QSSGRenderNodeHandle h) const;
488 [[nodiscard]] InstanceTransforms getInstanceTransforms(const QSSGRenderNode &node) const;
489
490 [[nodiscard]] float getGlobalOpacity(QSSGRenderNodeHandle h, float defaultValue = 1.0f) const;
491 [[nodiscard]] float getGlobalOpacity(const QSSGRenderNode &node) const;
492
493 //
494 [[nodiscard]] QSSGRenderItem2DData::Item2DRenderer getItem2DRenderer(const QSSGRenderItem2D &item) const
495 {
496 return item2DData->getItem2DRenderer(item);
497 }
498
499 [[nodiscard]] const std::unique_ptr<QRhiRenderPassDescriptor> &getItem2DRenderPassDescriptor() const
500 {
501 return item2DData->getItem2DRenderPassDescriptor();
502 }
503
504 [[nodiscard]] ModelViewProjections getItem2DMvps(QSSGRenderItem2DHandle h) const
505 {
506 return item2DData->getModelViewProjection(h);
507 }
508
509 [[nodiscard]] ModelViewProjections getItem2DMvps(const QSSGRenderItem2D &item) const
510 {
511 return item2DData->getModelViewProjection(item);
512 }
513
514
515 //
516 void prepareRenderables(QSSGRenderContextInterface &ctx,
517 QSSGPrepResultId prepId,
518 QRhiRenderPassDescriptor *renderPassDescriptor,
519 const QSSGRhiGraphicsPipelineState &ps,
520 QSSGRenderablesFilters filter);
521 void renderRenderables(QSSGRenderContextInterface &ctx,
522 QSSGPrepResultId prepId);
523
524 static bool calculateGlobalVariables(QSSGRenderNode &node,
525 std::vector<QMatrix4x4> &globalTransforms,
526 std::vector<float> &globalOpacities);
527
528 QSSGRenderCameraData getCameraDataImpl(const QSSGRenderCamera *camera) const;
529
530 static QSSGNodeIdList filter(const QSSGGlobalRenderNodeData::LayerNodeView &layerNodes,
531 quint32 layerMask,
532 quint32 typeMask);
533
534private:
535 friend class QSSGRenderer;
536 friend class QSSGRendererPrivate;
537 friend class QSSGFrameData;
538 friend class QSSGModelHelpers;
539 friend class QSSGRenderHelpers;
540
541 class ExtensionContext
542 {
543 public:
544 explicit ExtensionContext() = default;
545 explicit ExtensionContext(const QSSGRenderExtension &ownerExt, QSSGRenderCamera *cam, size_t idx, quint32 slot)
546 : owner(&ownerExt), camera(cam), ps{}, filter{0}, index(idx), slot(slot)
547 { }
548 const QSSGRenderExtension *owner = nullptr;
549 QSSGRenderCamera *camera = nullptr;
550 QSSGRhiGraphicsPipelineState ps[3] {};
551 QSSGRenderablesFilters filter { 0 };
552 size_t index = 0; // index into the model store
553 quint32 slot = 0;
554 };
555
556 std::vector<ExtensionContext> extContexts { ExtensionContext{ /* 0 - Always available */ } };
557 std::vector<RenderableNodeEntries> renderableModelStore { RenderableNodeEntries{ /* 0 - Always available */ } };
558 std::vector<TModelContextPtrList> modelContextStore { TModelContextPtrList{ /* 0 - Always available */ }};
559 std::vector<QSSGRenderableObjectList> renderableObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
560 std::vector<QSSGRenderableObjectList> opaqueObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
561 std::vector<QSSGRenderableObjectList> transparentObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
562 std::vector<QSSGRenderableObjectList> screenTextureObjectStore { QSSGRenderableObjectList{ /* 0 - Always available */ }};
563
564 std::shared_ptr<QSSGGlobalRenderNodeData> nodeData;
565 std::unique_ptr<QSSGRenderModelData> modelData;
566 std::unique_ptr<QSSGRenderItem2DData> item2DData;
567
568 // Soreted cache (per camera and extension)
569 using PerCameraCache = std::unordered_map<const QSSGRenderCamera *, QSSGRenderableObjectList>;
570 std::vector<PerCameraCache> sortedOpaqueObjectCache { PerCameraCache{ /* 0 - Always available */ } };
571 std::vector<PerCameraCache> sortedTransparentObjectCache { PerCameraCache{ /* 0 - Always available */ } };
572 std::vector<PerCameraCache> sortedScreenTextureObjectCache { PerCameraCache{ /* 0 - Always available */ } };
573 std::vector<PerCameraCache> sortedOpaqueDepthPrepassCache { PerCameraCache{ /* 0 - Always available */ } };
574 std::vector<PerCameraCache> sortedDepthWriteCache { PerCameraCache{ /* 0 - Always available */ } };
575
576 [[nodiscard]] const QSSGRenderCameraDataList &getCachedCameraDatas();
577 void ensureCachedCameraDatas();
578 void updateSortedDepthObjectsListImp(const QSSGRenderCamera &camera, size_t index);
579
580
581 QSSGDefaultMaterialPreparationResult prepareDefaultMaterialForRender(QSSGRenderDefaultMaterial &inMaterial,
582 QSSGRenderableObjectFlags &inExistingFlags,
583 float inOpacity,
584 bool hasAnyLights,
585 bool anyLightHasShadows,
586 QSSGLayerRenderPreparationResultFlags &ioFlags);
587
588 QSSGDefaultMaterialPreparationResult prepareCustomMaterialForRender(QSSGRenderCustomMaterial &inMaterial,
589 QSSGRenderableObjectFlags &inExistingFlags,
590 float inOpacity, bool alreadyDirty,
591 bool hasAnyLights, bool anyLightHasShadows,
592 QSSGLayerRenderPreparationResultFlags &ioFlags);
593
594 static void prepareModelMaterials(RenderableNodeEntries &renderableModels, bool cullUnrenderables);
595 static void prepareModelMaterials(const RenderableNodeEntries::ConstIterator &begin,
596 const RenderableNodeEntries::ConstIterator &end);
597
598 // Persistent data
599 QHash<QSSGShaderMapKey, QSSGRhiShaderPipelinePtr> shaderMap;
600
601 // Cached buffer.
602 QByteArray generatedShaderString;
603
604 // Saved render state (for sublayers)
605 struct SavedRenderState
606 {
607 QRect viewport;
608 QRect scissorRect;
609 float dpr = 1.0;
610 };
611
612 std::optional<SavedRenderState> savedRenderState;
613
614 // Note: Re-used to avoid expensive initialization.
615 // - Should be revisit, as we can do better.
616 QSSGShaderDefaultMaterialKeyProperties defaultMaterialShaderKeyProperties;
617 QSSGFrameData frameData;
618 QSSGRhiGraphicsPipelineState ps; // Base pipleline state
619 QSSGShaderFeatures features; // Base feature set
620 quint32 version = 0;
621 bool particlesEnabled = true;
622 bool hasDepthWriteObjects = false;
623 bool zPrePassActive = false;
624 // NOTE: For the time being we need to keep track of extensions modifying the renderables
625 // because then we need to reset the lists.
626 // FIXME: This should be revisited, as we can do better (hence the verbose name).
627 bool renderablesModifiedByExtension = false;
628 enum class DepthPrepassObject : quint8
629 {
630 None = 0x0,
631 ScreenTexture = 0x1,
632 Transparent = 0x2,
633 Opaque = 0x4
634 };
635 using DepthPrepassObjectStateT = std::underlying_type_t<DepthPrepassObject>;
636 DepthPrepassObjectStateT depthPrepassObjectsState { DepthPrepassObjectStateT(DepthPrepassObject::None) };
637 QSSGRenderShadowMapPtr shadowMapManager;
638 QSSGRenderReflectionMapPtr reflectionMapManager;
639 QHash<const QSSGModelContext *, QRhiTexture *> lightmapTextures;
640 QHash<const QSSGModelContext *, QRhiTexture *> bonemapTextures;
641 QSSGRhiRenderableTexture renderResults[7] {};
642 QSSGOITRenderContext oitRenderContext;
643};
644
645QT_END_NAMESPACE
646
647#endif // QSSG_LAYER_RENDER_DATA_H
QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer)
const QSSGLayerRenderPreparationResultFlags & getFlags() const
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