10 const std::string& aggregate_name,
11 const std::shared_ptr<Nodes::Node>& node,
12 const std::shared_ptr<VKBuffer>& target)
16 "Attempted to add null node to aggregate '{}'", aggregate_name);
21 error<std::invalid_argument>(
24 std::source_location::current(),
25 "Cannot add node to aggregate '{}' with null target buffer", aggregate_name);
30 if (aggregate.nodes.empty()) {
31 aggregate.target_buffer = target;
32 }
else if (aggregate.target_buffer != target) {
34 "Aggregate '{}' already has a different target buffer. Ignoring new target.",
38 aggregate.nodes.push_back(node);
39 aggregate.staging_data.resize(aggregate.nodes.size());
41 size_t required_size = aggregate.nodes.size() *
sizeof(float);
42 if (aggregate.target_buffer->get_size_bytes() < required_size) {
44 "Target buffer for aggregate '{}' may be too small: {} nodes require {} bytes, buffer has {} bytes",
45 aggregate_name, aggregate.nodes.size(), required_size,
46 aggregate.target_buffer->get_size_bytes());
50 "Added node to aggregate '{}' (total: {})", aggregate_name, aggregate.nodes.size());
54 const std::string& aggregate_name,
55 const std::shared_ptr<Nodes::Node>& node)
60 "Attempted to remove node from non-existent aggregate '{}'", aggregate_name);
64 auto& nodes = agg_it->second.nodes;
65 auto node_it = std::ranges::find(nodes, node);
67 if (node_it != nodes.end()) {
69 agg_it->second.staging_data.resize(nodes.size());
72 "Removed node from aggregate '{}' (remaining: {})",
73 aggregate_name, nodes.size());
78 "Removed empty aggregate '{}'", aggregate_name);
82 "Attempted to remove node not in aggregate '{}'", aggregate_name);
90 "Attempted to clear non-existent aggregate '{}'", aggregate_name);
93 "Cleared aggregate '{}'", aggregate_name);
103 "Cleared all aggregates ({})", count);
109 return it !=
m_aggregates.end() ? it->second.nodes.size() : 0;
116 total += aggregate.nodes.size();
123 std::vector<std::string> names;
126 names.push_back(name);
142 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
145 "AggregateBindingsProcessor requires VKBuffer, got different buffer type");
149 for (
auto& [aggregate_name, aggregate] :
m_aggregates) {
150 if (aggregate.nodes.empty()) {
154 for (
size_t i = 0; i < aggregate.nodes.size(); i++) {
155 aggregate.staging_data[i] =
static_cast<float>(
156 aggregate.nodes[i]->get_last_output());
160 aggregate.staging_data.data(),
161 aggregate.staging_data.size() *
sizeof(
float),
162 aggregate.target_buffer);
165 bool attached_is_target =
false;
167 if (aggregate.target_buffer == vk_buffer) {
168 attached_is_target =
true;
176 if (!first_aggregate.nodes.empty()) {
178 first_aggregate.staging_data.data(),
179 first_aggregate.staging_data.size() *
sizeof(
float),
#define MF_RT_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
size_t get_node_count(const std::string &aggregate_name) const
Get number of nodes in an aggregate.
std::vector< std::string > get_aggregate_names() const
Get all aggregate names.
void clear_all_aggregates()
Clear all aggregates.
void processing_function(std::shared_ptr< Buffer > buffer) override
BufferProcessor interface - uploads all aggregates.
std::unordered_map< std::string, AggregateBinding > m_aggregates
void clear_aggregate(const std::string &aggregate_name)
Clear all nodes from an aggregate.
size_t get_total_node_count() const
Get total number of nodes across all aggregates.
size_t get_aggregate_count() const
Get number of aggregates.
void remove_node(const std::string &aggregate_name, const std::shared_ptr< Nodes::Node > &node)
Remove a node from an aggregate.
void add_node(const std::string &aggregate_name, const std::shared_ptr< Nodes::Node > &node, const std::shared_ptr< VKBuffer > &target)
Add a node to a named aggregate.
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.