rotex_vulkan/backend/vulkan/graphics_pipeline/
shader.rs1use std::ffi::CStr;
2
3use ash::vk;
4
5use super::super::device::Device;
6use crate::error::vk_error;
7use crate::Error;
8
9pub struct ShaderModule {
10 pub(crate) handle: vk::ShaderModule,
11}
12
13impl ShaderModule {
14 pub fn new(device: &Device, spv_code: &[u32]) -> Result<Self, Error> {
15 let create_info = vk::ShaderModuleCreateInfo::default().code(spv_code);
16
17 let handle = unsafe {
18 device
19 .logical_device()
20 .create_shader_module(&create_info, None)
21 }
22 .map_err(vk_error)?;
23
24 Ok(Self { handle })
25 }
26
27 pub fn handle(&self) -> vk::ShaderModule {
28 self.handle
29 }
30
31 pub fn destroy(&self, device: &Device) {
32 unsafe {
33 device
34 .logical_device()
35 .destroy_shader_module(self.handle, None);
36 }
37 }
38}
39
40pub struct ShaderStageDescriptor<'a> {
41 pub(crate) stage: vk::ShaderStageFlags,
42 pub(crate) module: &'a ShaderModule,
43 pub(crate) entry_name: &'a CStr,
44}
45
46impl<'a> ShaderStageDescriptor<'a> {
47 pub fn new(stage: vk::ShaderStageFlags, module: &'a ShaderModule) -> Self {
48 Self {
49 stage,
50 module,
51 entry_name: c"main",
52 }
53 }
54
55 pub fn with_entry_name(mut self, name: &'a CStr) -> Self {
56 self.entry_name = name;
57 self
58 }
59}