18 : m_deviceMode{deviceMode}
20 input.push_back(
new Port{
this, {}, Types::Image, {}});
21 auto& ctx = score::GUIAppContext();
23 double settings_rate = settings.getRate();
24 if(settings_rate <= 0.)
26 m_conf = {.manualRenderingRate = 1000. / settings_rate};
31 void startRendering()
override { }
32 void render()
override
34 auto renderer = m_renderer.lock();
35 if(renderer && m_renderState)
39 auto rhi = m_renderState->rhi;
40 QRhiCommandBuffer* cb{};
41 if(rhi->beginOffscreenFrame(&cb) != QRhi::FrameOpSuccess)
45 rhi->endOffscreenFrame();
54 if(qEnvironmentVariableIsSet(
"SCORE_GFX_TRACE"))
56 stderr,
"GFX-BACKGROUND readback cleared: renderers=%zu\n",
58 shared_readback->data.clear();
59 shared_readback->pixelSize = {};
63 void onRendererChange()
override { }
64 bool canRender()
const override {
return true; }
65 void stopRendering()
override { }
67 void setRenderer(std::shared_ptr<RenderList> r)
override { m_renderer = r; }
68 RenderList* renderer()
const override {
return m_renderer.lock().get(); }
72 m_onResize = conf.onResize;
78 m_lastGraphicsApi = conf.graphicsApi;
80 QSize newSz = m_renderSize;
81 if(newSz.width() <= 0 || newSz.height() <= 0)
83 if(newSz.width() <= 0 || newSz.height() <= 0)
84 newSz = QSize{1024, 1024};
86 m_renderState = score::gfx::createRenderState(
87 conf.graphicsApi, newSz,
nullptr, m_deviceMode);
88 if(!m_renderState || !m_renderState->rhi)
90 qWarning() <<
"BackgroundNode: failed to create QRhi";
91 m_renderState.reset();
94 m_renderState->outputSize = m_renderState->renderSize;
95 m_renderState->renderFormat
96 = (m_swapchainFormat != Gfx::SwapchainFormat::SDR)
97 ? QRhiTexture::RGBA32F
100 auto rhi = m_renderState->rhi;
101 m_texture = rhi->newTexture(
102 m_renderState->renderFormat, m_renderState->renderSize, 1,
103 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
110 m_depthTexture = rhi->newTexture(
111 QRhiTexture::D32F, m_renderState->renderSize, 1,
112 QRhiTexture::RenderTarget);
113 m_depthTexture->setName(
"BackgroundNode::m_depthTexture");
114 m_depthTexture->create();
116 QRhiTextureRenderTargetDescription desc;
117 desc.setColorAttachments({QRhiColorAttachment(m_texture)});
119 desc.setDepthTexture(m_depthTexture);
120 m_renderTarget = rhi->newTextureRenderTarget(desc);
121 m_renderState->renderPassDescriptor
122 = m_renderTarget->newCompatibleRenderPassDescriptor();
123 m_renderTarget->setRenderPassDescriptor(m_renderState->renderPassDescriptor);
124 m_renderTarget->create();
129 void destroyOutput()
override
140 if(m_renderState->rhi)
142 SCORE_ASSERT(!m_renderState->rhi->isRecordingFrame());
143 m_renderState->rhi->finish();
151 delete m_renderTarget;
152 m_renderTarget =
nullptr;
154 delete m_depthTexture;
155 m_depthTexture =
nullptr;
160 delete m_renderState->renderPassDescriptor;
161 m_renderState->renderPassDescriptor =
nullptr;
163 m_renderState->destroy();
164 m_renderState.reset();
171 if(m_renderState->api != api)
175 void setSwapchainFormat(Gfx::SwapchainFormat format)
177 if(m_swapchainFormat == format)
179 m_swapchainFormat = format;
190 conf.graphicsApi = m_lastGraphicsApi;
191 conf.onResize = m_onResize;
197 createOutput(std::move(conf));
203 void setSize(QSize newSz)
211 void setRenderSize(QSize newSz)
213 if(m_renderSize != newSz)
215 m_renderSize = newSz;
222 QSize newSz = m_renderSize;
223 if(newSz.width() <= 0 || newSz.height() <= 0)
225 if(newSz.width() <= 0 || newSz.height() <= 0)
226 newSz = QSize{1024, 1024};
230 m_renderState->renderSize = newSz;
231 m_renderState->outputSize = newSz;
233 auto rhi = m_renderState->rhi;
243 m_renderTarget->destroy();
244 m_texture->destroy();
245 m_texture->setPixelSize(newSz);
249 m_depthTexture->destroy();
251 m_depthTexture = rhi->newTexture(
252 QRhiTexture::D32F, newSz, 1, QRhiTexture::RenderTarget);
253 m_depthTexture->setPixelSize(newSz);
254 m_depthTexture->create();
256 m_renderTarget->deleteLater();
257 if(
auto* rpd = m_renderState->renderPassDescriptor)
259 m_renderState->renderPassDescriptor =
nullptr;
260 m_renderTarget =
nullptr;
262 QRhiTextureRenderTargetDescription desc;
263 desc.setColorAttachments({QRhiColorAttachment(m_texture)});
264 desc.setDepthTexture(m_depthTexture);
265 m_renderTarget = rhi->newTextureRenderTarget(desc);
266 m_renderState->renderPassDescriptor
267 = m_renderTarget->newCompatibleRenderPassDescriptor();
268 m_renderTarget->setRenderPassDescriptor(m_renderState->renderPassDescriptor);
269 m_renderTarget->create();
276 std::shared_ptr<RenderState> renderState()
const override {
return m_renderState; }
283 .texture = m_texture,
284 .renderPass = m_renderState->renderPassDescriptor,
285 .renderTarget = m_renderTarget,
286 .depthTexture = m_depthTexture};
293 const_cast<QRhiReadbackResult&
>(*shared_readback)};
298 std::shared_ptr<QRhiReadbackResult> shared_readback;
301 Configuration m_conf;
304 std::weak_ptr<score::gfx::RenderList> m_renderer{};
305 QRhiTexture* m_texture{};
306 QRhiTexture* m_depthTexture{};
307 QRhiTextureRenderTarget* m_renderTarget{};
308 std::shared_ptr<score::gfx::RenderState> m_renderState{};
310 std::function<void()> m_onResize;
311 QSize m_size{1024, 1024};
312 QSize m_renderSize{};
313 Gfx::SwapchainFormat m_swapchainFormat{};
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:152