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

Method load_texture_array

framework/hpp_api_vulkan_sample.cpp:960–1022  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

958}
959
960HPPTexture HPPApiVulkanSample::load_texture_array(const std::string &file, vkb::scene_graph::components::HPPImage::ContentType content_type, vk::SamplerAddressMode address_mode)
961{
962 HPPTexture texture{};
963
964 texture.image = vkb::scene_graph::components::HPPImage::load(file, file, content_type);
965 texture.image->create_vk_image(get_device(), vk::ImageViewType::e2DArray);
966
967 const auto &queue = get_device().get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0);
968
969 vk::CommandBuffer command_buffer = get_device().create_command_buffer(vk::CommandBufferLevel::ePrimary, true);
970
971 vkb::core::BufferCpp stage_buffer = vkb::core::BufferCpp::create_staging_buffer(get_device(), texture.image->get_data());
972
973 // Setup buffer copy regions for each mip level
974 std::vector<vk::BufferImageCopy> buffer_copy_regions;
975
976 auto &mipmaps = texture.image->get_mipmaps();
977 const auto &layers = texture.image->get_layers();
978
979 auto &offsets = texture.image->get_offsets();
980
981 for (uint32_t layer = 0; layer < layers; layer++)
982 {
983 for (size_t i = 0; i < mipmaps.size(); i++)
984 {
985 vk::BufferImageCopy buffer_copy_region;
986 buffer_copy_region.imageSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
987 buffer_copy_region.imageSubresource.mipLevel = vkb::to_u32(i);
988 buffer_copy_region.imageSubresource.baseArrayLayer = layer;
989 buffer_copy_region.imageSubresource.layerCount = 1;
990 buffer_copy_region.imageExtent.width = texture.image->get_extent().width >> i;
991 buffer_copy_region.imageExtent.height = texture.image->get_extent().height >> i;
992 buffer_copy_region.imageExtent.depth = 1;
993 buffer_copy_region.bufferOffset = offsets[layer][i];
994
995 buffer_copy_regions.push_back(buffer_copy_region);
996 }
997 }
998
999 vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, layers};
1000
1001 // Image barrier for optimal image (target)
1002 // Optimal image will be used as destination for the copy
1003 vkb::common::image_layout_transition(
1004 command_buffer, texture.image->get_vk_image().get_handle(), vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal, subresource_range);
1005
1006 // Copy mip levels from staging buffer
1007 command_buffer.copyBufferToImage(
1008 stage_buffer.get_handle(), texture.image->get_vk_image().get_handle(), vk::ImageLayout::eTransferDstOptimal, buffer_copy_regions);
1009
1010 // Change texture image layout to shader read after all mip levels have been copied
1011 vkb::common::image_layout_transition(command_buffer,
1012 texture.image->get_vk_image().get_handle(),
1013 vk::ImageLayout::eTransferDstOptimal,
1014 vk::ImageLayout::eShaderReadOnlyOptimal,
1015 subresource_range);
1016
1017 get_device().flush_command_buffer(command_buffer, queue.get_handle());

Callers

nothing calls this directly

Calls 10

to_u32Function · 0.85
create_command_bufferMethod · 0.80
sizeMethod · 0.80
flush_command_bufferMethod · 0.80
image_layout_transitionFunction · 0.50
create_vk_imageMethod · 0.45
get_dataMethod · 0.45
get_layersMethod · 0.45
get_handleMethod · 0.45
get_formatMethod · 0.45

Tested by

no test coverage detected