Update descriptor from node context.
495{
496 switch (binding.source_type) {
497
499 if (!binding.node) {
501 "Binding has null node");
502 return;
503 }
504
505 float value {};
506
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
518 upload_to_gpu(&value,
sizeof(
float), binding.gpu_buffer,
nullptr);
519 break;
520 }
521
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
533 upload_to_gpu(data.data(), data.size_bytes(), binding.gpu_buffer,
nullptr);
534 break;
535 }
536
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();
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();
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);
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]);
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
619 if (gpu_data.vertex_data.empty()) {
620 return;
621 }
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.
@ MATRIX
2D grid from MatrixContext
@ VECTOR
Array from VectorContext.
@ SCALAR
Single value from node output.
@ 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.