vulkayes_core/shader/
mod.rs

1use 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	/// ### Safety
28	///
29	/// See <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkCreateShaderModule.html>.
30	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	/// Returns a shader stage create info builder filled with parameters.
54	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}