librashader_reflect/reflect/naga/
wgsl.rs1use 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}