354{
357
358 const uint32_t workgroups_per_pass = groups[0] * groups[1] * groups[2];
359
360 const uint32_t default_passes = std::max(1U, 65536U / std::max(1U, workgroups_per_pass));
361 const uint32_t passes_per_batch = [&] {
362 auto it = execution_metadata.find("passes_per_batch");
363 if (it != execution_metadata.end())
364 return safe_any_cast_or_default<uint32_t>(it->second, default_passes);
365 return default_passes;
366 }();
367
368 for (uint32_t base = 0; base < pass_count; base += passes_per_batch) {
369 const uint32_t batch_end = std::min(base + passes_per_batch, pass_count);
370
371 auto cmd_id = foundry.begin_commands(
373
374 for (uint32_t pass = base; pass < batch_end; ++pass) {
375 std::vector<uint8_t> pc_data(push_constant_size);
376 push_constant_updater(pass, pc_data);
377
378 compute_press.bind_all(
380 pc_data.data(), push_constant_size);
381
382 compute_press.dispatch(cmd_id, groups[0], groups[1], groups[2]);
383
384 for (size_t i = 0; i < bindings.size(); ++i) {
386 foundry.buffer_barrier(
387 cmd_id,
388 m_impl->buffers[i].buffer,
389 vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eShaderRead,
390 vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eShaderRead,
391 vk::PipelineStageFlagBits::eComputeShader,
392 vk::PipelineStageFlagBits::eComputeShader);
393 }
394 }
395 }
396
397 for (size_t i = 0; i < bindings.size(); ++i) {
400 foundry.buffer_barrier(
401 cmd_id,
402 m_impl->buffers[i].buffer,
403 vk::AccessFlagBits::eShaderWrite,
404 vk::AccessFlagBits::eHostRead,
405 vk::PipelineStageFlagBits::eComputeShader,
406 vk::PipelineStageFlagBits::eHost);
407 }
408 }
409
410 foundry.submit_and_wait(cmd_id);
411 }
412}
Portal::Graphics::ComputePipelineID m_pipeline_id
std::vector< Portal::Graphics::DescriptorSetID > m_descriptor_set_ids
std::unique_ptr< GpuResourceManagerImpl > m_impl
MAYAFLUX_API ShaderFoundry & get_shader_foundry()
Get the global shader compiler instance.
MAYAFLUX_API ComputePress & get_compute_press()