aboutsummaryrefslogtreecommitdiff
path: root/stockton-skeleton/src/builders/shader.rs
blob: be48951ecea6e3153c5546ab8e7f4bd5ae01d94b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use crate::types::*;

pub use shaderc::ShaderKind;

use anyhow::{Context, Result};
use hal::pso::Specialization;
use shaderc::Compiler;

#[derive(Debug, Clone)]
pub struct ShaderDesc {
    pub source: String,
    pub entry: String,
    pub kind: ShaderKind,
}

impl ShaderDesc {
    pub fn compile(&self, compiler: &mut Compiler, device: &mut DeviceT) -> Result<ShaderModuleT> {
        let artifact = compiler
            .compile_into_spirv(&self.source, self.kind, "shader", &self.entry, None)
            .context("Shader compilation failed")?;

        // Make into shader module
        Ok(unsafe {
            device
                .create_shader_module(artifact.as_binary())
                .context("Shader module creation failed")?
        })
    }

    pub fn as_entry<'a>(&'a self, module: &'a ShaderModuleT) -> EntryPoint<'a> {
        EntryPoint {
            entry: &self.entry,
            module,
            specialization: Specialization::default(),
        }
    }
}