2023-01-17 15:09:07 +11:00
|
|
|
//! Shader reflection and cross-compilation for librashader.
|
2023-01-20 10:59:39 +11:00
|
|
|
//!
|
|
|
|
//! ## Usage
|
|
|
|
//!
|
|
|
|
//! librashader-reflect requires the `type_alias_impl_trait` nightly feature. You should choose your
|
|
|
|
//! target shading language, and a compilation type.
|
|
|
|
//!
|
|
|
|
//! ```rust
|
|
|
|
//! #![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;
|
2024-02-11 09:47:05 +11:00
|
|
|
//! use librashader_reflect::front::{Glslang, ShaderInputCompiler, SpirvCompilation};
|
2024-02-11 13:17:58 +11:00
|
|
|
//! use librashader_reflect::reflect::cross::SpirvCross;
|
2023-01-20 10:59:39 +11:00
|
|
|
//! use librashader_reflect::reflect::presets::{CompilePresetTarget, ShaderPassArtifact};
|
|
|
|
//! use librashader_reflect::reflect::semantics::ShaderSemantics;
|
2024-02-11 13:17:58 +11:00
|
|
|
//! type Artifact = impl CompileReflectShader<SPIRV, SpirvCompilation, SpirvCross>;
|
2023-01-20 10:59:39 +11:00
|
|
|
//! type ShaderPassMeta = ShaderPassArtifact<Artifact>;
|
|
|
|
//!
|
|
|
|
//! // Compile single shader
|
|
|
|
//! pub fn compile_spirv(
|
|
|
|
//! source: &ShaderSource,
|
|
|
|
//! ) -> Result<Artifact, Box<dyn Error>>
|
|
|
|
//! {
|
2024-02-14 09:37:48 +11:00
|
|
|
//! let compilation = SpirvCompilation::try_from(&source);
|
|
|
|
//! let spirv = SPIRV::from_compilation(compilation)?;
|
2023-01-20 10:59:39 +11:00
|
|
|
//! Ok(spirv)
|
|
|
|
//! }
|
|
|
|
//!
|
|
|
|
//! // Compile preset
|
|
|
|
//! pub fn compile_preset(preset: ShaderPreset) -> Result<(Vec<ShaderPassMeta>, ShaderSemantics), Box<dyn Error>>
|
|
|
|
//! {
|
2024-02-14 09:37:48 +11:00
|
|
|
//! let (passes, semantics) = SPIRV::compile_preset_passes::<SpirvCompilation, SpirvCross, Box<dyn Error>>(
|
2023-01-20 10:59:39 +11:00
|
|
|
//! preset.shaders, &preset.textures)?;
|
|
|
|
//! Ok((passes, semantics))
|
|
|
|
//! }
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! ## What's with all the traits?
|
|
|
|
//! librashader-reflect is designed to be compiler-agnostic. In the future, we will allow usage of
|
|
|
|
//! [naga](https://docs.rs/naga/latest/naga/index.html), a pure-Rust shader compiler, when it has
|
|
|
|
//! matured enough to support [the features librashader needs](https://github.com/gfx-rs/naga/issues/1012).
|
|
|
|
//!
|
2024-02-11 09:47:05 +11:00
|
|
|
//! In the meanwhile, the only supported compilation type is [GlslangCompilation](crate::front::SpirvCompilation),
|
2024-02-08 14:26:17 +11:00
|
|
|
//! which does transpilation via [glslang](https://github.com/KhronosGroup/glslang) and [SPIRV-Cross](https://github.com/KhronosGroup/SPIRV-Cross).
|
2023-04-23 14:13:39 +10:00
|
|
|
#![feature(impl_trait_in_assoc_type)]
|
2023-01-29 17:57:09 +11:00
|
|
|
#![feature(let_chains)]
|
2022-10-26 16:19:04 +11:00
|
|
|
|
2022-12-01 14:50:57 +11:00
|
|
|
/// Shader codegen backends.
|
2022-11-11 17:44:41 +11:00
|
|
|
pub mod back;
|
2022-12-01 14:50:57 +11:00
|
|
|
/// Error types.
|
2022-11-07 16:25:11 +11:00
|
|
|
pub mod error;
|
2022-12-01 14:50:57 +11:00
|
|
|
/// Shader frontend parsers.
|
2022-11-07 16:25:11 +11:00
|
|
|
pub mod front;
|
2022-12-01 14:50:57 +11:00
|
|
|
/// Shader reflection.
|
2022-11-07 16:25:11 +11:00
|
|
|
pub mod reflect;
|