15 input.push_back(
new Port{
this, {}, Types::Image, {}});
16 auto& ctx = score::GUIAppContext();
18 double settings_rate = settings.getRate();
19 if(settings_rate <= 0.)
21 m_conf = {.manualRenderingRate = 1000. / settings_rate};
26 void startRendering()
override { }
27 void render()
override
29 auto renderer = m_renderer.lock();
30 if(renderer && m_renderState)
34 auto rhi = m_renderState->rhi;
35 QRhiCommandBuffer* cb{};
36 if(rhi->beginOffscreenFrame(&cb) != QRhi::FrameOpSuccess)
40 rhi->endOffscreenFrame();
44 shared_readback->data.clear();
45 shared_readback->pixelSize = {};
49 void onRendererChange()
override { }
50 bool canRender()
const override {
return true; }
51 void stopRendering()
override { }
53 void setRenderer(std::shared_ptr<RenderList> r)
override { m_renderer = r; }
54 RenderList* renderer()
const override {
return m_renderer.lock().get(); }
58 m_onResize = conf.onResize;
60 QSize newSz = m_renderSize;
61 if(newSz.width() <= 0 || newSz.height() <= 0)
63 if(newSz.width() <= 0 || newSz.height() <= 0)
64 newSz = QSize{1024, 1024};
66 m_renderState = score::gfx::createRenderState(conf.graphicsApi, newSz,
nullptr);
67 m_renderState->outputSize = m_renderState->renderSize;
69 auto rhi = m_renderState->rhi;
70 m_texture = rhi->newTexture(
71 QRhiTexture::RGBA8, m_renderState->renderSize, 1,
72 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
75 m_depthBuffer = rhi->newRenderBuffer(
76 QRhiRenderBuffer::DepthStencil, m_renderState->renderSize, 1);
77 m_depthBuffer->create();
79 QRhiTextureRenderTargetDescription desc;
80 desc.setColorAttachments({QRhiColorAttachment(m_texture)});
82 desc.setDepthStencilBuffer(m_depthBuffer);
83 m_renderTarget = rhi->newTextureRenderTarget(desc);
84 m_renderState->renderPassDescriptor
85 = m_renderTarget->newCompatibleRenderPassDescriptor();
86 m_renderTarget->setRenderPassDescriptor(m_renderState->renderPassDescriptor);
87 m_renderTarget->create();
92 void destroyOutput()
override
96 delete m_renderTarget;
97 m_renderTarget =
nullptr;
100 m_depthBuffer =
nullptr;
105 delete m_renderState->renderPassDescriptor;
106 m_renderState->renderPassDescriptor =
nullptr;
108 m_renderState->destroy();
109 m_renderState.reset();
114 void setSize(QSize newSz)
122 void setRenderSize(QSize newSz)
124 if(m_renderSize != newSz)
126 m_renderSize = newSz;
133 QSize newSz = m_renderSize;
134 if(newSz.width() <= 0 || newSz.height() <= 0)
136 if(newSz.width() <= 0 || newSz.height() <= 0)
137 newSz = QSize{1024, 1024};
141 m_renderState->renderSize = newSz;
142 m_renderState->outputSize = newSz;
144 auto rhi = m_renderState->rhi;
146 m_renderTarget->destroy();
147 m_texture->destroy();
148 m_texture->setPixelSize(newSz);
152 m_depthBuffer->destroy();
154 m_depthBuffer = rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, newSz);
155 m_depthBuffer->setPixelSize(newSz);
156 m_depthBuffer->create();
158 delete m_renderTarget;
159 delete m_renderState->renderPassDescriptor;
161 QRhiTextureRenderTargetDescription desc;
162 desc.setColorAttachments({QRhiColorAttachment(m_texture)});
163 desc.setDepthStencilBuffer(m_depthBuffer);
164 m_renderTarget = rhi->newTextureRenderTarget(desc);
165 m_renderState->renderPassDescriptor
166 = m_renderTarget->newCompatibleRenderPassDescriptor();
167 m_renderTarget->setRenderPassDescriptor(m_renderState->renderPassDescriptor);
168 m_renderTarget->create();
175 std::shared_ptr<RenderState> renderState()
const override {
return m_renderState; }
180 .texture = m_texture,
181 .renderPass = m_renderState->renderPassDescriptor,
182 .renderTarget = m_renderTarget};
184 *
this, rt,
const_cast<QRhiReadbackResult&
>(*shared_readback)};
189 std::shared_ptr<QRhiReadbackResult> shared_readback;
192 Configuration m_conf;
194 std::weak_ptr<score::gfx::RenderList> m_renderer{};
195 QRhiTexture* m_texture{};
196 QRhiRenderBuffer* m_depthBuffer{};
197 QRhiTextureRenderTarget* m_renderTarget{};
198 std::shared_ptr<score::gfx::RenderState> m_renderState{};
200 std::function<void()> m_onResize;
201 QSize m_size{1024, 1024};
202 QSize m_renderSize{};
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:122