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

Method load_texture_array

framework/api_vulkan_sample.cpp:1132–1229  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1130}
1131
1132Texture ApiVulkanSample::load_texture_array(const std::string &file, vkb::sg::Image::ContentType content_type)
1133{
1134 Texture texture{};
1135
1136 texture.image = vkb::sg::Image::load(file, file, content_type);
1137 texture.image->create_vk_image(get_device(), VK_IMAGE_VIEW_TYPE_2D_ARRAY);
1138
1139 const auto &queue = get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0);
1140
1141 VkCommandBuffer command_buffer = get_device().create_command_buffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
1142
1143 vkb::core::BufferC stage_buffer = vkb::core::BufferC::create_staging_buffer(get_device(), texture.image->get_data());
1144
1145 // Setup buffer copy regions for each mip level
1146 std::vector<VkBufferImageCopy> buffer_copy_regions;
1147
1148 auto &mipmaps = texture.image->get_mipmaps();
1149 const auto &layers = texture.image->get_layers();
1150
1151 auto &offsets = texture.image->get_offsets();
1152
1153 for (uint32_t layer = 0; layer < layers; layer++)
1154 {
1155 for (size_t i = 0; i < mipmaps.size(); i++)
1156 {
1157 VkBufferImageCopy buffer_copy_region = {};
1158 buffer_copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1159 buffer_copy_region.imageSubresource.mipLevel = vkb::to_u32(i);
1160 buffer_copy_region.imageSubresource.baseArrayLayer = layer;
1161 buffer_copy_region.imageSubresource.layerCount = 1;
1162 buffer_copy_region.imageExtent.width = texture.image->get_extent().width >> i;
1163 buffer_copy_region.imageExtent.height = texture.image->get_extent().height >> i;
1164 buffer_copy_region.imageExtent.depth = 1;
1165 buffer_copy_region.bufferOffset = offsets[layer][i];
1166
1167 buffer_copy_regions.push_back(buffer_copy_region);
1168 }
1169 }
1170
1171 VkImageSubresourceRange subresource_range = {};
1172 subresource_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1173 subresource_range.baseMipLevel = 0;
1174 subresource_range.levelCount = vkb::to_u32(mipmaps.size());
1175 subresource_range.layerCount = layers;
1176
1177 // Image barrier for optimal image (target)
1178 // Optimal image will be used as destination for the copy
1179 vkb::image_layout_transition(command_buffer,
1180 texture.image->get_vk_image().get_handle(),
1181 VK_IMAGE_LAYOUT_UNDEFINED,
1182 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1183 subresource_range);
1184
1185 // Copy mip levels from staging buffer
1186 vkCmdCopyBufferToImage(
1187 command_buffer,
1188 stage_buffer.get_handle(),
1189 texture.image->get_vk_image().get_handle(),

Callers

nothing calls this directly

Calls 11

to_u32Function · 0.85
create_command_bufferMethod · 0.80
sizeMethod · 0.80
flush_command_bufferMethod · 0.80
image_layout_transitionFunction · 0.50
make_filters_validFunction · 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