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

◆ update_descriptor_from_node()

void MayaFlux::Buffers::DescriptorBindingsProcessor::update_descriptor_from_node ( DescriptorBinding binding)
private

Update descriptor from node context.

Definition at line 494 of file DescriptorBindingsProcessor.cpp.

495{
496 switch (binding.source_type) {
497
498 case SourceType::NODE: {
499 if (!binding.node) {
501 "Binding has null node");
502 return;
503 }
504
505 float value {};
506
507 if (binding.processing_mode.load(std::memory_order_acquire) == ProcessingMode::INTERNAL) {
508 value = static_cast<float>(Buffers::extract_single_sample(binding.node));
509 } else {
510 value = static_cast<float>(binding.node->get_last_output());
511 }
512 Nodes::NodeContext& ctx = binding.node->get_last_context();
513
514 switch (binding.binding_type) {
515
516 case BindingType::SCALAR: {
517 ensure_buffer_capacity(binding, sizeof(float));
518 upload_to_gpu(&value, sizeof(float), binding.gpu_buffer, nullptr);
519 break;
520 }
521
522 case BindingType::VECTOR: {
523 auto* gpu_vec = dynamic_cast<Nodes::GpuVectorData*>(&ctx);
524 if (!gpu_vec || !gpu_vec->has_gpu_data()) {
526 "Node context does not provide GpuVectorData");
527 return;
528 }
529
530 auto data = gpu_vec->gpu_data();
531
532 ensure_buffer_capacity(binding, data.size_bytes());
533 upload_to_gpu(data.data(), data.size_bytes(), binding.gpu_buffer, nullptr);
534 break;
535 }
536
537 case BindingType::MATRIX: {
538 auto* gpu_mat = dynamic_cast<Nodes::GpuMatrixData*>(&ctx);
539 if (!gpu_mat || !gpu_mat->has_gpu_data()) {
541 "Node context does not provide GpuMatrixData");
542 return;
543 }
544
545 auto data = gpu_mat->gpu_data();
546 ensure_buffer_capacity(binding, data.size_bytes());
547 upload_to_gpu(data.data(), data.size_bytes(), binding.gpu_buffer, nullptr);
548 break;
549 }
550
552 auto* gpu_struct = dynamic_cast<Nodes::GpuStructuredData*>(&ctx);
553 if (!gpu_struct || !gpu_struct->has_gpu_data()) {
555 "Node context does not provide GpuStructuredData");
556 return;
557 }
558
559 auto data = gpu_struct->gpu_data();
560 ensure_buffer_capacity(binding, data.size_bytes());
561 upload_to_gpu(data.data(), data.size_bytes(), binding.gpu_buffer, nullptr);
562 break;
563 }
564 }
565 }
566
568 auto audio = std::dynamic_pointer_cast<AudioBuffer>(binding.buffer);
569 const auto& samples = audio->get_data();
570 size_t required = samples.size() * sizeof(float);
571 ensure_buffer_capacity(binding, required);
572
573 thread_local std::vector<float> conv;
574 conv.resize(samples.size());
575 std::ranges::transform(samples, conv.begin(),
576 [](double d) { return static_cast<float>(d); });
577
578 upload_to_gpu(conv.data(), required, binding.gpu_buffer, nullptr);
579 break;
580 }
581
583 auto vk = std::dynamic_pointer_cast<VKBuffer>(binding.buffer);
584 auto data = vk->get_data();
585 if (data.empty()) {
587 "Host VKBuffer binding '{}' returned no data", binding.descriptor_name);
588 return;
589 }
590 auto& raw = std::get<std::vector<uint8_t>>(data[0]);
591 ensure_buffer_capacity(binding, raw.size());
592 upload_to_gpu(raw.data(), raw.size(), binding.gpu_buffer, nullptr);
593 break;
594 }
595
597
598 auto data = binding.network->get_audio_buffer();
599 if (!data) {
601 "Network audio binding '{}' has no audio buffer", binding.descriptor_name);
602 return;
603 }
604 const auto& samples = *data;
605 size_t required = samples.size() * sizeof(float);
606
607 thread_local std::vector<float> conv;
608 conv.resize(samples.size());
609
610 std::ranges::transform(samples, conv.begin(),
611 [](double d) { return static_cast<float>(d); });
612
613 upload_to_gpu(conv.data(), required, binding.gpu_buffer, nullptr);
614 break;
615 }
616
618 auto gpu_data = extract_network_gpu_data(binding.network, binding.descriptor_name);
619 if (gpu_data.vertex_data.empty()) {
620 return;
621 }
622 ensure_buffer_capacity(binding, gpu_data.vertex_data.size_bytes());
624 gpu_data.vertex_data.data(),
625 gpu_data.vertex_data.size_bytes(),
626 binding.gpu_buffer,
627 nullptr);
628 break;
629 }
630 }
631}
#define MF_RT_WARN(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
void ensure_buffer_capacity(DescriptorBinding &binding, size_t required_size)
Ensure descriptor buffer has sufficient capacity.
@ INTERNAL
Processor calls extract_single_sample() or processes node context.
@ STRUCTURED
Array of structs from StructuredContext.
double extract_single_sample(const std::shared_ptr< Nodes::Node > &node)
Extract a single sample from a node with proper snapshot management.
NetworkGpuData extract_network_gpu_data(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, std::string_view name)
Extract GPU geometry data from a NodeNetwork via its GraphicsOperator.
void upload_to_gpu(const void *data, size_t size, const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging)
Upload raw data to GPU buffer (auto-detects host-visible vs device-local)
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.

References AUDIO_BUFFER, MayaFlux::Buffers::DescriptorBindingsProcessor::DescriptorBinding::binding_type, MayaFlux::Buffers::DescriptorBindingsProcessor::DescriptorBinding::buffer, MayaFlux::Journal::BufferProcessing, MayaFlux::Journal::Buffers, MayaFlux::Buffers::DescriptorBindingsProcessor::DescriptorBinding::descriptor_name, ensure_buffer_capacity(), MayaFlux::Buffers::extract_network_gpu_data(), MayaFlux::Buffers::extract_single_sample(), MayaFlux::Buffers::DescriptorBindingsProcessor::DescriptorBinding::gpu_buffer, HOST_VK_BUFFER, INTERNAL, MATRIX, MF_RT_ERROR, MF_RT_WARN, MayaFlux::Buffers::DescriptorBindingsProcessor::DescriptorBinding::network, NETWORK_AUDIO, NETWORK_GPU, NODE, MayaFlux::Buffers::DescriptorBindingsProcessor::DescriptorBinding::node, MayaFlux::Buffers::DescriptorBindingsProcessor::DescriptorBinding::processing_mode, SCALAR, MayaFlux::Buffers::DescriptorBindingsProcessor::DescriptorBinding::source_type, STRUCTURED, MayaFlux::Buffers::upload_to_gpu(), and VECTOR.

Referenced by execute_shader().

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