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

◆ declare_state()

bool MayaFlux::Buffers::NetworkGeometryBuffer::declare_state ( const std::string &  name,
size_t  element_count,
size_t  stride_bytes,
bool  double_buffered = true 
)

Declare a named auxiliary state field alongside the vertex data.

Parameters
nameLookup key, unique within this buffer.
element_countNumber of elements the field holds. Fixed at declaration: it does not track later growth of the vertex buffer itself, since NetworkGeometryProcessor's resize path (1.5x headroom on overflow) has no knowledge of declared state fields. Declare at the network's expected particle count.
stride_bytesBytes per element.
double_bufferedFalse resolves read and write to one slot, which suits a value recomputed from other state each cycle.
Returns
True if the field was registered.

Mirrors VolumeGridBuffer::allocate_field: storage lives as raw handle pairs in the base VKBuffer's back_buffers, addressed by name rather than wrapped in a VKBuffer of its own. A processor resolves the handle it needs through read_state_handle/write_state_handle and writes its own descriptor directly against ShaderFoundry, the way VolumeFieldProcessor does for volume fields, rather than going through bind_buffer or the buffer's shared pipeline_context.

Definition at line 255 of file NetworkGeometryBuffer.cpp.

260{
261 if (name.empty()) {
263 "NetworkGeometryBuffer: state field declared with empty name, skipped");
264 return false;
265 }
266
267 if (element_count == 0 || stride_bytes == 0) {
269 "NetworkGeometryBuffer: state field '{}' declares zero element count "
270 "or stride, skipped",
271 name);
272 return false;
273 }
274
275 if (m_state_fields.contains(name)) {
277 "NetworkGeometryBuffer: duplicate state field '{}', later declaration "
278 "discarded",
279 name);
280 return false;
281 }
282
283 auto buffer_service = Registry::BackendRegistry::instance()
284 .get_service<Registry::Service::BufferService>();
285
286 if (!buffer_service || !buffer_service->allocate_raw_buffer) {
287 error<std::runtime_error>(
290 std::source_location::current(),
291 "NetworkGeometryBuffer requires a valid buffer service");
292 }
293
294 const auto usage_flags = static_cast<uint32_t>(
295 static_cast<VkBufferUsageFlags>(
296 vk::BufferUsageFlagBits::eStorageBuffer
297 | vk::BufferUsageFlagBits::eTransferSrc
298 | vk::BufferUsageFlagBits::eTransferDst));
299
300 const auto memory_flags = static_cast<uint32_t>(
301 static_cast<VkMemoryPropertyFlags>(vk::MemoryPropertyFlagBits::eDeviceLocal));
302
303 auto& resources = get_buffer_resources();
304 const size_t field_bytes = element_count * stride_bytes;
305 const uint32_t slot_count = double_buffered ? 2 : 1;
306
307 StateField field {
308 .element_count = element_count,
309 .stride_bytes = stride_bytes,
310 .slot_a = static_cast<uint32_t>(resources.back_buffers.size()),
311 .slot_b = 0,
312 .read_is_a = true,
313 };
314
315 for (uint32_t i = 0; i < slot_count; ++i) {
316 void* out_buffer = nullptr;
317 void* out_memory = nullptr;
318 void* out_mapped = nullptr;
319
320 buffer_service->allocate_raw_buffer(
321 field_bytes, usage_flags, memory_flags, false,
322 out_buffer, out_memory, out_mapped);
323
324 VKBufferResources::GenerationSlot slot;
325 slot.buffer = static_cast<vk::Buffer>(static_cast<VkBuffer>(out_buffer));
326 slot.memory = static_cast<vk::DeviceMemory>(static_cast<VkDeviceMemory>(out_memory));
327 slot.mapped_ptr = out_mapped;
328
329 resources.back_buffers.push_back(slot);
330 }
331
332 field.slot_b = double_buffered ? field.slot_a + 1 : field.slot_a;
333
334 m_state_fields.emplace(name, field);
335
337 "NetworkGeometryBuffer: state field '{}', {} elements, stride {}, {} slot(s), {} bytes",
338 name, element_count, stride_bytes, slot_count, field_bytes * slot_count);
339
340 return true;
341}
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::string name
Definition VKDevice.cpp:143
std::unordered_map< std::string, StateField > m_state_fields
const VKBufferResources & get_buffer_resources() const
Get all buffer resources at once (read-only)
Definition VKBuffer.hpp:341
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.

References MayaFlux::Buffers::VKBufferResources::GenerationSlot::buffer, MayaFlux::Journal::Buffers, MayaFlux::Buffers::NetworkGeometryBuffer::StateField::element_count, MayaFlux::Buffers::VKBuffer::get_buffer_resources(), MayaFlux::Registry::BackendRegistry::get_service(), MayaFlux::Journal::Init, MayaFlux::Registry::BackendRegistry::instance(), m_state_fields, MayaFlux::Buffers::VKBufferResources::GenerationSlot::mapped_ptr, MayaFlux::Buffers::VKBufferResources::GenerationSlot::memory, MF_DEBUG, MF_ERROR, and name.

Referenced by ensure_cluster_ids().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: