1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use crate::RafxResult; use crate::vulkan::RafxDeviceContextVulkan; use ash::version::DeviceV1_0; use ash::vk; use std::sync::Arc; #[derive(Debug)] pub struct RafxShaderModuleVulkanInner { device_context: RafxDeviceContextVulkan, shader_module: vk::ShaderModule, } impl Drop for RafxShaderModuleVulkanInner { fn drop(&mut self) { unsafe { self.device_context .device() .destroy_shader_module(self.shader_module, None) } } } #[derive(Clone, Debug)] pub struct RafxShaderModuleVulkan { inner: Arc<RafxShaderModuleVulkanInner>, } impl RafxShaderModuleVulkan { pub fn new_from_bytes( device_context: &RafxDeviceContextVulkan, data: &[u8], ) -> RafxResult<Self> { let spv = ash::util::read_spv(&mut std::io::Cursor::new(data))?; Self::new_from_spv(device_context, &spv) } pub fn new_from_spv( device_context: &RafxDeviceContextVulkan, data: &[u32], ) -> RafxResult<Self> { let create_info = vk::ShaderModuleCreateInfo::builder().code(&data); let shader_module = unsafe { device_context .device() .create_shader_module(&create_info, None)? }; let inner = RafxShaderModuleVulkanInner { device_context: device_context.clone(), shader_module, }; Ok(RafxShaderModuleVulkan { inner: Arc::new(inner), }) } pub fn vk_shader_module(&self) -> vk::ShaderModule { self.inner.shader_module } }