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

Method load_texture

framework/hpp_api_vulkan_sample.cpp:902–958  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

900}
901
902HPPTexture HPPApiVulkanSample::load_texture(const std::string &file, vkb::scene_graph::components::HPPImage::ContentType content_type, vk::SamplerAddressMode address_mode)
903{
904 HPPTexture texture;
905
906 texture.image = vkb::scene_graph::components::HPPImage::load(file, file, content_type);
907 texture.image->create_vk_image(get_device());
908
909 const auto &queue = get_device().get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0);
910
911 vk::CommandBuffer command_buffer = get_device().create_command_buffer(vk::CommandBufferLevel::ePrimary, true);
912
913 vkb::core::BufferCpp stage_buffer = vkb::core::BufferCpp::create_staging_buffer(get_device(), texture.image->get_data());
914
915 // Setup buffer copy regions for each mip level
916 std::vector<vk::BufferImageCopy> bufferCopyRegions;
917
918 auto &mipmaps = texture.image->get_mipmaps();
919
920 for (size_t i = 0; i < mipmaps.size(); i++)
921 {
922 vk::BufferImageCopy buffer_copy_region;
923 buffer_copy_region.imageSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
924 buffer_copy_region.imageSubresource.mipLevel = vkb::to_u32(i);
925 buffer_copy_region.imageSubresource.baseArrayLayer = 0;
926 buffer_copy_region.imageSubresource.layerCount = 1;
927 buffer_copy_region.imageExtent.width = texture.image->get_extent().width >> i;
928 buffer_copy_region.imageExtent.height = texture.image->get_extent().height >> i;
929 buffer_copy_region.imageExtent.depth = 1;
930 buffer_copy_region.bufferOffset = mipmaps[i].offset;
931
932 bufferCopyRegions.push_back(buffer_copy_region);
933 }
934
935 vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, 1};
936
937 // Image barrier for optimal image (target)
938 // Optimal image will be used as destination for the copy
939 vkb::common::image_layout_transition(
940 command_buffer, texture.image->get_vk_image().get_handle(), vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal, subresource_range);
941
942 // Copy mip levels from staging buffer
943 command_buffer.copyBufferToImage(
944 stage_buffer.get_handle(), texture.image->get_vk_image().get_handle(), vk::ImageLayout::eTransferDstOptimal, bufferCopyRegions);
945
946 // Change texture image layout to shader read after all mip levels have been copied
947 vkb::common::image_layout_transition(command_buffer,
948 texture.image->get_vk_image().get_handle(),
949 vk::ImageLayout::eTransferDstOptimal,
950 vk::ImageLayout::eShaderReadOnlyOptimal,
951 subresource_range);
952
953 get_device().flush_command_buffer(command_buffer, queue.get_handle());
954
955 texture.sampler = create_default_sampler(address_mode, mipmaps.size(), texture.image->get_format());
956
957 return texture;
958}
959

Callers

nothing calls this directly

Calls 9

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_handleMethod · 0.45
get_formatMethod · 0.45

Tested by

no test coverage detected