132 QRhiCommandBuffer& cb;
133 QRhiResourceUpdateBatch*& res;
134 QRhiComputePipeline& pip;
135 template <
typename C>
136 Res operator()(C command)
138 if constexpr(
requires { C::compute; })
140 if constexpr(
requires { C::dispatch; })
142 cb.dispatch(command.x, command.y, command.z);
145 else if constexpr(
requires { C::begin; })
147 cb.beginComputePass(res);
149 cb.setComputePipeline(&pip);
150 cb.setShaderResources(pip.shaderResourceBindings());
154 else if constexpr(
requires { C::end; })
156 cb.endComputePass(res);
163 static_assert(C::unhandled);
167 else if constexpr(
requires { C::readback; })
170 if constexpr(
requires { C::request; })
172 if constexpr(
requires { C::buffer; })
174 using ret =
typename C::return_type;
176#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
177 auto readback =
new QRhiBufferReadbackResult;
179 auto readback =
new QRhiReadbackResult;
181 self.addReadback(readback);
184 ret user_rb{.handle =
reinterpret_cast<decltype(ret::handle)
>(readback)};
195 auto next = rhi.nextResourceUpdateBatch();
196 auto buf =
reinterpret_cast<QRhiBuffer*
>(command.handle);
198 next->readBackBuffer(buf, command.offset, command.size, readback);
203 else if constexpr(
requires { C::texture; })
205 using ret =
typename C::return_type;
206 QRhiReadbackResult readback;
211 static_assert(C::unhandled);
215 else if constexpr(
requires { C::await; })
217 if constexpr(
requires { C::buffer; })
219 using ret =
typename C::return_type;
221#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
222 auto readback =
reinterpret_cast<QRhiBufferReadbackResult*
>(command.handle);
224 auto readback =
reinterpret_cast<QRhiReadbackResult*
>(command.handle);
228 .data = readback->data.data(), .size = (std::size_t)readback->data.size()};
230 else if constexpr(
requires { C::texture; })
232 using ret =
typename C::return_type;
234 auto readback =
reinterpret_cast<QRhiReadbackResult*
>(command.handle);
237 .data = readback->data.data(), .size = (std::size_t)readback->data.size()};
243 static_assert(C::unhandled);
256 QRhiResourceUpdateBatch& res;
257 std::vector<QRhiShaderResourceBinding>& srb;
260 template <
typename C>
261 Ret operator()(C command)
263 if constexpr(
requires { C::allocation; })
266 requires { C::vertex; } ||
requires { C::index; })
268 auto buf = rhi.newBuffer(buffer_type<C>(), usage<C>(), command.size);
269 buf->setName(
"GppCoroutines::vbuf_or_ibuf");
271 return reinterpret_cast<typename C::return_type
>(buf);
273 else if constexpr(
requires { C::sampler; })
275 auto buf = rhi.newSampler({}, {}, {}, {}, {});
277 return reinterpret_cast<typename C::return_type
>(buf);
280 requires { C::ubo; } ||
requires { C::storage; })
282 auto buf = rhi.newBuffer(buffer_type<C>(), usage<C>(), command.size);
283 buf->setName(
"GppCoroutines::ubo_or_ssbo");
287 score::gfx::replaceBuffer(srb, command.binding, buf);
289 return reinterpret_cast<typename C::return_type
>(buf);
291 else if constexpr(
requires { C::texture; })
294 auto tex = rhi.newTexture(
295 QRhiTexture::RGBA8, QSize{command.width, command.height}, samples(command));
298 score::gfx::replaceTexture(srb, command.binding, tex);
300 return reinterpret_cast<typename C::return_type
>(tex);
304 static_assert(C::unhandled);
308 else if constexpr(
requires { C::upload; })
310 if constexpr(
requires { C::texture; })
312 QRhiTextureSubresourceUploadDescription sub(command.data, command.size);
314 reinterpret_cast<QRhiTexture*
>(command.handle),
315 QRhiTextureUploadDescription{{0, 0, sub}});
319 auto buf =
reinterpret_cast<QRhiBuffer*
>(command.handle);
320 if constexpr(
requires { C::dynamic; })
321 res.updateDynamicBuffer(buf, command.offset, command.size, command.data);
323 requires { C::static_; } ||
requires { C::immutable; })
324 res.uploadStaticBuffer(buf, command.offset, command.size, command.data);
327 static_assert(C::unhandled);
332 else if constexpr(
requires { C::getter; })
334 if constexpr(
requires { C::ubo; })
336 auto buf = self.createdUbos.at(command.binding);
337 return reinterpret_cast<typename C::return_type
>(buf);
341 static_assert(C::unhandled);