vulkayes_core/shader/
mod.rs1use std::{fmt, ops::Deref};
2
3use ash::{version::DeviceV1_0, vk};
4
5use crate::prelude::{Device, HasHandle, HostMemoryAllocator, Vrc};
6
7pub mod error;
8pub mod params;
9
10pub struct ShaderModule {
11 device: Vrc<Device>,
12 module: vk::ShaderModule,
13
14 host_memory_allocator: HostMemoryAllocator
15}
16impl ShaderModule {
17 pub fn new(
18 device: Vrc<Device>,
19 code: impl AsRef<[u32]>,
20 host_memory_allocator: HostMemoryAllocator
21 ) -> Result<Vrc<Self>, error::ShaderError> {
22 let create_info = vk::ShaderModuleCreateInfo::builder().code(code.as_ref());
23
24 unsafe { Self::from_create_info(device, create_info, host_memory_allocator) }
25 }
26
27 pub unsafe fn from_create_info(
31 device: Vrc<Device>,
32 create_info: impl Deref<Target = vk::ShaderModuleCreateInfo>,
33 host_memory_allocator: HostMemoryAllocator
34 ) -> Result<Vrc<Self>, error::ShaderError> {
35 log_trace_common!(
36 "Creating shader module:",
37 device,
38 create_info.deref(),
39 host_memory_allocator
40 );
41
42 let module =
43 device.create_shader_module(create_info.deref(), host_memory_allocator.as_ref())?;
44
45 Ok(Vrc::new(ShaderModule {
46 device,
47 module,
48
49 host_memory_allocator
50 }))
51 }
52
53 pub fn stage_create_info<'a>(
55 &'a self,
56 shader_type: vk::ShaderStageFlags,
57 entry_name: params::ShaderEntryPoint<'a>,
58 specialization_info: Option<&'a vk::SpecializationInfoBuilder<'a>>
59 ) -> vk::PipelineShaderStageCreateInfoBuilder<'a> {
60 let mut builder = vk::PipelineShaderStageCreateInfo::builder()
61 .module(self.handle())
62 .name(entry_name.to_cstr())
63 .stage(shader_type);
64 if let Some(spec_info) = specialization_info {
65 builder = builder.specialization_info(spec_info);
66 }
67
68 builder
69 }
70
71 pub const fn device(&self) -> &Vrc<Device> {
72 &self.device
73 }
74}
75impl_common_handle_traits! {
76 impl HasHandle<vk::ShaderModule>, Deref, Borrow, Eq, Hash, Ord for ShaderModule {
77 target = { module }
78 }
79}
80impl Drop for ShaderModule {
81 fn drop(&mut self) {
82 log_trace_common!("Dropping", self);
83
84 unsafe {
85 self.device
86 .destroy_shader_module(self.module, self.host_memory_allocator.as_ref())
87 }
88 }
89}
90impl fmt::Debug for ShaderModule {
91 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
92 f.debug_struct("ShaderModule")
93 .field("device", &self.device)
94 .field("module", &self.safe_handle())
95 .field("host_memory_allocator", &self.host_memory_allocator)
96 .finish()
97 }
98}