use super::VkDevice; use ash::vk; use std::path::Path; use std::sync::Arc; pub struct VkShaderModule { device: Arc, pub(super) handle: vk::ShaderModule, } impl VkShaderModule { pub fn from_spv_file>(device: &Arc, path: P) -> anyhow::Result { let mut file = std::fs::File::open(&path)?; let frag_shader_str = ash::util::read_spv(&mut file)?; let shader_create_info = vk::ShaderModuleCreateInfo::default().code(&frag_shader_str); let shader_module = unsafe { device .handle .create_shader_module(&shader_create_info, None)? }; log::debug!( "Shader module created ({shader_module:?}) from {:?}", path.as_ref() ); Ok(Self { device: device.clone(), handle: shader_module, }) } } impl Drop for VkShaderModule { fn drop(&mut self) { unsafe { self.device.handle.destroy_shader_module(self.handle, None); log::debug!("Shader module destroyed ({:?})", self.handle); } } }