| 2856 | } |
| 2857 | |
| 2858 | void 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, ©_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) |
nothing calls this directly
no outgoing calls
no test coverage detected