87 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
90 "CompositeGeometryProcessor requires VKBuffer");
94 size_t total_bytes = 0;
96 total_bytes += col.node->get_vertex_buffer_size_bytes();
99 if (total_bytes == 0) {
100 if (vk_buffer->is_host_visible())
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;
113 size_t current_byte_offset = 0;
116 auto vertex_data = col.node->get_vertex_data();
118 if (vertex_data.empty()) {
119 col.vertex_offset = 0;
120 col.vertex_count = 0;
127 vertex_data.size_bytes());
129 size_t stride = col.node->get_vertex_stride();
132 "Collection '{}' has zero vertex stride", col.name);
136 col.vertex_offset =
static_cast<uint32_t
>(current_byte_offset / stride);
137 col.vertex_count = col.node->get_vertex_count();
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);
147 "Collection '{}': {} vertices at offset {} (stride: {})",
148 col.name, col.vertex_count, col.vertex_offset, stride);
150 current_byte_offset += vertex_data.size_bytes();
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);
159 if (col.vertex_layout) {
160 composite_buffer->update_collection_vertex_layout(
161 col.name, *col.vertex_layout);
168 std::min(total_bytes, available_size),
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)