MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ processing_function()

void MayaFlux::Buffers::NetworkGeometryProcessor::processing_function ( const std::shared_ptr< Buffer > &  buffer)
overridevirtual

BufferProcessor interface - aggregates and uploads network geometry.

Parameters
bufferThe buffer this processor is attached to

For each bound network:

  1. Extract vertices from all internal nodes
  2. Aggregate into single vertex array
  3. Upload to GPU vertex buffer

Implements MayaFlux::Buffers::BufferProcessor.

Definition at line 104 of file NetworkGeometryProcessor.cpp.

105{
106 if (m_bindings.empty())
107 return;
108
109 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
110 if (!vk_buffer) {
112 "NetworkGeometryProcessor requires VKBuffer");
113 return;
114 }
115
116 for (auto& [name, binding] : m_bindings) {
117 if (!binding.network || !binding.network->is_enabled()) {
119 "Network '{}' disabled, skipping upload", name);
120 continue;
121 }
122
123 const auto* chain = binding.network->get_operator_chain().get();
124 const bool has_chain = chain && !chain->empty();
125
126 if (!has_chain) {
127 auto gpu_data = extract_network_gpu_data(binding.network, name);
128 if (gpu_data.vertex_data.empty() || gpu_data.vertex_count == 0) {
129 if (vk_buffer->is_host_visible())
130 vk_buffer->clear();
131 continue;
132 }
133
134 size_t total = gpu_data.vertex_data.size();
135 if (total > vk_buffer->get_size_bytes()) {
136 vk_buffer->resize(static_cast<size_t>(static_cast<float>(total) * 1.5F), false);
137 }
138
139 upload_to_gpu(gpu_data.vertex_data.data(), total, vk_buffer, nullptr);
140
141 if (gpu_data.layout)
142 vk_buffer->set_vertex_layout(*gpu_data.layout);
143
145 "Uploaded {} vertices from network '{}' ({} bytes)",
146 gpu_data.vertex_count, name, total);
147 continue;
148 }
149
150 struct SliceData {
151 std::span<const uint8_t> bytes;
152 size_t vertex_count {};
153 std::optional<Kakshya::VertexLayout> layout;
154 };
155
156 std::vector<SliceData> slices;
157 slices.reserve(1 + chain->size());
158
159 auto primary = extract_network_gpu_data(binding.network, name);
160 slices.push_back({ .bytes = primary.vertex_data, .vertex_count = primary.vertex_count, .layout = primary.layout });
161
162 for (const auto& op : chain->operators()) {
163 auto* gfx = dynamic_cast<Nodes::Network::GraphicsOperator*>(op.get());
164 if (!gfx) {
165 slices.push_back({ .bytes = {}, .vertex_count = 0, .layout = std::nullopt });
166 continue;
167 }
168
169 if (!gfx->participates_in_rendering())
170 continue;
171
172 slices.push_back({ .bytes = gfx->get_vertex_data(), .vertex_count = gfx->get_vertex_count(), .layout = gfx->get_vertex_layout() });
173 }
174
175 size_t total_bytes = 0;
176 for (const auto& s : slices)
177 total_bytes += s.bytes.size();
178
179 if (total_bytes == 0) {
180 if (vk_buffer->is_host_visible())
181 vk_buffer->clear();
182 continue;
183 }
184
185 if (total_bytes > vk_buffer->get_size_bytes()) {
186 vk_buffer->resize(static_cast<size_t>(static_cast<float>(total_bytes) * 1.5F), false);
187 }
188
189 m_staging_aggregate.resize(total_bytes);
190 size_t byte_offset = 0;
191 for (const auto& s : slices) {
192 if (!s.bytes.empty())
193 std::memcpy(m_staging_aggregate.data() + byte_offset, s.bytes.data(), s.bytes.size());
194 byte_offset += s.bytes.size();
195 }
196
197 upload_to_gpu(m_staging_aggregate.data(), total_bytes, vk_buffer, nullptr);
198
199 if (slices.back().layout)
200 vk_buffer->set_vertex_layout(*slices.back().layout);
201
202 auto ngb = std::dynamic_pointer_cast<NetworkGeometryBuffer>(buffer);
203 if (ngb) {
204 byte_offset = 0;
205 for (size_t i = 0; i < slices.size(); ++i) {
206 const auto& s = slices[i];
207 const uint32_t stride = s.layout ? s.layout->stride_bytes
208 : (slices[0].layout ? slices[0].layout->stride_bytes : 0);
209 const uint32_t vert_offset = stride > 0
210 ? static_cast<uint32_t>(byte_offset / stride)
211 : 0;
212
213 ngb->update_chain_render_range(i, vert_offset,
214 static_cast<uint32_t>(s.vertex_count), s.layout);
215
216 byte_offset += s.bytes.size();
217 }
218 }
219
221 "Uploaded {} bytes ({} slices) from network '{}'",
222 total_bytes, slices.size(), name);
223 }
224}
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
std::unordered_map< std::string, NetworkBinding > m_bindings
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.
Tendency< A, C > chain(const Tendency< A, B > &first, const Tendency< B, C > &second)
Sequential composition: evaluate first, feed result into second.
Definition Tendency.hpp:82

References MayaFlux::Journal::BufferProcessing, MayaFlux::Journal::Buffers, MayaFlux::Buffers::extract_network_gpu_data(), m_bindings, m_staging_aggregate, MF_RT_ERROR, MF_RT_TRACE, and MayaFlux::Buffers::upload_to_gpu().

+ Here is the call graph for this function: