Skip to main content

ursus_core/vulkan/gfx_pipeline/
shader.rs

1use ash::vk;
2use std::path::Path;
3
4pub struct ShaderModule {
5    pub handle: vk::ShaderModule,
6    device: ash::Device,
7}
8
9impl ShaderModule {
10    pub fn from_file(device: &ash::Device, path: &Path) -> anyhow::Result<Self> {
11        let bytes =
12            std::fs::read(path).map_err(|e| anyhow::anyhow!("Не удалось прочитать шейдер {:?}: {}", path, e))?;
13        Self::from_bytes(device, &bytes)
14    }
15
16    pub fn from_bytes(device: &ash::Device, bytes: &[u8]) -> anyhow::Result<Self> {
17        let code = ash::util::read_spv(&mut std::io::Cursor::new(bytes))?;
18        let create_info = vk::ShaderModuleCreateInfo::default().code(&code);
19        let handle = unsafe { device.create_shader_module(&create_info, None)? };
20        Ok(Self { handle, device: device.clone() })
21    }
22}
23
24impl Drop for ShaderModule {
25    fn drop(&mut self) {
26        unsafe { self.device.destroy_shader_module(self.handle, None) };
27    }
28}