Bind a geometry node to a GPU vertex buffer.
If vertex_buffer is device-local, a staging buffer is automatically created. If vertex_buffer is host-visible, no staging is needed.
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);
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
70
73 "Created index staging buffer for device-local geometry '{}' ({} bytes)",
74 name, index_data_size);
75 }
76
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)
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.