ursus_core/vulkan/gfx_pipeline/
shader.rs1use 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}