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

◆ processing_function()

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

BufferProcessor interface - uploads all bound geometries.

Parameters
bufferThe buffer this processor is attached to

Uploads all geometry nodes to their target vertex buffers. Uses staging buffers for device-local targets.

Implements MayaFlux::Buffers::BufferProcessor.

Definition at line 110 of file GeometryBindingsProcessor.cpp.

111{
112 if (m_bindings.empty()) {
113 return;
114 }
115
116 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
117 if (!vk_buffer) {
119 "GeometryBindingsProcessor requires VKBuffer, got different buffer type");
120 return;
121 }
122
123 for (auto& [name, binding] : m_bindings) {
124 if (!binding.node->needs_gpu_update()) {
126 "Geometry '{}' unchanged, skipping upload", name);
127 continue;
128 }
129
130 auto vertices = binding.node->get_vertex_data();
131
132 if (vertices.empty()) {
133 if (binding.gpu_vertex_buffer->is_host_visible()) {
134 binding.gpu_vertex_buffer->clear();
135 }
136
137 if (binding.node->get_vertex_layout()) {
138 binding.gpu_vertex_buffer->set_vertex_layout(
139 binding.node->get_vertex_layout().value());
140 }
141
143 "Geometry '{}' cleared", name);
144 continue;
145 }
146
147 size_t required_size = vertices.size_bytes();
148 size_t available_size = binding.gpu_vertex_buffer->get_size_bytes();
149
150 if (required_size > available_size) {
151 auto new_size = static_cast<size_t>(required_size * 1.5F);
152
154 "Geometry '{}' growing: resizing GPU buffer from {} → {} bytes",
155 name, available_size, new_size);
156
157 binding.gpu_vertex_buffer->resize(new_size, false);
158 available_size = new_size;
159
160 if (binding.staging_buffer) {
161 binding.staging_buffer->resize(new_size, false);
163 "Resized staging buffer for '{}' to {} bytes", name, new_size);
164 }
165 }
166
167 size_t upload_size = std::min<size_t>(required_size, available_size);
168
170 vertices.data(),
171 upload_size,
172 binding.gpu_vertex_buffer,
173 binding.staging_buffer);
174
175 if (binding.node->get_vertex_layout()) {
176 binding.gpu_vertex_buffer->set_vertex_layout(
177 binding.node->get_vertex_layout().value());
178
180 "Set vertex layout for '{}' ({} vertices, {} attributes)",
181 name,
182 binding.node->get_vertex_count(),
183 binding.node->get_vertex_layout()->attributes.size());
184 } else {
186 "Geometry node '{}' has no vertex layout. "
187 "RenderProcessor may fail without layout info.",
188 name);
189 }
190 binding.node->clear_gpu_update_flag();
191 }
192
193 bool attached_is_target = false;
194 for (const auto& [name, binding] : m_bindings) {
195 if (binding.gpu_vertex_buffer == vk_buffer) {
196 attached_is_target = true;
197 break;
198 }
199 }
200
201 if (!attached_is_target && !m_bindings.empty()) {
202 auto& first_binding = m_bindings.begin()->second;
203 if (first_binding.node->needs_gpu_update()) {
204 auto vertices = first_binding.node->get_vertex_data();
205
206 if (!vertices.empty()) {
207 size_t required_size = vertices.size_bytes();
208 size_t available_size = vk_buffer->get_size_bytes();
209
210 if (required_size > available_size) {
211 auto new_size = static_cast<size_t>(required_size * 1.5F);
212
214 "Fallback geometry growing: resizing GPU buffer from {} → {} bytes",
215 available_size, new_size);
216
217 vk_buffer->resize(new_size, false);
218 available_size = new_size;
219 }
220
221 size_t upload_size = std::min<size_t>(required_size, available_size);
222
223 std::shared_ptr<VKBuffer> staging = vk_buffer->is_host_visible() ? nullptr : first_binding.staging_buffer;
224
226 vertices.data(),
227 upload_size,
228 vk_buffer,
229 staging);
230
231 if (first_binding.node->get_vertex_layout()) {
232 vk_buffer->set_vertex_layout(
233 first_binding.node->get_vertex_layout().value());
234 }
235 }
236 first_binding.node->clear_gpu_update_flag();
237 }
238 }
239}
#define MF_INFO(comp, ctx,...)
#define MF_RT_WARN(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_TRACE(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
std::unordered_map< std::string, GeometryBinding > m_bindings
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.

References MayaFlux::Journal::BufferProcessing, MayaFlux::Journal::Buffers, m_bindings, MF_INFO, MF_RT_ERROR, MF_RT_TRACE, MF_RT_WARN, MF_TRACE, and MayaFlux::Buffers::upload_to_gpu().

+ Here is the call graph for this function: