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

Method load_texture_cubemap

framework/hpp_api_vulkan_sample.cpp:1024–1086  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1022}
1023
1024HPPTexture HPPApiVulkanSample::load_texture_cubemap(const std::string &file, vkb::scene_graph::components::HPPImage::ContentType content_type)
1025{
1026 HPPTexture texture{};
1027
1028 texture.image = vkb::scene_graph::components::HPPImage::load(file, file, content_type);
1029 texture.image->create_vk_image(get_device(), vk::ImageViewType::eCube, vk::ImageCreateFlagBits::eCubeCompatible);
1030
1031 const auto &queue = get_device().get_queue_by_flags(vk::QueueFlagBits::eGraphics, 0);
1032
1033 vk::CommandBuffer command_buffer = get_device().create_command_buffer(vk::CommandBufferLevel::ePrimary, true);
1034
1035 vkb::core::BufferCpp stage_buffer = vkb::core::BufferCpp::create_staging_buffer(get_device(), texture.image->get_data());
1036
1037 // Setup buffer copy regions for each mip level
1038 std::vector<vk::BufferImageCopy> buffer_copy_regions;
1039
1040 auto &mipmaps = texture.image->get_mipmaps();
1041 const auto &layers = texture.image->get_layers();
1042
1043 auto &offsets = texture.image->get_offsets();
1044
1045 for (uint32_t layer = 0; layer < layers; layer++)
1046 {
1047 for (size_t i = 0; i < mipmaps.size(); i++)
1048 {
1049 vk::BufferImageCopy buffer_copy_region;
1050 buffer_copy_region.imageSubresource.aspectMask = vk::ImageAspectFlagBits::eColor;
1051 buffer_copy_region.imageSubresource.mipLevel = vkb::to_u32(i);
1052 buffer_copy_region.imageSubresource.baseArrayLayer = layer;
1053 buffer_copy_region.imageSubresource.layerCount = 1;
1054 buffer_copy_region.imageExtent.width = texture.image->get_extent().width >> i;
1055 buffer_copy_region.imageExtent.height = texture.image->get_extent().height >> i;
1056 buffer_copy_region.imageExtent.depth = 1;
1057 buffer_copy_region.bufferOffset = offsets[layer][i];
1058
1059 buffer_copy_regions.push_back(buffer_copy_region);
1060 }
1061 }
1062
1063 vk::ImageSubresourceRange subresource_range{vk::ImageAspectFlagBits::eColor, 0, vkb::to_u32(mipmaps.size()), 0, layers};
1064
1065 // Image barrier for optimal image (target)
1066 // Optimal image will be used as destination for the copy
1067 vkb::common::image_layout_transition(
1068 command_buffer, texture.image->get_vk_image().get_handle(), vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal, subresource_range);
1069
1070 // Copy mip levels from staging buffer
1071 command_buffer.copyBufferToImage(
1072 stage_buffer.get_handle(), texture.image->get_vk_image().get_handle(), vk::ImageLayout::eTransferDstOptimal, buffer_copy_regions);
1073
1074 // Change texture image layout to shader read after all mip levels have been copied
1075 vkb::common::image_layout_transition(command_buffer,
1076 texture.image->get_vk_image().get_handle(),
1077 vk::ImageLayout::eTransferDstOptimal,
1078 vk::ImageLayout::eShaderReadOnlyOptimal,
1079 subresource_range);
1080
1081 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