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

◆ processing_function()

void MayaFlux::Buffers::GeometryBindingsProcessor::processing_function ( 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 binding.gpu_vertex_buffer->clear();
134
135 if (binding.node->get_vertex_layout()) {
136 binding.gpu_vertex_buffer->set_vertex_layout(
137 binding.node->get_vertex_layout().value());
138 }
139
141 "Geometry '{}' cleared", name);
142 continue;
143 }
144
145 size_t required_size = vertices.size_bytes();
146 size_t available_size = binding.gpu_vertex_buffer->get_size_bytes();
147
148 if (required_size > available_size) {
149 auto new_size = static_cast<size_t>(required_size * 1.5F);
150
152 "Geometry '{}' growing: resizing GPU buffer from {} → {} bytes",
153 name, available_size, new_size);
154
155 binding.gpu_vertex_buffer->resize(new_size, false);
156 available_size = new_size;
157
158 if (binding.staging_buffer) {
159 binding.staging_buffer->resize(new_size, false);
161 "Resized staging buffer for '{}' to {} bytes", name, new_size);
162 }
163 }
164
165 size_t upload_size = std::min<size_t>(required_size, available_size);
166
168 vertices.data(),
169 upload_size,
170 binding.gpu_vertex_buffer,
171 binding.staging_buffer);
172
173 if (binding.node->get_vertex_layout()) {
174 binding.gpu_vertex_buffer->set_vertex_layout(
175 binding.node->get_vertex_layout().value());
176
178 "Set vertex layout for '{}' ({} vertices, {} attributes)",
179 name,
180 binding.node->get_vertex_count(),
181 binding.node->get_vertex_layout()->attributes.size());
182 } else {
184 "Geometry node '{}' has no vertex layout. "
185 "RenderProcessor may fail without layout info.",
186 name);
187 }
188 binding.node->clear_gpu_update_flag();
189 }
190
191 bool attached_is_target = false;
192 for (const auto& [name, binding] : m_bindings) {
193 if (binding.gpu_vertex_buffer == vk_buffer) {
194 attached_is_target = true;
195 break;
196 }
197 }
198
199 if (!attached_is_target && !m_bindings.empty()) {
200 auto& first_binding = m_bindings.begin()->second;
201 if (first_binding.node->needs_gpu_update()) {
202 auto vertices = first_binding.node->get_vertex_data();
203
204 if (!vertices.empty()) {
205 size_t required_size = vertices.size_bytes();
206 size_t available_size = vk_buffer->get_size_bytes();
207
208 if (required_size > available_size) {
209 auto new_size = static_cast<size_t>(required_size * 1.5F);
210
212 "Fallback geometry growing: resizing GPU buffer from {} → {} bytes",
213 available_size, new_size);
214
215 vk_buffer->resize(new_size, false);
216 available_size = new_size;
217 }
218
219 size_t upload_size = std::min<size_t>(required_size, available_size);
220
221 std::shared_ptr<VKBuffer> staging = vk_buffer->is_host_visible() ? nullptr : first_binding.staging_buffer;
222
224 vertices.data(),
225 upload_size,
226 vk_buffer,
227 staging);
228
229 if (first_binding.node->get_vertex_layout()) {
230 vk_buffer->set_vertex_layout(
231 first_binding.node->get_vertex_layout().value());
232 }
233 }
234 first_binding.node->clear_gpu_update_flag();
235 }
236 }
237}
#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: