83{
85 return;
86
87 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
88 if (!vk_buffer) {
90 "CompositeGeometryProcessor requires VKBuffer");
91 return;
92 }
93
94 size_t total_bytes = 0;
96 total_bytes += col.node->get_vertex_buffer_size_bytes();
97 }
98
99 if (total_bytes == 0) {
100 if (vk_buffer->is_host_visible())
101 vk_buffer->clear();
102 return;
103 }
104
105 size_t available_size = vk_buffer->get_size_bytes();
106 if (total_bytes > available_size) {
107 auto new_size = static_cast<size_t>(static_cast<float>(total_bytes) * 1.5F);
108 vk_buffer->resize(new_size, false);
109 available_size = new_size;
110 }
111
113 size_t current_byte_offset = 0;
114
116 auto vertex_data = col.node->get_vertex_data();
117
118 if (vertex_data.empty()) {
119 col.vertex_offset = 0;
120 col.vertex_count = 0;
121 continue;
122 }
123
124 std::memcpy(
126 vertex_data.data(),
127 vertex_data.size_bytes());
128
129 size_t stride = col.node->get_vertex_stride();
130 if (stride == 0) {
132 "Collection '{}' has zero vertex stride", col.name);
133 continue;
134 }
135
136 col.vertex_offset = static_cast<uint32_t>(current_byte_offset / stride);
137 col.vertex_count = col.node->get_vertex_count();
138
139
140 if (auto layout = col.node->get_vertex_layout()) {
141 layout->vertex_count = col.vertex_count;
142 layout->stride_bytes = static_cast<uint32_t>(stride);
143 col.vertex_layout = std::move(layout);
144 }
145
147 "Collection '{}': {} vertices at offset {} (stride: {})",
148 col.name, col.vertex_count, col.vertex_offset, stride);
149
150 current_byte_offset += vertex_data.size_bytes();
151 }
152
153 auto composite_buffer = std::dynamic_pointer_cast<CompositeGeometryBuffer>(buffer);
154 if (composite_buffer) {
156 composite_buffer->update_collection_render_range(
157 col.name, col.vertex_offset, col.vertex_count);
158
159 if (col.vertex_layout) {
160 composite_buffer->update_collection_vertex_layout(
161 col.name, *col.vertex_layout);
162 }
163 }
164 }
165
168 std::min(total_bytes, available_size),
169 vk_buffer,
170 nullptr);
171}
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
std::vector< GeometryCollection > m_collections
std::vector< uint8_t > m_staging_aggregate
void upload_to_gpu(const void *data, size_t size, const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging)
Upload raw data to GPU buffer (auto-detects host-visible vs device-local)
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.