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 #[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#[derive(Debug, Clone)]
43pub struct ShaderModule {
44 inner: Arc<Inner>,
45}
46
47impl ShaderModule {
48 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 pub fn handle(&self) -> ShaderModuleHandle {
66 self.inner.handle
67 }
68
69 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