211{
214 "Cannot dispatch without pipeline and descriptors");
215 return;
216 }
217
220 "Descriptor sets not initialized");
221 return;
222 }
223
226
228
231
233
234 auto& descriptor_bindings = buffer->get_pipeline_context().descriptor_buffer_bindings;
235 if (!descriptor_bindings.empty()) {
236 for (const auto& binding : descriptor_bindings) {
239 "Descriptor set index {} out of range", binding.set);
240 continue;
241 }
242
243 foundry.update_descriptor_buffer(
245 binding.binding,
246 binding.type,
247 binding.buffer_info.buffer,
248 binding.buffer_info.offset,
249 binding.buffer_info.range);
250 }
251 }
252
255 }
256
258
261
262 for (uint32_t i = 0; i < iterations; ++i) {
264 continue;
265 }
266
267 const auto& pc_bindings = buffer->get_pipeline_context().push_constant_bindings;
268
269 if (!pc_bindings.empty()) {
270 size_t required = 0;
271 for (const auto& pc : pc_bindings) {
272 required = std::max(required, static_cast<size_t>(pc.offset) + pc.data.size());
273 }
274
276
277 for (const auto& pc : pc_bindings) {
279 }
280
281 compute_press.push_constants(
286 compute_press.push_constants(
290 }
291
292 compute_press.dispatch(cmd_id, dispatch_size[0], dispatch_size[1], dispatch_size[2]);
293
294 if (i + 1 < iterations) {
296 }
297 }
298
300
301 foundry.buffer_barrier(
302 cmd_id,
303 buffer->get_buffer(),
304 vk::AccessFlagBits::eShaderWrite,
305 vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferRead,
306 vk::PipelineStageFlagBits::eComputeShader,
307 vk::PipelineStageFlagBits::eComputeShader | vk::PipelineStageFlagBits::eTransfer);
308
310}
#define MF_ERROR(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
virtual void on_iteration_barrier(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint32_t index)
Called after each iteration except the last.
std::vector< uint8_t > m_push_constant_scratch
Coalesced push constant bindings, reused across iterations.
ShaderDispatchConfig m_dispatch_config
Portal::Graphics::ComputePipelineID m_pipeline_id
virtual bool on_iteration(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint32_t index)
Called before each iteration's push constants and dispatch.
virtual std::array< uint32_t, 3 > calculate_dispatch_size(const std::shared_ptr< VKBuffer > &buffer)
Calculate dispatch size from buffer.
Portal::Graphics::CommandBufferID m_last_command_buffer
std::vector< uint8_t > m_push_constant_data
virtual void on_after_execute(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Called after each process callback.
virtual bool on_before_execute(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Called before each process callback.
std::shared_ptr< VKBuffer > m_last_processed_buffer
void submit_recorded(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Submit a recorded command buffer honoring the submission mode.
std::vector< Portal::Graphics::DescriptorSetID > m_descriptor_set_ids
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
MAYAFLUX_API ShaderFoundry & get_shader_foundry()
Get the global shader compiler instance.
constexpr ComputePipelineID INVALID_COMPUTE_PIPELINE
MAYAFLUX_API ComputePress & get_compute_press()
uint32_t iteration_count
Dispatches recorded per execute cycle.