aluminium 0.1.0

vulkan-based graphics engine
use ash::vk;

use super::{Device, VulkanError, VulkanResult};

pub struct Sampler {
    #[allow(dead_code)]
    pub raw: vk::Sampler,
}

impl Sampler {
    #[allow(dead_code)]
    pub fn destroy(&self, device: &Device) {
        unsafe { device.destroy_sampler(self.raw, None) };
    }
}

#[allow(dead_code)]
pub struct SamplerBuilder<'a> {
    device: &'a Device,
    anisotropy_enable: bool,
    address_mode_u: vk::SamplerAddressMode,
    address_mode_v: vk::SamplerAddressMode,
    address_mode_w: vk::SamplerAddressMode,
    border_color: vk::BorderColor
}

impl<'a> SamplerBuilder<'a> {

    pub fn repeat(device: &'a Device) -> Self {
        Self {
            device,
            anisotropy_enable: false,
            address_mode_u: vk::SamplerAddressMode::REPEAT,
            address_mode_v: vk::SamplerAddressMode::REPEAT,
            address_mode_w: vk::SamplerAddressMode::REPEAT,
            border_color: vk::BorderColor::FLOAT_OPAQUE_WHITE
        }
    }

    pub fn build(self) -> VulkanResult<Sampler> {

        let create_info = vk::SamplerCreateInfo::default()
            .address_mode_u(self.address_mode_u)
            .address_mode_v(self.address_mode_v)
            .address_mode_w(self.address_mode_w)
            .anisotropy_enable(self.anisotropy_enable)
            .border_color(self.border_color);

        let sampler = unsafe {
            profiling::scope!("vkCreateSampler");
            self.device
                .create_sampler(&create_info, None)
                .map_err(VulkanError::Unknown)?
        };

        Ok(Sampler { raw: sampler })
    }
}