| 285 | } |
| 286 | |
| 287 | inline void upload_image_to_gpu(vkb::core::CommandBufferC &command_buffer, vkb::core::BufferC &staging_buffer, sg::Image &image) |
| 288 | { |
| 289 | // Clean up the image data, as they are copied in the staging buffer |
| 290 | image.clear_data(); |
| 291 | |
| 292 | { |
| 293 | ImageMemoryBarrier memory_barrier{}; |
| 294 | memory_barrier.old_layout = VK_IMAGE_LAYOUT_UNDEFINED; |
| 295 | memory_barrier.new_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; |
| 296 | memory_barrier.src_access_mask = 0; |
| 297 | memory_barrier.dst_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT; |
| 298 | memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_HOST_BIT; |
| 299 | memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; |
| 300 | |
| 301 | command_buffer.image_memory_barrier(image.get_vk_image_view(), memory_barrier); |
| 302 | } |
| 303 | |
| 304 | // Create a buffer image copy for every mip level |
| 305 | auto &mipmaps = image.get_mipmaps(); |
| 306 | |
| 307 | std::vector<VkBufferImageCopy> buffer_copy_regions(mipmaps.size()); |
| 308 | |
| 309 | for (size_t i = 0; i < mipmaps.size(); ++i) |
| 310 | { |
| 311 | auto &mipmap = mipmaps[i]; |
| 312 | auto ©_region = buffer_copy_regions[i]; |
| 313 | |
| 314 | copy_region.bufferOffset = mipmap.offset; |
| 315 | copy_region.imageSubresource = image.get_vk_image_view().get_subresource_layers(); |
| 316 | // Update miplevel |
| 317 | copy_region.imageSubresource.mipLevel = mipmap.level; |
| 318 | copy_region.imageExtent = mipmap.extent; |
| 319 | } |
| 320 | |
| 321 | command_buffer.copy_buffer_to_image(staging_buffer, image.get_vk_image(), buffer_copy_regions); |
| 322 | |
| 323 | { |
| 324 | ImageMemoryBarrier memory_barrier{}; |
| 325 | memory_barrier.old_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; |
| 326 | memory_barrier.new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; |
| 327 | memory_barrier.src_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT; |
| 328 | memory_barrier.dst_access_mask = VK_ACCESS_SHADER_READ_BIT; |
| 329 | memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT; |
| 330 | memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; |
| 331 | |
| 332 | command_buffer.image_memory_barrier(image.get_vk_image_view(), memory_barrier); |
| 333 | } |
| 334 | } |
| 335 | |
| 336 | inline void prepare_meshlets(std::vector<Meshlet> &meshlets, std::unique_ptr<vkb::sg::SubMesh> &submesh, std::vector<unsigned char> &index_data) |
| 337 | { |
no test coverage detected