librashader/librashader-reflect/src/back/spirv.rs

64 lines
1.9 KiB
Rust
Raw Normal View History

2023-01-13 23:59:16 -05:00
use crate::back::targets::SPIRV;
2022-12-21 21:39:31 -05:00
use crate::back::{CompileShader, CompilerBackend, FromCompilation, ShaderCompilerOutput};
use crate::error::{ShaderCompileError, ShaderReflectError};
use crate::front::GlslangCompilation;
2022-12-21 21:39:31 -05:00
use crate::reflect::cross::GlslReflect;
use crate::reflect::semantics::ShaderSemantics;
2022-12-21 21:39:31 -05:00
use crate::reflect::{ReflectShader, ShaderReflection};
2023-02-04 17:53:51 -05:00
pub(crate) struct WriteSpirV {
// rely on GLSL to provide out reflection but we don't actually need the AST.
2023-02-04 17:53:51 -05:00
pub(crate) reflect: GlslReflect,
pub(crate) vertex: Vec<u32>,
pub(crate) fragment: Vec<u32>,
}
2023-01-13 23:59:16 -05:00
impl FromCompilation<GlslangCompilation> for SPIRV {
type Target = SPIRV;
type Options = Option<()>;
type Context = ();
2023-01-16 19:35:23 -05:00
type Output = impl CompileShader<Self::Target, Options = Self::Options, Context = Self::Context>
+ ReflectShader;
fn from_compilation(
compile: GlslangCompilation,
) -> Result<CompilerBackend<Self::Output>, 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 {
2022-12-21 21:39:31 -05:00
fn reflect(
&mut self,
pass_number: usize,
semantics: &ShaderSemantics,
) -> Result<ShaderReflection, ShaderReflectError> {
self.reflect.reflect(pass_number, semantics)
}
}
2023-01-13 23:59:16 -05:00
impl CompileShader<SPIRV> for WriteSpirV {
type Options = Option<()>;
type Context = ();
2022-12-21 21:39:31 -05:00
fn compile(
self,
_options: Self::Options,
) -> Result<ShaderCompilerOutput<Vec<u32>, Self::Context>, ShaderCompileError> {
Ok(ShaderCompilerOutput {
vertex: self.vertex,
fragment: self.fragment,
context: (),
})
}
2022-12-21 21:39:31 -05:00
}