crystal-vk 0.1.1

Graphics wrapper for Vulkan
Documentation
use std::{error::Error, ffi::CString, sync::Arc};

use ash::vk;

use crate::device::Device;

pub struct Shader {
    pub(crate) handle: vk::ShaderModule,
    pub(crate) entry_point: CString,
    pub(crate) stage: vk::ShaderStageFlags,
    pub device: Arc<Device>,
}

unsafe impl Send for Shader {}
unsafe impl Sync for Shader {}

impl Drop for Shader {
    fn drop(&mut self) {
        unsafe { self.device.handle.destroy_shader_module(self.handle, None) }
    }
}

impl Shader {
    pub fn new(
        device: Arc<Device>,
        entry_point: CString,
        stage: vk::ShaderStageFlags,
        code: Vec<u32>,
    ) -> Result<Arc<Self>, Box<dyn Error>> {
        let shader_module_create_info = vk::ShaderModuleCreateInfo::default().code(&code);

        let module = unsafe {
            device
                .handle
                .create_shader_module(&shader_module_create_info, None)
        }?;

        Ok(Arc::new(Self {
            handle: module,
            entry_point,
            stage,
            device,
        }))
    }
}