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);
270 return reinterpret_cast<typename C::return_type
>(buf);
272 else if constexpr(
requires { C::sampler; })
274 auto buf = rhi.newSampler({}, {}, {}, {}, {});
276 return reinterpret_cast<typename C::return_type
>(buf);
279 requires { C::ubo; } ||
requires { C::storage; })
281 auto buf = rhi.newBuffer(buffer_type<C>(), usage<C>(), command.size);
285 score::gfx::replaceBuffer(srb, command.binding, buf);
287 return reinterpret_cast<typename C::return_type
>(buf);
289 else if constexpr(
requires { C::texture; })
292 auto tex = rhi.newTexture(
293 QRhiTexture::RGBA8, QSize{command.width, command.height}, samples(command));
296 score::gfx::replaceTexture(srb, command.binding, tex);
298 return reinterpret_cast<typename C::return_type
>(tex);
302 static_assert(C::unhandled);
306 else if constexpr(
requires { C::upload; })
308 if constexpr(
requires { C::texture; })
310 QRhiTextureSubresourceUploadDescription sub(command.data, command.size);
312 reinterpret_cast<QRhiTexture*
>(command.handle),
313 QRhiTextureUploadDescription{{0, 0, sub}});
317 auto buf =
reinterpret_cast<QRhiBuffer*
>(command.handle);
318 if constexpr(
requires { C::dynamic; })
319 res.updateDynamicBuffer(buf, command.offset, command.size, command.data);
321 requires { C::static_; } ||
requires { C::immutable; })
322 res.uploadStaticBuffer(buf, command.offset, command.size, command.data);
325 static_assert(C::unhandled);
330 else if constexpr(
requires { C::getter; })
332 if constexpr(
requires { C::ubo; })
334 auto buf = self.createdUbos.at(command.binding);
335 return reinterpret_cast<typename C::return_type
>(buf);
339 static_assert(C::unhandled);