7#include "private/qssgassert_p.h"
8#include "private/qssglayerrenderdata_p.h"
14
15
16
17
18
19
22
23
24
25
26
27
28
29
30QSSGFrameData::Result QSSGFrameData::getRenderResult(RenderResult id)
const
32 const QSSGRhiRenderableTexture *res =
nullptr;
33 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
34 const auto resultKey = QSSGRenderResult::toInternalRenderResultKey(id);
35 if (QSSG_GUARD(data && (std::size(data->renderResults) > size_t(resultKey))))
36 res = data->getRenderResult(resultKey);
38 return res ? Result{ res->texture, res->depthStencil } : Result{};
42
43
44
45
46
47
48
49
50
51
53void QSSGFrameData::scheduleRenderResults(RenderResults results)
const
55 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
56 QSSG_ASSERT(data,
return);
58 auto &prepResult = data->layerPrepResult;
60 if (prepResult.getState() != QSSGLayerRenderPreparationResult::State::DataPrep) {
61 qWarning(
"QSSGFrameData::requestRenderResults: "
62 "Requesting render results should only be done during the prepare phase in prepareData().");
66 if (results.testFlag(QSSGFrameData::RenderResult::DepthTexture))
67 prepResult.flags.setRequiresDepthTexture(
true);
68 if (results.testFlag(QSSGFrameData::RenderResult::ScreenTexture))
69 prepResult.flags.setRequiresScreenTexture(
true);
70 if (results.testFlag(RenderResult::AoTexture)) {
72 prepResult.flags.setRequiresSsaoPass(
true);
73 prepResult.flags.setRequiresDepthTexture(
true);
75 if (results.testFlag(RenderResult::NormalTexture))
76 prepResult.flags.setRequiresNormalTexture(
true);
79qsizetype QSSGFrameData::getAttachmentCount(QSSGResourceId userPassId)
const
81 QSSGRenderUserPass *userPassNode = QSSGRenderGraphObjectUtils::getResource<QSSGRenderUserPass>(userPassId);
82 QSSG_ASSERT(userPassNode && userPassNode->type == QSSGRenderGraphObject::Type::RenderPass,
return 0);
84 QSSGRhiRenderableTextureV2Ptr res;
85 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
87 res = data->requestUserRenderPassManager()->getUserPassTexureResult(*userPassNode);
89 return res->colorAttachmentCount();
93
94
95
96
97
98
99
100
101
102
103
104
105QSSGFrameData::Result QSSGFrameData::getRenderResult(QSSGResourceId userPassId, AttachmentSelector attachment)
const
107 QSSGRenderUserPass *userPassNode = QSSGRenderGraphObjectUtils::getResource<QSSGRenderUserPass>(userPassId);
108 QSSG_ASSERT(userPassNode && userPassNode->type == QSSGRenderGraphObject::Type::RenderPass,
return Result{});
110 QSSGRhiRenderableTextureV2Ptr res;
111 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
112 if (QSSG_GUARD(data))
113 res = data->requestUserRenderPassManager()->getUserPassTexureResult(*userPassNode);
117 const quint32 attachmentSelector =
static_cast<quint32>(attachment);
119 if (res && res->isValid()) {
120 if (
const qsizetype attachmentCount = res->colorAttachmentCount(); attachmentCount > qsizetype(attachmentSelector)) {
122 result = { res->getColorTexture(attachmentSelector)->texture().get(), res->getDepthStencil().get() };
124 qWarning() <<
"Requested attachment" << attachmentSelector <<
"but user pass only has" << attachmentCount <<
"attachments.";
132
133
134void QSSGFrameData::scheduleRenderResults(QSSGResourceId userPassId)
const
136 QSSGRenderUserPass *userPassNode = QSSGRenderGraphObjectUtils::getResource<QSSGRenderUserPass>(userPassId);
137 QSSG_ASSERT(userPassNode && userPassNode->type == QSSGRenderGraphObject::Type::RenderPass,
return);
139 QSSGLayerRenderData *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
140 if (QSSG_GUARD(data))
141 data->requestUserRenderPassManager()->scheduleUserPass(userPassNode);
145
146
147QSSGRhiGraphicsPipelineState QSSGFrameData::getPipelineState()
const
149 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
150 QSSG_ASSERT(data,
return {});
151 return data->getPipelineState();
155
156
157QSSGCameraId QSSGFrameData::activeCamera()
const
159 QSSGCameraId ret { QSSGCameraId::Invalid };
160 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
161 QSSG_ASSERT(data,
return ret);
162 if (
auto *ac = data->activeCamera())
163 ret = QSSGRenderGraphObjectUtils::getCameraId(*ac);
168QSSGRenderContextInterface *QSSGFrameData::contextInterface()
const
174
175
176QSSGNodeIdList QSSGFrameData::getLayerNodes(quint32 layerMask, TypeMask typeMask)
const
178 QSSG_ASSERT(m_ctx,
return {});
180 auto *layer = getCurrent();
181 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return {});
182 const auto &layerNodes = layer->layerNodes;
184 return QSSGLayerRenderData::filter(layerNodes, layerMask, typeMask);;
188
189
190
191QSSGNodeIdList QSSGFrameData::getLayerNodes(QSSGCameraId cameraId, TypeMask typeMask)
const
193 auto *camera = QSSGRenderGraphObjectUtils::getNode<QSSGRenderCamera>(QSSGNodeId(cameraId));
194 const quint32 layerMask = camera ? camera->tag.value() : 0 ;
196 return (layerMask != 0) ? getLayerNodes(layerMask, typeMask) : QSSGNodeIdList{};
199void QSSGFrameData::clear()
204QSSGLayerRenderData *QSSGFrameData::getCurrent()
const
206 return QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
209QSSGFrameData::QSSGFrameData(QSSGRenderContextInterface *ctx)
216
217
218
219
220
221
222
223
226
227
228
229
230
231
232
233
234
235
236
237QSSGRenderExtension::QSSGRenderExtension(Type inType, FlagT inFlags)
238 : QSSGRenderGraphObject(
static_cast<Type>(TypeT(inType) | TypeT(QSSGRenderGraphObject::BaseType::Extension)), inFlags)
240 Q_ASSERT_X((QSSGRenderGraphObjectUtils::getBaseType(type) == QSSGRenderGraphObject::BaseType::Extension) ||
241 (QSSGRenderGraphObjectUtils::getBaseType(type) == (QSSGRenderGraphObject::BaseType::Extension | QSSGRenderGraphObject::BaseType::User)),
242 "QSSGRenderExtension()",
243 "The type must be a combination of QSSGRenderGraphObject::BaseType::Extension "
244 "and optionally QSSGRenderGraphObject::BaseType::User.");
247QSSGRenderExtension::QSSGRenderExtension()
248 : QSSGRenderGraphObject(QSSGRenderGraphObject::Type::RenderExtension, FlagT(Flags::HasGraphicsResources))
253QSSGRenderExtension::~QSSGRenderExtension()
259
260
261
262
263
264
265
266
267
268
269
270
271
274
275
276
277
278
279
280
281
282
286
287
288
289
290
291
292
293
294
295
296
297bool QSSGRenderExtension::prepareData(QSSGFrameData &data)
304
305
306
307
308
309
310
311
312
313void QSSGRenderExtension::prepareRender(QSSGFrameData &data)
319
320
321
322
323
324
325
326void QSSGRenderExtension::render(QSSGFrameData &data)
332
333
334
335void QSSGRenderExtension::resetForFrame()
341
342
343QSSGRenderExtension::RenderMode QSSGRenderExtension::mode()
const
345 return RenderMode::Main;
349
350
351QSSGRenderExtension::RenderStage QSSGRenderExtension::stage()
const
353 return RenderStage::PostColor;
357
358
359
360
361
362
363
364
365
366
367
369QSSGRenderTextureProviderExtension::QSSGRenderTextureProviderExtension()
370 : QSSGRenderExtension(QSSGRenderGraphObject::Type::TextureProvider, FlagT(Flags::HasGraphicsResources) | FlagT(QSSGRenderGraphObjectUtils::InternalFlags::AutoRegisterExtension))
375QSSGRenderTextureProviderExtension::~QSSGRenderTextureProviderExtension()
380QSSGRenderExtension::RenderStage QSSGRenderTextureProviderExtension::stage()
const {
return QSSGRenderExtension::RenderStage::PreColor; }
382QSSGRenderExtension::RenderMode QSSGRenderTextureProviderExtension::mode()
const {
return QSSGRenderExtension::RenderMode::Standalone; }
Combined button and popup list for selecting options.