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

◆ dispatch_core_chained()

GpuChannelResult MayaFlux::Yantra::GpuDispatchCore::dispatch_core_chained ( const std::vector< std::vector< double > > &  channels,
const DataStructureInfo structure_info,
const ExecutionContext ctx 
)
protected

Multi-pass (chained) dispatch.

Calls dispatch_batched on GpuResourceManager and reads back once after all passes.

Parameters
channelsExtracted double channels.
structure_infoDimension/modality metadata.
ctxExecutionContext carrying pass_count and pc_updater.
Returns
GpuChannelResult containing primary float readback and aux buffers.

Definition at line 259 of file GpuDispatchCore.cpp.

263{
264 on_before_gpu_dispatch(channels, structure_info);
265 prepare_gpu_inputs(channels, structure_info);
266
267 for (size_t i = 0; i < m_bindings.size(); ++i) {
268 const auto et = m_bindings[i].element_type;
272 }
273
274 const size_t effective = m_staging_floats.empty()
277 const auto groups = calculate_dispatch_size(effective, structure_info);
278
279 if (!ctx.execution_metadata.contains("pass_count") || !ctx.execution_metadata.contains("pc_updater")) {
280 error<std::runtime_error>(Journal::Component::Yantra,
282 std::source_location::current(),
283 "GpuDispatchCore: dispatch_core_chained requires 'pass_count' and 'pc_updater' in execution_metadata");
284 }
285
286 const auto pass_count = safe_any_cast_or_throw<uint32_t>(ctx.execution_metadata.at("pass_count"));
287 const auto& pc_updater = safe_any_cast_or_throw<std::function<void(uint32_t, void*)>>(ctx.execution_metadata.at("pc_updater"));
288
290 pass_count, groups, m_bindings,
291 [&](uint32_t pass, std::vector<uint8_t>& pc_data) { pc_updater(pass, pc_data.data()); },
293 ctx.execution_metadata);
294
295 GpuChannelResult result;
296 result.primary = readback_primary(effective);
297 readback_aux(result);
298 return result;
299}
Range size
void readback_aux(GpuChannelResult &result)
Read back all OUTPUT bindings that have explicit size overrides into the aux map of a GpuChannelResul...
virtual std::array< uint32_t, 3 > calculate_dispatch_size(size_t total_elements, const DataStructureInfo &structure_info) const
Calculate workgroup dispatch counts from structure dimensions.
std::vector< GpuBufferBinding > m_bindings
virtual void prepare_gpu_inputs(const std::vector< std::vector< double > > &channels, const DataStructureInfo &structure_info)
Marshal channel data into GPU input buffers.
virtual void on_before_gpu_dispatch(const std::vector< std::vector< double > > &channels, const DataStructureInfo &structure_info)
Called immediately before dispatch.
std::vector< float > readback_primary(size_t float_count)
Read back the primary output buffer into a float vector.
void dispatch_batched(uint32_t pass_count, const std::array< uint32_t, 3 > &groups, const std::vector< GpuBufferBinding > &bindings, const std::function< void(uint32_t pass, std::vector< uint8_t > &)> &push_constant_updater, size_t push_constant_size, const std::unordered_map< std::string, std::any > &execution_metadata={})
void bind_descriptor(size_t index, const GpuBufferBinding &spec)
@ Runtime
General runtime operations (default fallback)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.

References MayaFlux::Yantra::GpuResourceManager::bind_descriptor(), calculate_dispatch_size(), MayaFlux::Yantra::GpuResourceManager::dispatch_batched(), MayaFlux::Yantra::ExecutionContext::execution_metadata, MayaFlux::Yantra::GpuBufferBinding::IMAGE_SAMPLED, MayaFlux::Yantra::GpuBufferBinding::IMAGE_STORAGE, largest_binding_data_element_count(), m_bindings, m_gpu_config, m_resources, m_staging_floats, on_before_gpu_dispatch(), prepare_gpu_inputs(), MayaFlux::Yantra::GpuChannelResult::primary, MayaFlux::Yantra::GpuShaderConfig::push_constant_size, readback_aux(), readback_primary(), MayaFlux::Journal::Runtime, and MayaFlux::Journal::Yantra.

+ Here is the call graph for this function: