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
qquick3dsimplequadrenderpass.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5
7
8#include <QtQuick3D/private/qquick3dobject_p.h>
9
10#include <QtQuick3DRuntimeRender/private/qssglayerrenderdata_p.h>
11#include <QtQuick3DRuntimeRender/private/qssgrenderer_p.h>
12#include <QtQuick3DRuntimeRender/private/qssgrhiquadrenderer_p.h>
13#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
14#include <QtQuick3DRuntimeRender/private/qssgrendererimplshaders_p.h>
15#include <QtQuick3DRuntimeRender/private/qssgrendercommands_p.h>
16
17#include <QtQuick3DRuntimeRender/private/qssgrenderbuffermanager_p.h>
18
19#include <ssg/qssgrendercontextcore.h>
20#include <ssg/qssgrenderextensions.h>
21
22#include <rhi/qrhi.h>
23
25
26/*!
27 \qmltype SimpleQuadRenderer
28 \inqmlmodule QtQuick3D.Helpers
29 \inherits RenderExtension
30 \brief The SimpleQuadRenderer class renders a full-screen quad with a specified texture.
31
32 The SimpleQuadRenderer is a convenient way to render a texture across the entire screen.
33
34 \qml
35 import QtQuick3D.Helpers
36
37 SimpleQuadRenderer {
38 texture: Texture {
39 source: "myImage.png"
40 }
41 }
42 \endqml
43
44 \sa RenderPassTexture
45*/
46
48{
49 static constexpr FlagT flags = FlagT(Flags::HasGraphicsResources) | FlagT(QSSGRenderGraphObjectUtils::InternalFlags::AutoRegisterExtension);
50public:
55
56 virtual bool prepareData(QSSGFrameData &data) final
57 {
58 bool wasDirty = true;
59
60 if (image)
61 renderImage = data.contextInterface()->bufferManager()->loadRenderImage(image);
62 else
63 renderImage = QSSGRenderImageTexture();
64
65 wasDirty = (renderImage.m_texture != nullptr);
66
67 return wasDirty;
68 }
69
70 virtual void prepareRender(QSSGFrameData &data) final
71 {
72 if (renderImage.m_texture) {
73 const auto &rhiCtx = data.contextInterface()->rhiContext();
74 const auto &renderer = data.contextInterface()->renderer();
75 QRhiResourceUpdateBatch *rub = rhiCtx->rhi()->nextResourceUpdateBatch();
76 renderer->rhiQuadRenderer()->prepareQuad(rhiCtx.get(), rub);
77 }
78 }
79
80 virtual void render(QSSGFrameData &data) final
81 {
82 if (renderImage.m_texture) {
83 const auto &rhiCtx = data.contextInterface()->rhiContext();
84 const auto &renderer = data.contextInterface()->renderer();
85 const auto &shaderCache = data.contextInterface()->shaderCache();
86
87 QSSGRhiGraphicsPipelineState ps = data.getPipelineState();
88 QRhiCommandBuffer *cb = rhiCtx->commandBuffer();
89 cb->debugMarkBegin(QByteArrayLiteral("QtQuick3D Blit Pass"));
90
91 const auto tonemapMode = QSSGLayerRenderData::getCurrent(data)->layer.tonemapMode;
92 const auto &shaderPipeline = shaderCache->getBuiltInRhiShaders().getRhiSimpleQuadShader(ps.viewCount, tonemapMode);
93
94 QRhiSampler *sampler = rhiCtx->sampler({ QRhiSampler::Linear, QRhiSampler::Linear, QRhiSampler::None,
95 QRhiSampler::ClampToEdge, QRhiSampler::ClampToEdge, QRhiSampler::ClampToEdge });
96 QSSGRhiShaderResourceBindingList bindings;
97 bindings.addTexture(0, QRhiShaderResourceBinding::FragmentStage, renderImage.m_texture, sampler);
98 QSSGRhiContextPrivate *rhiCtxD = QSSGRhiContextPrivate::get(rhiCtx.get());
99 QRhiShaderResourceBindings *srb = rhiCtxD->srb(bindings);
100
101 QSSGRhiGraphicsPipelineStatePrivate::setShaderPipeline(ps, shaderPipeline.get());
102 renderer->rhiQuadRenderer()->recordRenderQuad(rhiCtx.get(), &ps, srb, rhiCtx->mainRenderPassDescriptor(), QSSGRhiQuadRenderer::UvCoords | QSSGRhiQuadRenderer::PremulBlend);
103 cb->debugMarkEnd();
104 }
105 }
106 virtual void resetForFrame() final {}
107 virtual RenderMode mode() const final { return RenderMode::Main; }
108 virtual RenderStage stage() const final { return RenderStage::PostColor; }
109
114};
115
116
117QQuick3DSimpleQuadRenderer::QQuick3DSimpleQuadRenderer() { }
118
119QSSGRenderGraphObject *QQuick3DSimpleQuadRenderer::updateSpatialNode(QSSGRenderGraphObject *node)
120{
121 if (!node)
123
124 QSSGRenderSimpleQuadRenderer *blitPass = static_cast<QSSGRenderSimpleQuadRenderer *>(node);
125 if (m_source)
126 blitPass->image = m_source->getRenderImage();
127 else
128 blitPass->image = nullptr;
129
130 return node;
131}
132
133void QQuick3DSimpleQuadRenderer::itemChange(QQuick3DObject::ItemChange change, const QQuick3DObject::ItemChangeData &value)
134{
135 if (change == QQuick3DObject::ItemSceneChange)
136 updateSceneManager(value.sceneManager);
137}
138
139QQuick3DTexture *QQuick3DSimpleQuadRenderer::texture() const
140{
141 return m_source;
142}
143
144void QQuick3DSimpleQuadRenderer::setTexture(QQuick3DTexture *newSource)
145{
146 if (m_source == newSource)
147 return;
148
149 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DSimpleQuadRenderer::setTexture, newSource, m_source);
150
151 m_source = newSource;
152 emit textureChanged();
153
154 update();
155}
156
157void QQuick3DSimpleQuadRenderer::updateSceneManager(QQuick3DSceneManager *sceneManager)
158{
159 if (sceneManager)
160 QQuick3DObjectPrivate::refSceneManager(m_source, *sceneManager);
161 else
162 QQuick3DObjectPrivate::derefSceneManager(m_source);
163}
164
165QT_END_NAMESPACE
\qmltype SimpleQuadRenderer \inqmlmodule QtQuick3D.Helpers \inherits RenderExtension
virtual void render(QSSGFrameData &data) final
Record the render pass.
virtual void resetForFrame() final
Called each time a new frame starts.
virtual RenderStage stage() const final
virtual void prepareRender(QSSGFrameData &data) final
Prepare data for rendering.
virtual bool prepareData(QSSGFrameData &data) final
Called after scene data is collected, but before any render data or rendering in the current frame ha...
virtual RenderMode mode() const final
Combined button and popup list for selecting options.