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

◆ bind_geometry_node()

void MayaFlux::Buffers::GeometryBindingsProcessor::bind_geometry_node ( const std::string &  name,
const std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > &  node,
const std::shared_ptr< VKBuffer > &  vertex_buffer 
)

Bind a geometry node to a GPU vertex buffer.

Parameters
nameLogical name for this binding
nodeGeometryWriterNode to read vertices from
vertex_bufferGPU vertex buffer to upload to

If vertex_buffer is device-local, a staging buffer is automatically created. If vertex_buffer is host-visible, no staging is needed.

Definition at line 16 of file GeometryBindingsProcessor.cpp.

20{
21 if (!node) {
22 error<std::invalid_argument>(
25 std::source_location::current(),
26 "Cannot bind null geometry node '{}'", name);
27 }
28
29 if (!vertex_buffer) {
30 error<std::invalid_argument>(
33 std::source_location::current(),
34 "Cannot bind geometry node '{}' to null vertex buffer", name);
35 }
36
37 size_t vertex_data_size = node->get_vertex_buffer_size_bytes();
38
39 if (vertex_buffer->get_size_bytes() < vertex_data_size) {
41 "Vertex buffer for '{}' may be too small: {} bytes required, {} available. "
42 "Will upload partial data.",
43 name, vertex_data_size, vertex_buffer->get_size_bytes());
44 }
45
46 std::shared_ptr<VKBuffer> staging = nullptr;
47 if (!vertex_buffer->is_host_visible()) {
48 size_t staging_size = std::max<size_t>(vertex_buffer->get_size_bytes(), vertex_data_size);
49 staging = create_staging_buffer(staging_size);
50
52 "Created staging buffer for device-local geometry '{}' ({} bytes)",
53 name, staging_size);
54 } else {
56 "No staging needed for host-visible geometry '{}'", name);
57 }
58
59 std::shared_ptr<VKBuffer> index_buf = nullptr;
60 std::shared_ptr<VKBuffer> index_staging_buf = nullptr;
61
62 if (node->has_indices()) {
63 const size_t index_data_size = node->get_index_count() * sizeof(uint32_t);
64 index_buf = std::make_shared<VKBuffer>(
65 index_data_size,
68
69 ensure_initialized(index_buf);
70
71 index_staging_buf = create_staging_buffer(index_data_size);
73 "Created index staging buffer for device-local geometry '{}' ({} bytes)",
74 name, index_data_size);
75 }
76
77 m_bindings[name] = GeometryBinding {
78 .node = node,
79 .gpu_vertex_buffer = vertex_buffer,
80 .staging_buffer = staging,
81 .gpu_index_buffer = index_buf,
82 .index_staging_buffer = index_staging_buf
83 };
84
86 "Bound geometry node '{}' ({} vertices, {} bytes, stride: {}, indices: {})",
87 name, node->get_vertex_count(), vertex_data_size, node->get_vertex_stride(),
88 node->get_index_count());
89}
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::unordered_map< std::string, GeometryBinding > m_bindings
void ensure_initialized(const std::shared_ptr< VKBuffer > &buffer)
Definition VKBuffer.cpp:462
std::shared_ptr< VKBuffer > create_staging_buffer(size_t size)
Create staging buffer for transfers.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
@ UNKNOWN
Unknown or undefined modality.

References MayaFlux::Journal::BufferProcessing, MayaFlux::Journal::Buffers, MayaFlux::Buffers::create_staging_buffer(), MayaFlux::Buffers::VKBufferProcessor::ensure_initialized(), MayaFlux::Buffers::VKBuffer::INDEX, m_bindings, MF_DEBUG, MF_WARN, MayaFlux::Buffers::GeometryBindingsProcessor::GeometryBinding::node, and MayaFlux::Kakshya::UNKNOWN.

+ Here is the call graph for this function: