MCPcopy Create free account
hub / github.com/KhronosGroup/Vulkan-Samples / upload_image_to_gpu

Function upload_image_to_gpu

framework/gltf_loader.cpp:287–334  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

285}
286
287inline 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 &copy_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
336inline void prepare_meshlets(std::vector<Meshlet> &meshlets, std::unique_ptr<vkb::sg::SubMesh> &submesh, std::vector<unsigned char> &index_data)
337{

Callers 1

load_sceneMethod · 0.85

Calls 5

image_memory_barrierMethod · 0.80
sizeMethod · 0.80
copy_buffer_to_imageMethod · 0.80
clear_dataMethod · 0.45

Tested by

no test coverage detected