Newer
Older
ForwardPlusRenderer / include / Texture.h
#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