librashader_reflect/reflect/naga/
wgsl.rs

1use crate::back::targets::WGSL;
2use crate::back::wgsl::NagaWgslContext;
3use crate::back::{CompileShader, ShaderCompilerOutput};
4use crate::error::ShaderCompileError;
5use crate::reflect::naga::{NagaLoweringOptions, NagaReflect};
6use naga::back::wgsl::WriterFlags;
7use naga::valid::{Capabilities, ModuleInfo, ValidationFlags, Validator};
8use naga::Module;
9
10impl CompileShader<WGSL> for NagaReflect {
11    type Options = NagaLoweringOptions;
12    type Context = NagaWgslContext;
13
14    fn compile(
15        mut self,
16        options: Self::Options,
17    ) -> Result<ShaderCompilerOutput<String, Self::Context>, ShaderCompileError> {
18        fn write_wgsl(module: &Module, info: &ModuleInfo) -> Result<String, ShaderCompileError> {
19            let wgsl = naga::back::wgsl::write_string(&module, &info, WriterFlags::empty())?;
20            Ok(wgsl)
21        }
22
23        self.do_lowering(&options);
24
25        let mut valid = Validator::new(ValidationFlags::all(), Capabilities::empty());
26
27        let vertex_info = valid.validate(&self.vertex)?;
28        let fragment_info = valid.validate(&self.fragment)?;
29
30        let fragment = write_wgsl(&self.fragment, &fragment_info)?;
31        let vertex = write_wgsl(&self.vertex, &vertex_info)?;
32        Ok(ShaderCompilerOutput {
33            vertex,
34            fragment,
35            context: NagaWgslContext {
36                fragment: self.fragment,
37                vertex: self.vertex,
38            },
39        })
40    }
41
42    fn compile_boxed(
43        self: Box<Self>,
44        options: Self::Options,
45    ) -> Result<ShaderCompilerOutput<String, Self::Context>, ShaderCompileError> {
46        <NagaReflect as CompileShader<WGSL>>::compile(*self, options)
47    }
48}