reflect: implement stable FromCompilation
This commit is contained in:
parent
4cc3c875bf
commit
e0a5c90103
|
@ -46,5 +46,6 @@ cross = [ "dep:spirv-cross2", "spirv-cross2/glsl", "spirv-cross2/hlsl", "spirv-c
|
|||
naga = [ "dep:rspirv", "dep:spirv", "naga/spv-in", "naga/spv-out", "naga/wgsl-out", "naga/msl-out" ]
|
||||
serialize = [ "dep:serde" ]
|
||||
msl = [ "spirv-cross2/msl", "naga/msl-out" ]
|
||||
stable = []
|
||||
|
||||
unstable-naga-in = ["naga/glsl-in"]
|
||||
|
|
|
@ -17,6 +17,7 @@ impl OutputTarget for DXIL {
|
|||
type Output = DxilObject;
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for DXIL {
|
||||
type Target = DXIL;
|
||||
type Options = Option<ShaderModel>;
|
||||
|
@ -38,6 +39,28 @@ impl FromCompilation<SpirvCompilation, SpirvCross> for DXIL {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "stable")]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for DXIL {
|
||||
type Target = DXIL;
|
||||
type Options = Option<ShaderModel>;
|
||||
type Context = ();
|
||||
type Output = Box<dyn CompileReflectShader<Self::Target, SpirvCompilation, SpirvCross> + Send>;
|
||||
|
||||
fn from_compilation(
|
||||
compile: SpirvCompilation,
|
||||
) -> Result<CompilerBackend<Self::Output>, ShaderReflectError> {
|
||||
let reflect = GlslReflect::try_from(&compile)?;
|
||||
Ok(CompilerBackend {
|
||||
// we can just reuse WriteSpirV as the backend.
|
||||
backend: Box::new(WriteSpirV {
|
||||
reflect,
|
||||
vertex: compile.vertex,
|
||||
fragment: compile.fragment,
|
||||
}),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl CompileShader<DXIL> for WriteSpirV {
|
||||
type Options = Option<ShaderModel>;
|
||||
type Context = ();
|
||||
|
|
|
@ -17,6 +17,7 @@ pub struct CrossGlslContext {
|
|||
pub artifact: CompiledProgram<spirv_cross2::targets::Glsl>,
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for GLSL {
|
||||
type Target = GLSL;
|
||||
type Options = GlslVersion;
|
||||
|
@ -31,3 +32,19 @@ impl FromCompilation<SpirvCompilation, SpirvCross> for GLSL {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "stable")]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for GLSL {
|
||||
type Target = GLSL;
|
||||
type Options = GlslVersion;
|
||||
type Context = CrossGlslContext;
|
||||
type Output = Box<dyn CompileReflectShader<Self::Target, SpirvCompilation, SpirvCross> + Send>;
|
||||
|
||||
fn from_compilation(
|
||||
compile: SpirvCompilation,
|
||||
) -> Result<CompilerBackend<Self::Output>, ShaderReflectError> {
|
||||
Ok(CompilerBackend {
|
||||
backend: Box::new(GlslReflect::try_from(&compile)?),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ impl HlslBufferAssignments {
|
|||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
false
|
||||
}
|
||||
|
||||
// Check if the mangled name matches.
|
||||
|
@ -91,7 +91,7 @@ impl HlslBufferAssignments {
|
|||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -103,6 +103,7 @@ pub struct CrossHlslContext {
|
|||
pub fragment_buffers: HlslBufferAssignments,
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for HLSL {
|
||||
type Target = HLSL;
|
||||
type Options = Option<HlslShaderModel>;
|
||||
|
@ -118,6 +119,22 @@ impl FromCompilation<SpirvCompilation, SpirvCross> for HLSL {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "stable")]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for HLSL {
|
||||
type Target = HLSL;
|
||||
type Options = Option<HlslShaderModel>;
|
||||
type Context = CrossHlslContext;
|
||||
type Output = Box<dyn CompileReflectShader<Self::Target, SpirvCompilation, SpirvCross> + Send>;
|
||||
|
||||
fn from_compilation(
|
||||
compile: SpirvCompilation,
|
||||
) -> Result<CompilerBackend<Self::Output>, ShaderReflectError> {
|
||||
Ok(CompilerBackend {
|
||||
backend: Box::new(HlslReflect::try_from(&compile)?),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::back::hlsl::HlslBufferAssignments;
|
||||
|
|
|
@ -5,7 +5,6 @@ use crate::front::SpirvCompilation;
|
|||
use crate::reflect::cross::msl::MslReflect;
|
||||
use crate::reflect::cross::{CompiledProgram, SpirvCross};
|
||||
use crate::reflect::naga::{Naga, NagaReflect};
|
||||
use crate::reflect::ReflectShader;
|
||||
use naga::back::msl::TranslationInfo;
|
||||
use naga::Module;
|
||||
|
||||
|
@ -25,6 +24,7 @@ pub struct CrossMslContext {
|
|||
pub artifact: CompiledProgram<spirv_cross2::targets::Msl>,
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for MSL {
|
||||
type Target = MSL;
|
||||
type Options = Option<self::MslVersion>;
|
||||
|
@ -40,6 +40,22 @@ impl FromCompilation<SpirvCompilation, SpirvCross> for MSL {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "stable")]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for MSL {
|
||||
type Target = MSL;
|
||||
type Options = Option<self::MslVersion>;
|
||||
type Context = CrossMslContext;
|
||||
type Output = Box<dyn CompileReflectShader<Self::Target, SpirvCompilation, SpirvCross> + Send>;
|
||||
|
||||
fn from_compilation(
|
||||
compile: SpirvCompilation,
|
||||
) -> Result<CompilerBackend<Self::Output>, ShaderReflectError> {
|
||||
Ok(CompilerBackend {
|
||||
backend: Box::new(MslReflect::try_from(&compile)?),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// The naga module for a shader after compilation
|
||||
pub struct NagaMslModule {
|
||||
pub translation_info: TranslationInfo,
|
||||
|
@ -52,6 +68,7 @@ pub struct NagaMslContext {
|
|||
pub next_free_binding: u32,
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
impl FromCompilation<SpirvCompilation, Naga> for MSL {
|
||||
type Target = MSL;
|
||||
type Options = Option<self::MslVersion>;
|
||||
|
@ -66,3 +83,19 @@ impl FromCompilation<SpirvCompilation, Naga> for MSL {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "stable")]
|
||||
impl FromCompilation<SpirvCompilation, Naga> for MSL {
|
||||
type Target = MSL;
|
||||
type Options = Option<self::MslVersion>;
|
||||
type Context = NagaMslContext;
|
||||
type Output = Box<dyn CompileReflectShader<Self::Target, SpirvCompilation, Naga> + Send>;
|
||||
|
||||
fn from_compilation(
|
||||
compile: SpirvCompilation,
|
||||
) -> Result<CompilerBackend<Self::Output>, ShaderReflectError> {
|
||||
Ok(CompilerBackend {
|
||||
backend: Box::new(NagaReflect::try_from(&compile)?),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ pub(crate) struct WriteSpirV {
|
|||
pub(crate) fragment: Vec<u32>,
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for SPIRV {
|
||||
type Target = SPIRV;
|
||||
type Options = Option<()>;
|
||||
|
@ -40,6 +41,29 @@ impl FromCompilation<SpirvCompilation, SpirvCross> for SPIRV {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "stable")]
|
||||
impl FromCompilation<SpirvCompilation, SpirvCross> for SPIRV {
|
||||
type Target = SPIRV;
|
||||
type Options = Option<()>;
|
||||
type Context = ();
|
||||
type Output = Box<dyn CompileReflectShader<Self::Target, SpirvCompilation, SpirvCross> + Send>;
|
||||
|
||||
fn from_compilation(
|
||||
compile: SpirvCompilation,
|
||||
) -> Result<CompilerBackend<Self::Output>, ShaderReflectError> {
|
||||
let reflect = GlslReflect::try_from(&compile)?;
|
||||
let vertex = compile.vertex;
|
||||
let fragment = compile.fragment;
|
||||
Ok(CompilerBackend {
|
||||
backend: Box::new(WriteSpirV {
|
||||
reflect,
|
||||
vertex,
|
||||
fragment,
|
||||
}),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ReflectShader for WriteSpirV {
|
||||
fn reflect(
|
||||
&mut self,
|
||||
|
@ -83,6 +107,7 @@ pub struct NagaSpirvContext {
|
|||
pub vertex: Module,
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
impl FromCompilation<SpirvCompilation, Naga> for SPIRV {
|
||||
type Target = SPIRV;
|
||||
type Options = NagaSpirvOptions;
|
||||
|
@ -98,6 +123,22 @@ impl FromCompilation<SpirvCompilation, Naga> for SPIRV {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "stable")]
|
||||
impl FromCompilation<SpirvCompilation, Naga> for SPIRV {
|
||||
type Target = SPIRV;
|
||||
type Options = NagaSpirvOptions;
|
||||
type Context = NagaSpirvContext;
|
||||
type Output = Box<dyn CompileReflectShader<Self::Target, SpirvCompilation, Naga> + Send>;
|
||||
|
||||
fn from_compilation(
|
||||
compile: SpirvCompilation,
|
||||
) -> Result<CompilerBackend<Self::Output>, ShaderReflectError> {
|
||||
Ok(CompilerBackend {
|
||||
backend: Box::new(NagaReflect::try_from(&compile)?),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub struct NagaSpirvOptions {
|
||||
pub lowering: NagaLoweringOptions,
|
||||
pub version: (u8, u8),
|
||||
|
|
|
@ -11,6 +11,7 @@ pub struct NagaWgslContext {
|
|||
pub vertex: Module,
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
impl FromCompilation<SpirvCompilation, Naga> for WGSL {
|
||||
type Target = WGSL;
|
||||
type Options = NagaLoweringOptions;
|
||||
|
@ -26,6 +27,22 @@ impl FromCompilation<SpirvCompilation, Naga> for WGSL {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "stable")]
|
||||
impl FromCompilation<SpirvCompilation, Naga> for WGSL {
|
||||
type Target = WGSL;
|
||||
type Options = NagaLoweringOptions;
|
||||
type Context = NagaWgslContext;
|
||||
type Output = Box<dyn CompileReflectShader<Self::Target, SpirvCompilation, Naga> + Send>;
|
||||
|
||||
fn from_compilation(
|
||||
compile: SpirvCompilation,
|
||||
) -> Result<CompilerBackend<Self::Output>, ShaderReflectError> {
|
||||
Ok(CompilerBackend {
|
||||
backend: Box::new(NagaReflect::try_from(&compile)?),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::back::targets::WGSL;
|
||||
|
|
|
@ -43,9 +43,9 @@
|
|||
//! librashader-reflect is designed to be compiler-agnostic. [naga](https://docs.rs/naga/latest/naga/index.html),
|
||||
//! a pure-Rust shader compiler, as well as SPIRV-Cross via [SpirvCompilation](crate::front::SpirvCompilation)
|
||||
//! is supported.
|
||||
#![feature(impl_trait_in_assoc_type)]
|
||||
#![cfg_attr(not(feature="stable"), feature(impl_trait_in_assoc_type))]
|
||||
#![allow(stable_features)]
|
||||
#![feature(c_str_literals)]
|
||||
#![cfg_attr(not(feature="stable"), feature(c_str_literals))]
|
||||
/// Shader codegen backends.
|
||||
pub mod back;
|
||||
/// Error types.
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
//! This crate should not be used directly.
|
||||
//! See [`librashader::runtime::d3d11`](https://docs.rs/librashader/latest/librashader/runtime/d3d11/index.html) instead.
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![cfg_attr(not(feature = "stable"), feature(type_alias_impl_trait))]
|
||||
|
||||
mod draw_quad;
|
||||
mod filter_chain;
|
||||
|
|
Loading…
Reference in a new issue