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

◆ RelaxationGridBuffer()

MayaFlux::Buffers::RelaxationGridBuffer::RelaxationGridBuffer ( uint32_t  width,
uint32_t  height,
size_t  cell_stride_bytes,
ShaderSource  rule_source,
ShaderSource  emit_source 
)

Construct an unregistered double-buffered grid buffer.

Parameters
widthGrid width in cells.
heightGrid height in cells.
cell_stride_bytesSize in bytes of one cell's state.
rule_sourceEither a path to a hand-written rule shader (for rules needing branchy multi-state logic, e.g. Conway, Wireworld) or a generated ShaderSpec (e.g. RelaxationSpecs::jacobi_diffusion()).
emit_sourceEither a path to a hand-written emit shader, or a generated ShaderSpec (e.g. RelaxationSpecs::emit_binary()).

rule_source and emit_source are independent: a hand-written rule paired with a generated emit spec, or any other combination, is fully supported. Processors are constructed from whichever alternative each holds in setup_processors().

Definition at line 17 of file RelaxationGridBuffer.cpp.

23 : VKBuffer(
24 static_cast<size_t>(width) * height * sizeof(Kakshya::Vertex),
25 Usage::VERTEX,
27 , m_width(width)
29 , m_cell_stride_bytes(cell_stride_bytes)
30 , m_rule_source(std::move(rule_source))
31 , m_emit_source(std::move(emit_source))
32{
33 auto buffer_service = Registry::BackendRegistry::instance()
34 .get_service<Registry::Service::BufferService>();
35
36 if (!buffer_service) {
37 error<std::runtime_error>(
40 std::source_location::current(),
41 "RelaxationGridBuffer requires a valid BufferService");
42 }
43
44 const size_t state_bytes = get_state_bytes();
45 const auto usage_flags = static_cast<uint32_t>(
46 VkBufferUsageFlags(vk::BufferUsageFlagBits::eStorageBuffer));
47 const auto memory_flags = static_cast<uint32_t>(
48 VkMemoryPropertyFlags(vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent));
49
50 auto& resources = get_buffer_resources();
51 resources.back_buffers.resize(2);
52
53 for (uint32_t i = 0; i < 2; ++i) {
54 void* out_buffer = nullptr;
55 void* out_memory = nullptr;
56 void* out_mapped = nullptr;
57
58 buffer_service->allocate_raw_buffer(
59 state_bytes, usage_flags, memory_flags, true,
60 out_buffer, out_memory, out_mapped);
61
62 resources.back_buffers[i].buffer = static_cast<vk::Buffer>(static_cast<VkBuffer>(out_buffer));
63 resources.back_buffers[i].memory = static_cast<vk::DeviceMemory>(static_cast<VkDeviceMemory>(out_memory));
64 resources.back_buffers[i].mapped_ptr = out_mapped;
65 }
66
68 "RelaxationGridBuffer: {}x{} grid, {} bytes/cell, {} bytes/generation",
69 m_width, m_height, m_cell_stride_bytes, state_bytes);
70}
#define MF_INFO(comp, ctx,...)
uint32_t width
Definition Decoder.cpp:66
uint32_t height
ShaderSource m_emit_source
Either a path to a hand-written emit shader or a generated ShaderSpec.
size_t get_state_bytes() const
Total byte size of one generation's state buffer.
size_t m_cell_stride_bytes
Size in bytes of one cell's state, fixed at construction.
ShaderSource m_rule_source
Either a path to a hand-written rule shader or a generated ShaderSpec.
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.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.

References MayaFlux::Journal::BufferManagement, MayaFlux::Journal::Buffers, MayaFlux::Buffers::VKBuffer::get_buffer_resources(), MayaFlux::Registry::BackendRegistry::get_service(), get_state_bytes(), MayaFlux::Journal::Init, MayaFlux::Registry::BackendRegistry::instance(), m_cell_stride_bytes, m_height, m_width, and MF_INFO.

+ Here is the call graph for this function: