9 const std::string& name,
10 const std::shared_ptr<Nodes::Node>& node,
15 auto [it, inserted] =
m_bindings.try_emplace(name);
16 auto& binding = it->second;
19 binding.push_constant_offset =
offset;
21 binding.processing_mode.store(mode, std::memory_order_release);
36 std::vector<std::string> names;
39 names.push_back(name);
48 it->second.processing_mode.store(mode, std::memory_order_release);
55 binding.processing_mode.store(mode, std::memory_order_release);
63 return it->second.processing_mode.load(std::memory_order_acquire);
72 auto& entries = buffer->get_pipeline_context().push_constant_bindings;
74 for (
const auto& [name, binding] :
m_bindings) {
75 auto it = std::ranges::find_if(entries, [&](
const auto& e) {
76 return e.offset == binding.push_constant_offset;
79 if (it == entries.end()) {
81 .
offset = binding.push_constant_offset,
82 .data = std::vector<uint8_t>(binding.size),
84 it = std::prev(entries.end());
88 it->data.assign(begin, begin + binding.size);
91 "NodeBindingsProcessor: Merged binding '{}' at offset {} ({} bytes)",
92 name, binding.push_constant_offset, binding.size);
100 "No node bindings configured for NodeBindingsProcessor");
107 size_t required_size = binding.push_constant_offset + binding.size;
108 if (pc_data.size() < required_size) {
109 pc_data.resize(required_size);
114 "Node binding '{}' has null node", name);
119 ProcessingMode mode = binding.processing_mode.load(std::memory_order_acquire);
124 value = binding.node->get_last_output();
127 if (binding.size ==
sizeof(
float)) {
128 auto float_val =
static_cast<float>(
value);
130 pc_data.data() + binding.push_constant_offset,
133 }
else if (binding.size ==
sizeof(
double)) {
135 pc_data.data() + binding.push_constant_offset,
#define MF_RT_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
void bind_node(const std::string &name, const std::shared_ptr< Nodes::Node > &node, uint32_t offset, size_t size=sizeof(float), ProcessingMode mode=ProcessingMode::INTERNAL)
Bind node output to push constant offset.
bool has_binding(const std::string &name) const
Check if binding exists.
ProcessingMode get_processing_mode(const std::string &name) const
Get processing mode for a specific binding.
void execute_shader(const std::shared_ptr< VKBuffer > &buffer) override
@ INTERNAL
Processor calls extract_single_sample() - owns the processing.
void update_push_constants_from_nodes()
std::unordered_map< std::string, NodeBinding > m_bindings
void unbind_node(const std::string &name)
Remove node binding.
void set_processing_mode(const std::string &name, ProcessingMode mode)
Set processing mode for a specific binding.
std::vector< std::string > get_binding_names() const
Get all binding names.
const std::vector< uint8_t > & get_push_constant_data() const
Get current push constant data.
std::vector< uint8_t > m_push_constant_data
double extract_single_sample(const std::shared_ptr< Nodes::Node > &node)
Extract a single sample from a node with proper snapshot management.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
Self-describing push constant fragment staged on a VKBuffer.