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.
24{
25 if (!node) {
26 error<std::invalid_argument>(
29 std::source_location::current(),
30 "Cannot bind null geometry node '{}'", name);
31 }
32
33 if (!vertex_buffer) {
34 error<std::invalid_argument>(
37 std::source_location::current(),
38 "Cannot bind geometry node '{}' to null vertex buffer", name);
39 }
40
41 size_t vertex_data_size = node->get_vertex_buffer_size_bytes();
42
43 if (vertex_buffer->get_size_bytes() < vertex_data_size) {
45 "Vertex buffer for '{}' may be too small: {} bytes required, {} available. "
46 "Will upload partial data.",
47 name, vertex_data_size, vertex_buffer->get_size_bytes());
48 }
49
50 std::shared_ptr<VKBuffer> staging = nullptr;
51 if (!vertex_buffer->is_host_visible()) {
52 size_t staging_size = std::max<size_t>(vertex_buffer->get_size_bytes(), vertex_data_size);
54
56 "Created staging buffer for device-local geometry '{}' ({} bytes)",
57 name, staging_size);
58 } else {
60 "No staging needed for host-visible geometry '{}'", name);
61 }
62
63 std::shared_ptr<VKBuffer> index_buf = nullptr;
64 std::shared_ptr<VKBuffer> index_staging_buf = nullptr;
65
66 if (node->has_indices()) {
67 const size_t index_data_size = node->get_index_count() * sizeof(uint32_t);
68 index_buf = std::make_shared<VKBuffer>(
69 index_data_size,
72
74
77 "Created index staging buffer for device-local geometry '{}' ({} bytes)",
78 name, index_data_size);
79 }
80
82 .node = node,
83 .gpu_vertex_buffer = vertex_buffer,
84 .staging_buffer = staging,
85 .gpu_index_buffer = index_buf,
86 .index_staging_buffer = index_staging_buf
87 };
88
90 "Bound geometry node '{}' ({} vertices, {} bytes, stride: {}, indices: {})",
91 name, node->get_vertex_count(), vertex_data_size, node->get_vertex_stride(),
92 node->get_index_count());
93}
#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.