5#ifndef QSSG_RENDERER_P_H
6#define QSSG_RENDERER_P_H
19#include <private/qssgrenderpickresult_p.h>
20#include <private/qssgrhicontext_p.h>
21#include <private/qssgrhiquadrenderer_p.h>
23#include <QtCore/qpointer.h>
30class QSSGProgramGenerator;
31class QSSGShaderLibraryManager;
32class QSSGBufferManager;
36struct QSSGRenderItem2D;
38class QSSGSubsetRenderable;
40struct QSSGShaderFeatures;
42class QSGRenderContext;
46 Q_DISABLE_COPY(QSSGRenderer)
52 bool prepareLayerForRender(QSSGRenderLayer &inLayer);
54 void rhiPrepare(QSSGRenderLayer &inLayer);
55 void rhiRender(QSSGRenderLayer &inLayer);
59 void beginFrame(QSSGRenderLayer &layer,
bool allowRecursion =
true);
64 bool endFrame(QSSGRenderLayer &layer,
bool allowRecursion =
true);
69 void setViewport(QRect inViewport) { m_viewport = inViewport; }
72 void setDpr(
float dpr) { m_dpr = dpr; }
73 float dpr()
const {
return m_dpr; }
95 void cleanupResources(QList<QSSGRenderGraphObject*> &resources);
99 friend class QSSGRendererPrivate;
108 void endLayerRender();
109 void addMaterialDirtyClear(QSSGRenderGraphObject *material);
110 void cleanupUnreferencedBuffers(QSSGRenderLayer *inLayer);
111 void resetResourceCounters(QSSGRenderLayer *inLayer);
112 void releaseCachedResources();
119 bool m_globalPickingEnabled =
false;
124 QSet<QSSGRenderGraphObject *> m_materialClearDirty;
126 QPointer<QSGRenderContext> m_qsgRenderContext;
130 std::vector<QSSGRenderItem2DData *> m_item2DDatas;
132 mutable std::unique_ptr<QSSGRhiQuadRenderer> m_rhiQuadRenderer;
133 mutable std::unique_ptr<QSSGRhiCubeRenderer> m_rhiCubeRenderer;
135 quint32 m_activeFrameRef = 0;
136 quint32 m_frameCount = 0;
146 QSSGRendererPrivate() =
default;
148 using PickResultList = QVarLengthArray<QSSGRenderPickResult, 20>;
150 static QSSGRhiShaderPipelinePtr generateRhiShaderPipelineImpl(QSSGSubsetRenderable &renderable,
151 QSSGShaderLibraryManager &shaderLibraryManager,
152 QSSGShaderCache &shaderCache,
153 QSSGProgramGenerator &shaderProgramGenerator,
154 const QSSGShaderDefaultMaterialKeyProperties &shaderKeyProperties,
155 const QSSGShaderFeatures &featureSet,
156 QByteArray &shaderString);
157 static QSSGRhiShaderPipelinePtr generateRhiShaderPipeline(QSSGRenderer &renderer,
158 QSSGSubsetRenderable &inRenderable,
159 const QSSGShaderFeatures &inFeatureSet);
161 static QSSGRhiShaderPipelinePtr getShaderPipelineForDefaultMaterial(QSSGRenderer &renderer,
162 QSSGSubsetRenderable &inRenderable,
163 const QSSGShaderFeatures &inFeatureSet);
165 static void getLayerHitObjectList(
const QSSGRenderLayer &layer,
166 QSSGBufferManager &bufferManager,
167 const QSSGRenderRay &ray,
168 bool inPickEverything,
169 PickResultList &outIntersectionResult);
170 static void intersectRayWithSubsetRenderable(
const QSSGRenderLayer &layer, QSSGBufferManager &bufferManager,
171 const QSSGRenderRay &inRay,
172 const QSSGRenderNode &node,
173 PickResultList &outIntersectionResultList);
174 static void intersectRayWithItem2D(
const QSSGRenderLayer &layer,
const QSSGRenderRay &inRay,
175 const QSSGRenderItem2D &item2D,
176 PickResultList &outIntersectionResultList);
178 static PickResultList syncPickAll(
const QSSGRenderContextInterface &ctx,
179 const QSSGRenderLayer &layer,
180 const QSSGRenderRay &ray);
182 static PickResultList syncPick(
const QSSGRenderContextInterface &ctx,
183 const QSSGRenderLayer &layer,
184 const QSSGRenderRay &ray,
185 QSSGRenderNode *target =
nullptr);
187 static PickResultList syncPickSubset(
const QSSGRenderLayer &layer,
188 QSSGBufferManager &bufferManager,
189 const QSSGRenderRay &ray,
190 QVarLengthArray<QSSGRenderNode *> subset);
194 static bool isGlobalPickingEnabled(
const QSSGRenderer &renderer) {
return renderer.m_globalPickingEnabled; }
195 static void setGlobalPickingEnabled(QSSGRenderer &renderer,
bool isEnabled);
197 static void setRenderContextInterface(QSSGRenderer &renderer, QSSGRenderContextInterface *ctx);
198 static void setSgRenderContext(QSSGRenderer &renderer, QSGRenderContext *sgRenderCtx);
200 static QSSGLayerRenderData *getCurrentRenderData(
const QSSGRenderer &renderer) {
return renderer.m_currentLayer; }
202 static QSGRenderContext *getSgRenderContext(
const QSSGRenderer &renderer);
204 static constexpr float minimumRenderOpacity = .01f;
QSSGRhiShaderPipelinePtr debugObjectShader
QSSGRhiGraphicsPipelineState ps
void renderPass(QSSGRenderer &renderer) final
Type passType() const final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiShaderPipelinePtr gridShader
void resetForFrame() final
Type passType() const final
Type passType() const final
std::vector< QSGRenderer * > prepdItem2DRenderers
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QSSGShaderFeatures shaderFeatures
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiRenderableTexture * rhiAccumTexture
QRhiShaderResourceBindings * compositeSrb
QSSGRhiShaderPipelinePtr compositeShaderPipeline
QSSGRenderLayer::OITMethod method
void resetForFrame() final
Type passType() const final
QSSGRhiRenderableTexture * rhiRevealageTexture
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
void setMethod(QSSGRenderLayer::OITMethod m)
QSSGRhiRenderableTexture * rhiRevealageTexture
void setMethod(QSSGRenderLayer::OITMethod m)
QSSGShaderFeatures shaderFeatures
QSSGRenderLayer::OITMethod method
QRhiShaderResourceBindings * clearSrb
QSSGRenderableObjectList sortedTransparentObjects
QRhiTextureRenderTarget * renderTarget
void resetForFrame() final
QSSGRhiShaderPipelinePtr clearPipeline
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiRenderableTexture * rhiDepthTexture
QSSGRhiGraphicsPipelineState ps
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QSSGRhiRenderableTexture * rhiAccumTexture
static void prep(const QSSGRenderContextInterface &ctx, QSSGLayerRenderData &data, QSSGPassKey passKey, QSSGRhiGraphicsPipelineState &ps, QSSGShaderFeatures shaderFeatures, QRhiRenderPassDescriptor *rpDesc, const QSSGRenderableObjectList &sortedOpaqueObjects)
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QSSGShaderFeatures shaderFeatures
QSSGRhiGraphicsPipelineState ps
static void render(const QSSGRenderContextInterface &ctx, const QSSGRhiGraphicsPipelineState &ps, const QSSGRenderableObjectList &sortedOpaqueObjects)
QSSGRenderableObjectList sortedOpaqueObjects
QRect viewport() const
Returns the viewport rectangle.
bool isLayerVisible() const
QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer)
QSize textureDimensions() const
void setState(State state)
QRectF getViewport() const
QSSGRenderLayer * getLayer() const
const QSSGLayerRenderPreparationResultFlags & getFlags() const
QSSGLayerRenderPreparationResult()=default
friend class QSSGLayerRenderData
friend class QSSGRenderer
friend class QQuick3DWindowAttachment
virtual ~QSSGRenderPass()
virtual void resetForFrame()=0
virtual Type passType() const =0
virtual void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data)=0
virtual void renderPass(QSSGRenderer &renderer)=0
void releaseItem2DData(const QSSGRenderItem2D &item2D)
const std::unique_ptr< QSSGRhiQuadRenderer > & rhiQuadRenderer() const
quint32 frameDepth() const
friend class QSSGRenderContextInterface
QRect scissorRect() const
void cleanupResources(QSet< QSSGRenderGraphObject * > &resources)
void setViewport(QRect inViewport)
void beginSubLayerRender(QSSGLayerRenderData &inLayer)
const std::unique_ptr< QSSGRhiCubeRenderer > & rhiCubeRenderer() const
void setScissorRect(QRect inScissorRect)
void endSubLayerRender(QSSGLayerRenderData &inLayer)
QSSGRenderContextInterface * contextInterface() const
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
std::shared_ptr< QSSGRenderReflectionMap > reflectionMapManager
QSSGRenderableObjectList reflectionPassObjects
QSSGRhiGraphicsPipelineState ps
QList< QSSGRenderReflectionProbe * > reflectionProbes
Type passType() const final
Type passType() const final
QSSGRhiRenderableTexture * rhiAoTexture
const QSSGRhiRenderableTexture * rhiDepthTexture
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
QSSGRhiShaderPipelinePtr ssaoShaderPipeline
QSSGAmbientOcclusionSettings aoSettings
void renderPass(QSSGRenderer &renderer) final
const QSSGRenderCamera * camera
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QSSGRhiGraphicsPipelineState ps
Type passType() const final
std::optional< SkyboxPass > skyboxPass
QSSGShaderFeatures shaderFeatures
QSSGRenderableObjectList sortedOpaqueObjects
std::optional< SkyboxCubeMapPass > skyboxCubeMapPass
QSSGRhiRenderableTexture * rhiScreenTexture
QSSGRenderableObjectList sortedScreenTextureObjects
const QSSGRhiRenderableTexture * rhiScreenTexture
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
Type passType() const final
QSSGRenderCamera * camera
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGBounds3 castingObjectsBox
QSSGShaderLightList globalLights
QSSGRenderableObjectList shadowPassObjects
QSSGRhiGraphicsPipelineState ps
QSSGBounds3 receivingObjectsBox
void resetForFrame() final
std::unique_ptr< QSSGRenderCamera > debugCamera
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
std::shared_ptr< QSSGRenderShadowMap > shadowMapManager
QRhiRenderPassDescriptor * rpDesc
void renderPass(QSSGRenderer &renderer) final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiShaderPipelinePtr skyBoxCubeShader
QSSGRhiGraphicsPipelineState ps
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QRhiRenderPassDescriptor * rpDesc
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
Type passType() const final
QSSGRhiGraphicsPipelineState ps
static void prep(const QSSGRenderContextInterface &ctx, QSSGLayerRenderData &data, QSSGPassKey passKey, QSSGRhiGraphicsPipelineState &ps, QSSGShaderFeatures shaderFeatures, QRhiRenderPassDescriptor *rpDesc, const QSSGRenderableObjectList &sortedTransparentObjects, bool oit=false)
QSSGRenderableObjectList sortedTransparentObjects
static void render(const QSSGRenderContextInterface &ctx, const QSSGRhiGraphicsPipelineState &ps, const QSSGRenderableObjectList &sortedTransparentObjects)
void renderPass(QSSGRenderer &renderer) final
QSSGShaderFeatures shaderFeatures
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QList< QSSGRenderExtension * > extensions
Type passType() const final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
void resetForFrame() final
void renderPass(QSSGRenderer &renderer) final
QSSGRenderableObjectList renderedOpaqueDepthPrepassObjects
Type passType() const final
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRenderableObjectList renderedDepthWriteObjects
QSSGLayerRenderPreparationResultFlag
@ MaterialHasCustomBlendMode
@ RequiresMipmapsForScreenTexture
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)
QSSGRenderableImage * firstImage
QSSGRenderableObjectFlags renderableFlags
QSSGShaderDefaultMaterialKey materialKey
bool requiresDepthTextureMS() const
void setRequiresSsaoPass(bool inValue)
void setRequiresScreenTexture(bool inValue)
bool wasLayerDataDirty() const
void setRequiresDepthTextureMS(bool inValue)
bool requiresDepthTexture() const
void setLayerDataDirty(bool inValue)
void setWasDirty(bool inValue)
bool requiresMipmapsForScreenTexture() const
bool requiresScreenTexture() const
bool hasCustomBlendMode() const
void setRequiresNormalTexture(bool inValue)
bool requiresShadowMapPass() const
void setRequiresMipmapsForScreenTexture(bool inValue)
void setRequiresDepthTexture(bool inValue)
bool requiresSsaoPass() const
void setRequiresShadowMapPass(bool inValue)
void setHasCustomBlendMode(bool inValue)
bool requiresNormalTexture() const
QRhiTextureRenderTarget * oitRenderTarget
QRhiRenderPassDescriptor * renderPassDescriptor