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
103QSSGFrameData::Result QSSGFrameData::getRenderResult(QSSGResourceId userPassId, AttachmentSelector attachment)
const
105 QSSGRenderUserPass *userPassNode = QSSGRenderGraphObjectUtils::getResource<QSSGRenderUserPass>(userPassId);
106 QSSG_ASSERT(userPassNode && userPassNode->type == QSSGRenderGraphObject::Type::RenderPass,
return Result{});
108 QSSGRhiRenderableTextureV2Ptr res;
109 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
110 if (QSSG_GUARD(data))
111 res = data->requestUserRenderPassManager()->getUserPassTexureResult(*userPassNode);
115 const quint32 attachmentSelector =
static_cast<quint32>(attachment);
117 if (res && res->isValid()) {
118 if (
const qsizetype attachmentCount = res->colorAttachmentCount(); attachmentCount > qsizetype(attachmentSelector)) {
120 result = { res->getColorTexture(attachmentSelector)->texture().get(), res->getDepthStencil().get() };
122 qWarning() <<
"Requested attachment" << attachmentSelector <<
"but user pass only has" << attachmentCount <<
"attachments.";
130
131
132void QSSGFrameData::scheduleRenderResults(QSSGResourceId userPassId)
const
134 QSSGRenderUserPass *userPassNode = QSSGRenderGraphObjectUtils::getResource<QSSGRenderUserPass>(userPassId);
135 QSSG_ASSERT(userPassNode && userPassNode->type == QSSGRenderGraphObject::Type::RenderPass,
return);
137 QSSGLayerRenderData *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
138 if (QSSG_GUARD(data))
139 data->requestUserRenderPassManager()->scheduleUserPass(userPassNode);
143
144
145QSSGRhiGraphicsPipelineState QSSGFrameData::getPipelineState()
const
147 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
148 QSSG_ASSERT(data,
return {});
149 return data->getPipelineState();
153
154
155QSSGCameraId QSSGFrameData::activeCamera()
const
157 QSSGCameraId ret { QSSGCameraId::Invalid };
158 auto *data = QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
159 QSSG_ASSERT(data,
return ret);
160 if (
auto *ac = data->activeCamera())
161 ret = QSSGRenderGraphObjectUtils::getCameraId(*ac);
166QSSGRenderContextInterface *QSSGFrameData::contextInterface()
const
172
173
174QSSGNodeIdList QSSGFrameData::getLayerNodes(quint32 layerMask, TypeMask typeMask)
const
176 QSSG_ASSERT(m_ctx,
return {});
178 auto *layer = getCurrent();
179 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return {});
180 const auto &layerNodes = layer->layerNodes;
182 return QSSGLayerRenderData::filter(layerNodes, layerMask, typeMask);;
186
187
188
189QSSGNodeIdList QSSGFrameData::getLayerNodes(QSSGCameraId cameraId, TypeMask typeMask)
const
191 auto *camera = QSSGRenderGraphObjectUtils::getNode<QSSGRenderCamera>(QSSGNodeId(cameraId));
192 const quint32 layerMask = camera ? camera->tag.value() : 0 ;
194 return (layerMask != 0) ? getLayerNodes(layerMask, typeMask) : QSSGNodeIdList{};
197void QSSGFrameData::clear()
202QSSGLayerRenderData *QSSGFrameData::getCurrent()
const
204 return QSSGLayerRenderData::getCurrent(*m_ctx->renderer());
207QSSGFrameData::QSSGFrameData(QSSGRenderContextInterface *ctx)
214
215
216
217
218
219
220
221
224
225
226
227
228
229
230
231
232
233
234
235QSSGRenderExtension::QSSGRenderExtension(Type inType, FlagT inFlags)
236 : QSSGRenderGraphObject(
static_cast<Type>(TypeT(inType) | TypeT(QSSGRenderGraphObject::BaseType::Extension)), inFlags)
238 Q_ASSERT_X((QSSGRenderGraphObjectUtils::getBaseType(type) == QSSGRenderGraphObject::BaseType::Extension) ||
239 (QSSGRenderGraphObjectUtils::getBaseType(type) == (QSSGRenderGraphObject::BaseType::Extension | QSSGRenderGraphObject::BaseType::User)),
240 "QSSGRenderExtension()",
241 "The type must be a combination of QSSGRenderGraphObject::BaseType::Extension "
242 "and optionally QSSGRenderGraphObject::BaseType::User.");
245QSSGRenderExtension::QSSGRenderExtension()
246 : QSSGRenderGraphObject(QSSGRenderGraphObject::Type::RenderExtension, FlagT(Flags::HasGraphicsResources))
251QSSGRenderExtension::~QSSGRenderExtension()
257
258
259
260
261
262
263
264
265
266
267
268
269
272
273
274
275
276
277
278
279
280
284
285
286
287
288
289
290
291
292
293
294
295bool QSSGRenderExtension::prepareData(QSSGFrameData &data)
302
303
304
305
306
307
308
309
310
311void QSSGRenderExtension::prepareRender(QSSGFrameData &data)
317
318
319
320
321
322
323
324void QSSGRenderExtension::render(QSSGFrameData &data)
330
331
332
333void QSSGRenderExtension::resetForFrame()
339
340
341QSSGRenderExtension::RenderMode QSSGRenderExtension::mode()
const
343 return RenderMode::Main;
347
348
349QSSGRenderExtension::RenderStage QSSGRenderExtension::stage()
const
351 return RenderStage::PostColor;
355
356
357
358
359
360
361
362
363
364
365
367QSSGRenderTextureProviderExtension::QSSGRenderTextureProviderExtension()
368 : QSSGRenderExtension(QSSGRenderGraphObject::Type::TextureProvider, FlagT(Flags::HasGraphicsResources) | FlagT(QSSGRenderGraphObjectUtils::InternalFlags::AutoRegisterExtension))
373QSSGRenderTextureProviderExtension::~QSSGRenderTextureProviderExtension()
378QSSGRenderExtension::RenderStage QSSGRenderTextureProviderExtension::stage()
const {
return QSSGRenderExtension::RenderStage::PreColor; }
380QSSGRenderExtension::RenderMode QSSGRenderTextureProviderExtension::mode()
const {
return QSSGRenderExtension::RenderMode::Standalone; }
Combined button and popup list for selecting options.