MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NodeBindingsProcessor.cpp
Go to the documentation of this file.
3
5
6namespace MayaFlux::Buffers {
7
9 const std::string& name,
10 const std::shared_ptr<Nodes::Node>& node,
11 uint32_t offset,
12 size_t size)
13{
14 m_bindings[name] = NodeBinding { .node = node, .push_constant_offset = offset, .size = size };
15}
16
17void NodeBindingsProcessor::unbind_node(const std::string& name)
18{
19 m_bindings.erase(name);
20}
21
22bool NodeBindingsProcessor::has_binding(const std::string& name) const
23{
24 return m_bindings.contains(name);
25}
26
27std::vector<std::string> NodeBindingsProcessor::get_binding_names() const
28{
29 std::vector<std::string> names;
30 names.reserve(m_bindings.size());
31 for (const auto& [name, _] : m_bindings) {
32 names.push_back(name);
33 }
34 return names;
35}
36
37void NodeBindingsProcessor::execute_shader(const std::shared_ptr<VKBuffer>& buffer)
38{
40
41 auto& staging = buffer->get_pipeline_context().push_constant_staging;
42
43 for (const auto& [name, binding] : m_bindings) {
44 size_t end_offset = binding.push_constant_offset + binding.size;
45
46 if (staging.size() < end_offset) {
47 staging.resize(end_offset);
48 }
49
50 std::memcpy(
51 staging.data() + binding.push_constant_offset,
52 m_push_constant_data.data() + binding.push_constant_offset,
53 binding.size);
54
56 "NodeBindingsProcessor: Merged binding '{}' at offset {} ({} bytes)",
57 name, binding.push_constant_offset, binding.size);
58 }
59}
60
62{
63 if (m_bindings.empty()) {
65 "No node bindings configured for NodeBindingsProcessor");
66 return;
67 }
68
69 auto& pc_data = get_push_constant_data();
70
71 for (auto& [name, binding] : m_bindings) {
72 size_t required_size = binding.push_constant_offset + binding.size;
73 if (pc_data.size() < required_size) {
74 pc_data.resize(required_size);
75 }
76
77 if (!binding.node) {
79 "Node binding '{}' has null node", name);
80 continue;
81 }
82
83 double value = Buffers::extract_single_sample(binding.node);
84
85 if (binding.size == sizeof(float)) {
86 auto float_val = static_cast<float>(value);
87 std::memcpy(
88 pc_data.data() + binding.push_constant_offset,
89 &float_val,
90 sizeof(float));
91 } else if (binding.size == sizeof(double)) {
92 std::memcpy(
93 pc_data.data() + binding.push_constant_offset,
94 &value,
95 sizeof(double));
96 }
97 }
98}
99
100} // namespace MayaFlux::Buffers
#define MF_RT_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
bool has_binding(const std::string &name) const
Check if binding exists.
void execute_shader(const std::shared_ptr< VKBuffer > &buffer) override
void bind_node(const std::string &name, const std::shared_ptr< Nodes::Node > &node, uint32_t offset, size_t size=sizeof(float))
Bind node output to push constant offset.
std::unordered_map< std::string, NodeBinding > m_bindings
void unbind_node(const std::string &name)
Remove node 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.