MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ dispatch_batched()

void MayaFlux::Yantra::GpuResourceManager::dispatch_batched ( const std::string &  key,
const std::array< uint32_t, 3 > &  groups,
const std::vector< GpuBufferBinding > &  bindings,
size_t  push_constant_size,
const ExecutionContext ctx 
)

Definition at line 516 of file GpuResourceManager.cpp.

521{
522 const auto& params = safe_variant_get_or_throw<ChainedParams>(ctx.parameters,
523 "GpuResourceManager: dispatch_batched requires ChainedParams");
524
525 auto& unit = unit_for(key);
526 auto& foundry = Portal::Graphics::get_shader_foundry();
527 auto& compute_press = Portal::Graphics::get_compute_press();
528
529 const uint32_t workgroups_per_pass = groups[0] * groups[1] * groups[2];
530
531 const uint32_t default_passes = std::max(1U, 65536U / std::max(1U, workgroups_per_pass));
532
533 const uint32_t effective_passes_per_batch = params.passes_per_batch.value_or(default_passes);
534 for (uint32_t base = 0; base < params.pass_count; base += effective_passes_per_batch) {
535 const uint32_t batch_end = std::min(base + effective_passes_per_batch, params.pass_count);
536 auto cmd_id = foundry.begin_commands(
538
539 for (uint32_t pass = base; pass < batch_end; ++pass) {
540 std::vector<uint8_t> pc_data(push_constant_size);
541 params.pc_updater(pass, pc_data.data());
542 compute_press.bind_all(
543 cmd_id, unit.pipeline_id, unit.descriptor_set_ids,
544 pc_data.data(), push_constant_size);
545 compute_press.dispatch(cmd_id, groups[0], groups[1], groups[2]);
546
547 for (const auto& b : bindings) {
549 continue;
550
551 const bool is_image = b.element_type == GpuBufferBinding::ElementType::IMAGE_STORAGE
553 const bool is_shared = m_shared->slots.contains({ b.set, static_cast<size_t>(b.binding) });
554
555 if (is_image) {
556 if (static_cast<size_t>(b.binding) < unit.image_slots.size() && unit.image_slots[b.binding]) {
557 foundry.image_barrier(
558 cmd_id,
559 unit.image_slots[b.binding]->get_image(),
560 vk::ImageLayout::eGeneral,
561 vk::ImageLayout::eGeneral,
562 vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eShaderRead,
563 vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eShaderRead,
564 vk::PipelineStageFlagBits::eComputeShader,
565 vk::PipelineStageFlagBits::eComputeShader);
566 }
567 } else if (!is_shared && static_cast<size_t>(b.binding) < unit.impl->buffers.size()) {
568 foundry.buffer_barrier(
569 cmd_id,
570 unit.impl->buffers[b.binding].buffer,
571 vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eShaderRead,
572 vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eShaderRead,
573 vk::PipelineStageFlagBits::eComputeShader,
574 vk::PipelineStageFlagBits::eComputeShader);
575 }
576 }
577 }
578
579 for (const auto& b : bindings) {
582 const bool is_image = b.element_type == GpuBufferBinding::ElementType::IMAGE_STORAGE
584 const bool is_shared = m_shared->slots.contains({ b.set, static_cast<size_t>(b.binding) });
585 if (!is_image && !is_shared && static_cast<size_t>(b.binding) < unit.impl->buffers.size()) {
586 foundry.buffer_barrier(
587 cmd_id,
588 unit.impl->buffers[b.binding].buffer,
589 vk::AccessFlagBits::eShaderWrite,
590 vk::AccessFlagBits::eHostRead,
591 vk::PipelineStageFlagBits::eComputeShader,
592 vk::PipelineStageFlagBits::eHost);
593 }
594 }
595 }
596
597 foundry.submit_and_wait(cmd_id);
598 }
599}
size_t b
uint32_t pass
std::unique_ptr< SharedBuffers > m_shared
PipelineUnit & unit_for(const std::string &key)
MAYAFLUX_API ShaderFoundry & get_shader_foundry()
Get the global shader compiler instance.
MAYAFLUX_API ComputePress & get_compute_press()
bool is_image(const fs::path &filepath)
Definition Depot.cpp:108

References b, MayaFlux::Portal::Graphics::ShaderFoundry::COMPUTE, MayaFlux::Portal::Graphics::get_compute_press(), MayaFlux::Portal::Graphics::get_shader_foundry(), MayaFlux::Portal::Graphics::GpuBufferBinding::IMAGE_SAMPLED, MayaFlux::Portal::Graphics::GpuBufferBinding::IMAGE_STORAGE, MayaFlux::Portal::Graphics::GpuBufferBinding::INPUT_OUTPUT, MayaFlux::is_image(), m_shared, MayaFlux::Portal::Graphics::GpuBufferBinding::OUTPUT, MayaFlux::Yantra::ExecutionContext::parameters, pass, and unit_for().

Referenced by MayaFlux::Yantra::GpuDispatchCore::dispatch_core_chained().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: