Skip to main content

rotex_vulkan/backend/vulkan/graphics_pipeline/
shader.rs

1use 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}