142 QRhiSampler* m_sampler{};
147 QRhi& rhi,
const RenderState& state, QRhiTexture* inputRGBA,
int width,
148 int height,
const QString& colorConversion)
override
153 m_sampler = rhi.newSampler(
154 QRhiSampler::Linear, QRhiSampler::Linear, QRhiSampler::None,
155 QRhiSampler::ClampToEdge, QRhiSampler::ClampToEdge);
162 m_yTexture = rhi.newTexture(
163 QRhiTexture::R8, QSize{width, height}, 1,
164 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
165 m_yTexture->create();
167 m_yRT = rhi.newTextureRenderTarget({m_yTexture});
168 m_yRP = m_yRT->newCompatibleRenderPassDescriptor();
169 m_yRT->setRenderPassDescriptor(m_yRP);
172 m_ySRB = rhi.newShaderResourceBindings();
173 m_ySRB->setBindings({
174 QRhiShaderResourceBinding::sampledTexture(
175 3, QRhiShaderResourceBinding::FragmentStage, inputRGBA, m_sampler),
180 state, vertSrc, QString::fromLatin1(y_frag).arg(colorConversion));
181 m_yPipeline = rhi.newGraphicsPipeline();
182 m_yPipeline->setShaderStages({
183 {QRhiShaderStage::Vertex, vs},
184 {QRhiShaderStage::Fragment, fs},
186 m_yPipeline->setVertexInputLayout({});
187 m_yPipeline->setShaderResourceBindings(m_ySRB);
188 m_yPipeline->setRenderPassDescriptor(m_yRP);
189 m_yPipeline->create();
194#if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
195 m_uvTexture = rhi.newTexture(
196 QRhiTexture::RG8, QSize{width / 2, height / 2}, 1,
197 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
201 m_uvTexture = rhi.newTexture(
202 QRhiTexture::R8, QSize{width, height / 2}, 1,
203 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
205 m_uvTexture->create();
207 m_uvRT = rhi.newTextureRenderTarget({m_uvTexture});
208 m_uvRP = m_uvRT->newCompatibleRenderPassDescriptor();
209 m_uvRT->setRenderPassDescriptor(m_uvRP);
212 m_uvSRB = rhi.newShaderResourceBindings();
213 m_uvSRB->setBindings({
214 QRhiShaderResourceBinding::sampledTexture(
215 3, QRhiShaderResourceBinding::FragmentStage, inputRGBA, m_sampler),
219#if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
220 const char* uv_src = uv_frag;
222 const char* uv_src = uv_frag_packed;
225 =
makeShaders(state, vertSrc, QString::fromLatin1(uv_src).arg(colorConversion));
226 m_uvPipeline = rhi.newGraphicsPipeline();
227 m_uvPipeline->setShaderStages({
228 {QRhiShaderStage::Vertex, vs},
229 {QRhiShaderStage::Fragment, fs},
232 m_uvPipeline->setShaderResourceBindings(m_uvSRB);
233 m_uvPipeline->setRenderPassDescriptor(m_uvRP);
234 m_uvPipeline->create();
238 void exec(QRhi& rhi, QRhiCommandBuffer& cb)
override
241 cb.beginPass(m_yRT, Qt::black, {0.0f, 0});
242 cb.setGraphicsPipeline(m_yPipeline);
243 cb.setShaderResources(m_ySRB);
244 cb.setViewport(QRhiViewport(0, 0, m_width, m_height));
247 auto* yReadbackBatch = rhi.nextResourceUpdateBatch();
248 yReadbackBatch->readBackTexture(QRhiReadbackDescription{m_yTexture}, &m_yReadback);
249 cb.endPass(yReadbackBatch);
253 cb.beginPass(m_uvRT, Qt::black, {0.0f, 0});
254 cb.setGraphicsPipeline(m_uvPipeline);
255 cb.setShaderResources(m_uvSRB);
256#if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
257 cb.setViewport(QRhiViewport(0, 0, m_width / 2, m_height / 2));
259 cb.setViewport(QRhiViewport(0, 0, m_width, m_height / 2));