sarekt 0.0.4

A rendering engine based on Vulkan, but capable of being expanded to other graphics API backends such as Metal or D3D12
use crate::{
  error::{SarektError, SarektResult},
  image_data::ImageDataFormat,
  renderer::{
    config::NumSamples, vulkan::vulkan_shader_functions::VulkanShaderFunctions, ShaderHandle,
  },
};
use ash::vk;
use std::convert::TryFrom;

pub mod images;
pub mod queues;
pub mod vulkan_buffer_image_functions;
pub mod vulkan_renderer;
pub mod vulkan_shader_functions;
pub mod vulkan_vertex_bindings;

pub type VulkanShaderHandle = ShaderHandle<VulkanShaderFunctions>;

impl From<NumSamples> for vk::SampleCountFlags {
  fn from(num_samples: NumSamples) -> vk::SampleCountFlags {
    match num_samples {
      NumSamples::One => vk::SampleCountFlags::TYPE_1,
      NumSamples::Two => vk::SampleCountFlags::TYPE_2,
      NumSamples::Four => vk::SampleCountFlags::TYPE_4,
      NumSamples::Eight => vk::SampleCountFlags::TYPE_8,
    }
  }
}

impl From<ImageDataFormat> for vk::Format {
  fn from(image_data_format: ImageDataFormat) -> vk::Format {
    match image_data_format {
      ImageDataFormat::R8G8B8Srgb => vk::Format::R8G8B8_SRGB,
      ImageDataFormat::B8G8R8Srgb => vk::Format::B8G8R8_SRGB,
      ImageDataFormat::B8G8R8A8Srgb => vk::Format::B8G8R8A8_SRGB,
      ImageDataFormat::R8G8B8A8Srgb => vk::Format::R8G8B8A8_SRGB,

      ImageDataFormat::R8G8B8Unorm => vk::Format::R8G8B8_UNORM,
      ImageDataFormat::B8G8R8Unorm => vk::Format::B8G8R8_UNORM,
      ImageDataFormat::B8G8R8A8Unorm => vk::Format::B8G8R8A8_UNORM,
      ImageDataFormat::R8G8B8A8Unorm => vk::Format::R8G8B8A8_UNORM,

      ImageDataFormat::RGB16Unorm => vk::Format::R5G6B5_UNORM_PACK16,
      ImageDataFormat::RGBA16Unorm => vk::Format::R5G5B5A1_UNORM_PACK16,

      ImageDataFormat::D32Float => vk::Format::D32_SFLOAT,
      ImageDataFormat::D32FloatS8 => vk::Format::D32_SFLOAT_S8_UINT,
      ImageDataFormat::D24NormS8 => vk::Format::D24_UNORM_S8_UINT,
    }
  }
}

impl TryFrom<vk::Format> for ImageDataFormat {
  type Error = SarektError;

  fn try_from(format: vk::Format) -> SarektResult<ImageDataFormat> {
    match format {
      vk::Format::R8G8B8_SRGB => Ok(ImageDataFormat::R8G8B8Srgb),
      vk::Format::B8G8R8_SRGB => Ok(ImageDataFormat::B8G8R8Srgb),
      vk::Format::B8G8R8A8_SRGB => Ok(ImageDataFormat::B8G8R8A8Srgb),
      vk::Format::R8G8B8A8_SRGB => Ok(ImageDataFormat::R8G8B8A8Srgb),

      vk::Format::R8G8B8_UNORM => Ok(ImageDataFormat::R8G8B8Unorm),
      vk::Format::B8G8R8_UNORM => Ok(ImageDataFormat::B8G8R8Unorm),
      vk::Format::B8G8R8A8_UNORM => Ok(ImageDataFormat::B8G8R8A8Unorm),
      vk::Format::R8G8B8A8_UNORM => Ok(ImageDataFormat::R8G8B8A8Unorm),

      vk::Format::R5G6B5_UNORM_PACK16 => Ok(ImageDataFormat::RGB16Unorm),
      vk::Format::R5G5B5A1_UNORM_PACK16 => Ok(ImageDataFormat::RGBA16Unorm),

      vk::Format::D32_SFLOAT => Ok(ImageDataFormat::D32Float),
      vk::Format::D32_SFLOAT_S8_UINT => Ok(ImageDataFormat::D32FloatS8),
      vk::Format::D24_UNORM_S8_UINT => Ok(ImageDataFormat::D24NormS8),

      _ => Err(SarektError::UnsupportedImageFormat),
    }
  }
}