use crate::back::targets::SPIRV; use crate::back::{CompileShader, CompilerBackend, FromCompilation, ShaderCompilerOutput}; use crate::error::{ShaderCompileError, ShaderReflectError}; use crate::front::GlslangCompilation; use crate::reflect::cross::GlslReflect; use crate::reflect::semantics::ShaderSemantics; use crate::reflect::{ReflectShader, ShaderReflection}; pub(crate) struct WriteSpirV { // rely on GLSL to provide out reflection but we don't actually need the AST. pub(crate) reflect: GlslReflect, pub(crate) vertex: Vec, pub(crate) fragment: Vec, } impl FromCompilation for SPIRV { type Target = SPIRV; type Options = Option<()>; type Context = (); type Output = impl CompileShader + ReflectShader; fn from_compilation( compile: GlslangCompilation, ) -> Result, ShaderReflectError> { let reflect = GlslReflect::try_from(&compile)?; let vertex = compile.vertex; let fragment = compile.fragment; Ok(CompilerBackend { backend: WriteSpirV { reflect, vertex, fragment, }, }) } } impl ReflectShader for WriteSpirV { fn reflect( &mut self, pass_number: usize, semantics: &ShaderSemantics, ) -> Result { self.reflect.reflect(pass_number, semantics) } } impl CompileShader for WriteSpirV { type Options = Option<()>; type Context = (); fn compile( self, _options: Self::Options, ) -> Result, Self::Context>, ShaderCompileError> { Ok(ShaderCompilerOutput { vertex: self.vertex, fragment: self.fragment, context: (), }) } }