Expand description
Shader reflection and cross-compilation for librashader.
§Usage
librashader-reflect requires the type_alias_impl_trait
nightly feature. You should choose your
target shading language, and a compilation type.
#![feature(type_alias_impl_trait)]
use std::error::Error;
use librashader_preprocess::ShaderSource;
use librashader_presets::ShaderPreset;
use librashader_reflect::back::{CompileReflectShader, FromCompilation};
use librashader_reflect::back::targets::SPIRV;
use librashader_reflect::front::{Glslang, ShaderInputCompiler, SpirvCompilation};
use librashader_reflect::reflect::cross::SpirvCross;
use librashader_reflect::reflect::presets::{CompilePresetTarget, ShaderPassArtifact};
use librashader_reflect::reflect::semantics::ShaderSemantics;
type Artifact = impl CompileReflectShader<SPIRV, SpirvCompilation, SpirvCross>;
type ShaderPassMeta = ShaderPassArtifact<Artifact>;
// Compile single shader
pub fn compile_spirv(
source: &ShaderSource,
) -> Result<Artifact, Box<dyn Error>>
{
let compilation = SpirvCompilation::try_from(&source);
let spirv = SPIRV::from_compilation(compilation)?;
Ok(spirv)
}
// Compile preset
pub fn compile_preset(preset: ShaderPreset) -> Result<(Vec<ShaderPassMeta>, ShaderSemantics), Box<dyn Error>>
{
let (passes, semantics) = SPIRV::compile_preset_passes::<SpirvCompilation, SpirvCross, Box<dyn Error>>(
preset.passes, &preset.textures)?;
Ok((passes, semantics))
}
§What’s with all the traits?
librashader-reflect is designed to be compiler-agnostic. naga, a pure-Rust shader compiler, as well as SPIRV-Cross via SpirvCompilation is supported.
Modules§
- Shader codegen backends.
- Error types.
- Shader frontend parsers.
- Shader reflection.