137{
139 return;
140 }
141
142 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
143 if (!vk_buffer) {
145 "AggregateBindingsProcessor requires VKBuffer, got different buffer type");
146 return;
147 }
148
149 for (
auto& [aggregate_name, aggregate] :
m_aggregates) {
150 if (aggregate.nodes.empty()) {
151 continue;
152 }
153
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());
157 }
158
160 aggregate.staging_data.data(),
161 aggregate.staging_data.size() * sizeof(float),
162 aggregate.target_buffer);
163 }
164
165 bool attached_is_target = false;
167 if (aggregate.target_buffer == vk_buffer) {
168 attached_is_target = true;
169 break;
170 }
171 }
172
175
176 if (!first_aggregate.nodes.empty()) {
178 first_aggregate.staging_data.data(),
179 first_aggregate.staging_data.size() * sizeof(float),
180 vk_buffer);
181 }
182 }
183}
#define MF_RT_ERROR(comp, ctx,...)
std::unordered_map< std::string, AggregateBinding > m_aggregates
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.