#pragma once #include <stdafx.h> #include "Device.h" #include <stb/stb_image.h> namespace fpr { struct LayoutTransitionRules { vk::ImageLayout old_layout; vk::ImageLayout new_layout; vk::ImageAspectFlags image_aspect; vk::AccessFlags src_access; vk::AccessFlags dst_access; vk::PipelineStageFlags src_stage; vk::PipelineStageFlags dst_stage; }; class Texture { static constexpr const LayoutTransitionRules PRE_MIP_LAYOUT = { vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal, vk::ImageAspectFlagBits::eColor, vk::AccessFlagBits::eNoneKHR, vk::AccessFlagBits::eTransferWrite, vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer }; vk::Format m_format; uint32_t m_width; uint32_t m_height; uint32_t m_mip_levels; int m_channels_used; vk::UniqueImage m_image; vk::UniqueDeviceMemory m_memory; vk::UniqueImageView m_image_view; vk::UniqueDescriptorSet m_descriptor_set; void GenerateMipMaps(); void CreateDescriptorSet(); std::pair<vk::DeviceSize, stbi_uc*> GetImageDetails( std::string_view file_name, int desired_channels = STBI_rgb_alpha); public: const vk::DescriptorSet& GetDescriptorSet() const; Texture( std::string_view file_name, int desired_channels = STBI_rgb_alpha, vk::Format format = vk::Format::eR8G8B8A8Srgb); Texture(const Texture& other) = delete; Texture(const Texture&& other) = delete; Texture operator=(const Texture& other) = delete; Texture operator=(const Texture&& other) = delete; }; void TransitionImageLayout(vk::Image image, const LayoutTransitionRules& rules, uint32_t mip_levels = 1); vk::UniqueImageView CreateImageView( fpr::Device* device, vk::Image image, vk::Format format, vk::ImageAspectFlags aspect_mask, vk::ImageViewType view_type, uint32_t mip_levels = 1); } // namespace fpr