MCPcopy Create free account
hub / github.com/KhronosGroup/Vulkan-Tools / prepare_textures

Method prepare_textures

cube/cube.cpp:2858–2939  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2856}
2857
2858void Demo::prepare_textures() {
2859 vk::Format const tex_format = vk::Format::eR8G8B8A8Srgb;
2860 vk::FormatProperties props;
2861 gpu.getFormatProperties(tex_format, &props);
2862
2863 for (uint32_t i = 0; i < texture_count; i++) {
2864 if ((props.linearTilingFeatures & vk::FormatFeatureFlagBits::eSampledImage) && !use_staging_buffer) {
2865 /* Device can texture using linear textures */
2866 prepare_texture_image(tex_files[i], textures[i], vk::ImageTiling::eLinear, vk::ImageUsageFlagBits::eSampled,
2867 vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
2868 // Nothing in the pipeline needs to be complete to start, and don't allow fragment
2869 // shader to run until layout transition completes
2870 set_image_layout(textures[i].image, vk::ImageAspectFlagBits::eColor, vk::ImageLayout::ePreinitialized,
2871 textures[i].imageLayout, vk::AccessFlagBits(), vk::PipelineStageFlagBits::eTopOfPipe,
2872 vk::PipelineStageFlagBits::eFragmentShader);
2873 staging_texture.image = vk::Image();
2874 } else if (props.optimalTilingFeatures & vk::FormatFeatureFlagBits::eSampledImage) {
2875 /* Must use staging buffer to copy linear texture to optimized */
2876
2877 prepare_texture_buffer(tex_files[i], staging_texture);
2878
2879 prepare_texture_image(tex_files[i], textures[i], vk::ImageTiling::eOptimal,
2880 vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled,
2881 vk::MemoryPropertyFlagBits::eDeviceLocal);
2882
2883 set_image_layout(textures[i].image, vk::ImageAspectFlagBits::eColor, vk::ImageLayout::ePreinitialized,
2884 vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits(), vk::PipelineStageFlagBits::eTopOfPipe,
2885 vk::PipelineStageFlagBits::eTransfer);
2886
2887 auto const subresource = vk::ImageSubresourceLayers()
2888 .setAspectMask(vk::ImageAspectFlagBits::eColor)
2889 .setMipLevel(0)
2890 .setBaseArrayLayer(0)
2891 .setLayerCount(1);
2892
2893 auto const copy_region = vk::BufferImageCopy()
2894 .setBufferOffset(0)
2895 .setBufferRowLength(staging_texture.tex_width)
2896 .setBufferImageHeight(staging_texture.tex_height)
2897 .setImageSubresource(subresource)
2898 .setImageOffset({0, 0, 0})
2899 .setImageExtent({staging_texture.tex_width, staging_texture.tex_height, 1});
2900
2901 cmd.copyBufferToImage(staging_texture.buffer, textures[i].image, vk::ImageLayout::eTransferDstOptimal, 1, &copy_region);
2902
2903 set_image_layout(textures[i].image, vk::ImageAspectFlagBits::eColor, vk::ImageLayout::eTransferDstOptimal,
2904 textures[i].imageLayout, vk::AccessFlagBits::eTransferWrite, vk::PipelineStageFlagBits::eTransfer,
2905 vk::PipelineStageFlagBits::eFragmentShader);
2906 } else {
2907 assert(false && "No support for R8G8B8A8_SRGB as texture image format");
2908 }
2909
2910 auto const samplerInfo = vk::SamplerCreateInfo()
2911 .setMagFilter(vk::Filter::eNearest)
2912 .setMinFilter(vk::Filter::eNearest)
2913 .setMipmapMode(vk::SamplerMipmapMode::eNearest)
2914 .setAddressModeU(vk::SamplerAddressMode::eClampToEdge)
2915 .setAddressModeV(vk::SamplerAddressMode::eClampToEdge)

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected