#pragma once #include #include #include namespace iris { enum struct ImageType { Texture1D, Texture1DArray, Texture2D, Texture2DArray, Texture3D, TextureCube, TextureCubeArray, }; struct ImageDesc { ImageType image_type; VkImageUsageFlags image_usage; VkImageCreateFlags create_flags; VmaAllocationCreateFlags alloc_flags; VkFormat format; VkExtent3D extent; uint32_t mip_levels; uint32_t array_layers; }; struct ImageViewDesc { VkImageViewType view_type; VkFormat format; VkImageAspectFlags aspect_mask; uint32_t base_mip_level; uint32_t mip_levels; uint32_t base_array_layer; uint32_t array_layers; bool operator==(const ImageViewDesc& other) const = default; }; struct ImageViewDescHash { std::size_t operator()(const ImageViewDesc& desc) const noexcept { auto h = std::hash{}(desc.view_type); h ^= std::hash{}(desc.format) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc.aspect_mask) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc.base_mip_level) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc.mip_levels) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc.base_array_layer) + 0x9e3779b9 + (h << 6) + (h >> 2); h ^= std::hash{}(desc.array_layers) + 0x9e3779b9 + (h << 6) + (h >> 2); return h; } }; struct Image_tt { VkImage handle; ImageDesc desc; // Used during release VkDevice device; VmaAllocator allocator; VmaAllocation allocation; // store all the image views std::unordered_map image_views; VkImageView get_image_view(const ImageViewDesc &desc); void release(); }; } // namespace iris