MayaFlux 1.0.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 295 of file NetworkGeometryBuffer.cpp.

300{
301 if (name.empty()) {
303 "NetworkGeometryBuffer: state field declared with empty name, skipped");
304 return false;
305 }
306
307 if (element_count == 0 || stride_bytes == 0) {
309 "NetworkGeometryBuffer: state field '{}' declares zero element count "
310 "or stride, skipped",
311 name);
312 return false;
313 }
314
315 if (m_state_fields.contains(name)) {
317 "NetworkGeometryBuffer: duplicate state field '{}', later declaration "
318 "discarded",
319 name);
320 return false;
321 }
322
323 auto buffer_service = Registry::BackendRegistry::instance()
324 .get_service<Registry::Service::BufferService>();
325
326 if (!buffer_service || !buffer_service->allocate_raw_buffer) {
327 error<std::runtime_error>(
330 std::source_location::current(),
331 "NetworkGeometryBuffer requires a valid buffer service");
332 }
333
334 const auto usage_flags = static_cast<uint32_t>(
335 static_cast<VkBufferUsageFlags>(
336 vk::BufferUsageFlagBits::eStorageBuffer
337 | vk::BufferUsageFlagBits::eTransferSrc
338 | vk::BufferUsageFlagBits::eTransferDst));
339
340 const auto memory_flags = static_cast<uint32_t>(
341 static_cast<VkMemoryPropertyFlags>(vk::MemoryPropertyFlagBits::eDeviceLocal));
342
343 auto& resources = get_buffer_resources();
344 const size_t field_bytes = element_count * stride_bytes;
345 const uint32_t slot_count = double_buffered ? 2 : 1;
346
347 StateField field {
348 .element_count = element_count,
349 .stride_bytes = stride_bytes,
350 .slot_a = static_cast<uint32_t>(resources.back_buffers.size()),
351 .slot_b = 0,
352 .read_is_a = true,
353 };
354
355 for (uint32_t i = 0; i < slot_count; ++i) {
356 void* out_buffer = nullptr;
357 void* out_memory = nullptr;
358 void* out_mapped = nullptr;
359
360 buffer_service->allocate_raw_buffer(
361 field_bytes, usage_flags, memory_flags, false,
362 out_buffer, out_memory, out_mapped);
363
364 VKBufferResources::GenerationSlot slot;
365 slot.buffer = static_cast<vk::Buffer>(static_cast<VkBuffer>(out_buffer));
366 slot.memory = static_cast<vk::DeviceMemory>(static_cast<VkDeviceMemory>(out_memory));
367 slot.mapped_ptr = out_mapped;
368
369 resources.back_buffers.push_back(slot);
370 }
371
372 field.slot_b = double_buffered ? field.slot_a + 1 : field.slot_a;
373
374 m_state_fields.emplace(name, field);
375
377 "NetworkGeometryBuffer: state field '{}', {} elements, stride {}, {} slot(s), {} bytes",
378 name, element_count, stride_bytes, slot_count, field_bytes * slot_count);
379
380 return true;
381}
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::string name
Definition VKDevice.cpp:123
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:343
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: