voodoo/
shader_module.rs

1use std::sync::Arc;
2use vks;
3use ::{VdResult, Device, Handle, ShaderModuleCreateInfo};
4
5
6#[derive(Clone, Copy, Debug, Eq, PartialEq)]
7#[repr(C)]
8pub struct ShaderModuleHandle(pub(crate) vks::VkShaderModule);
9
10impl ShaderModuleHandle {
11    #[inline(always)]
12    pub fn to_raw(&self) -> vks::VkShaderModule {
13        self.0
14    }
15}
16
17unsafe impl Handle for ShaderModuleHandle {
18    type Target = ShaderModuleHandle;
19
20    /// Returns this object's handle.
21    #[inline(always)]
22    fn handle(&self) -> Self::Target {
23        *self
24    }
25}
26
27
28#[derive(Debug)]
29struct Inner {
30    handle: ShaderModuleHandle,
31    device: Device,
32}
33
34// The following object types are consumed when they are passed into a Vulkan
35// command and not further accessed by the objects they are used to create.
36// They must not be destroyed in the duration of any API command they are
37// passed into:
38//
39// * VkShaderModule
40// * VkPipelineCache
41//
42#[derive(Debug, Clone)]
43pub struct ShaderModule {
44    inner: Arc<Inner>,
45}
46
47impl ShaderModule {
48    /// Creates and returns a new `ShaderModule`.
49    pub fn new(device: Device, code: &[u32]) -> VdResult<ShaderModule> {
50        let create_info = ShaderModuleCreateInfo::builder()
51            .code(code)
52            .build();
53
54        let handle = unsafe { device.create_shader_module(&create_info, None)? };
55
56        Ok(ShaderModule {
57            inner: Arc::new(Inner {
58                handle,
59                device,
60            })
61        })
62    }
63
64    /// Returns this object's handle.
65    pub fn handle(&self) -> ShaderModuleHandle {
66        self.inner.handle
67    }
68
69    /// Returns a reference to the associated device.
70    pub fn device(&self) -> &Device {
71        &self.inner.device
72    }
73}
74
75unsafe impl<'h> Handle for &'h ShaderModule {
76    type Target = ShaderModuleHandle;
77
78    #[inline(always)]
79    fn handle(&self) -> Self::Target {
80        self.inner.handle
81    }
82}
83
84impl Drop for Inner {
85    fn drop(&mut self) {
86        unsafe {
87            self.device.destroy_shader_module(self.handle, None);
88        }
89    }
90}
91