reflect: make compilation an associated function
This commit is contained in:
parent
1579516d25
commit
38ce621664
|
@ -10,6 +10,7 @@ pub struct GlslangGlslContext {
|
||||||
pub sampler_bindings: Vec<u32>,
|
pub sampler_bindings: Vec<u32>,
|
||||||
pub compiler: CompiledAst<spirv_cross::glsl::Target>,
|
pub compiler: CompiledAst<spirv_cross::glsl::Target>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FromCompilation<GlslangCompilation> for GLSL {
|
impl FromCompilation<GlslangCompilation> for GLSL {
|
||||||
type Target = GLSL;
|
type Target = GLSL;
|
||||||
type Options = GlVersion;
|
type Options = GlVersion;
|
||||||
|
|
|
@ -26,9 +26,12 @@ mod test {
|
||||||
use naga::valid::{Capabilities, ValidationFlags};
|
use naga::valid::{Capabilities, ValidationFlags};
|
||||||
use naga::{FastHashSet, ShaderStage};
|
use naga::{FastHashSet, ShaderStage};
|
||||||
use rspirv::binary::Disassemble;
|
use rspirv::binary::Disassemble;
|
||||||
|
use librashader_preprocess::ShaderSource;
|
||||||
|
use crate::front::shaderc::GlslangCompilation;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn compile_naga_test() {
|
pub fn compile_naga_test() {
|
||||||
let result = librashader_preprocess::load_shader_source(
|
let result = ShaderSource::load(
|
||||||
"../test/slang-shaders/blurs/shaders/royale/blur3x3-last-pass.slang",
|
"../test/slang-shaders/blurs/shaders/royale/blur3x3-last-pass.slang",
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -43,7 +46,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn compile_shader() {
|
pub fn compile_shader() {
|
||||||
let result = librashader_preprocess::load_shader_source(
|
let result = ShaderSource::load(
|
||||||
"../test/slang-shaders/blurs/shaders/royale/blur3x3-last-pass.slang",
|
"../test/slang-shaders/blurs/shaders/royale/blur3x3-last-pass.slang",
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -53,8 +56,8 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn compile_shader_roundtrip() {
|
pub fn compile_shader_roundtrip() {
|
||||||
let result = librashader_preprocess::load_shader_source("../test/basic.slang").unwrap();
|
let result = ShaderSource::load("../test/basic.slang").unwrap();
|
||||||
let cross = crate::front::shaderc::compile_spirv(&result).unwrap();
|
let cross = GlslangCompilation::compile(&result).unwrap();
|
||||||
let naga_fragment =
|
let naga_fragment =
|
||||||
naga::front::spv::parse_u8_slice(cross.fragment.as_binary_u8(), &SpvOptions::default())
|
naga::front::spv::parse_u8_slice(cross.fragment.as_binary_u8(), &SpvOptions::default())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -65,8 +68,8 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn naga_playground() {
|
pub fn naga_playground() {
|
||||||
let result = librashader_preprocess::load_shader_source("../test/basic.slang").unwrap();
|
let result = ShaderSource::load("../test/basic.slang").unwrap();
|
||||||
let spirv = crate::front::shaderc::compile_spirv(&result).unwrap();
|
let spirv = GlslangCompilation::compile(&result).unwrap();
|
||||||
|
|
||||||
let module =
|
let module =
|
||||||
naga::front::spv::parse_u8_slice(spirv.fragment.as_binary_u8(), &SpvOptions::default())
|
naga::front::spv::parse_u8_slice(spirv.fragment.as_binary_u8(), &SpvOptions::default())
|
||||||
|
|
|
@ -7,6 +7,23 @@ pub struct GlslangCompilation {
|
||||||
pub(crate) fragment: CompilationArtifact,
|
pub(crate) fragment: CompilationArtifact,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl GlslangCompilation {
|
||||||
|
|
||||||
|
/// Tries to compile SPIR-V from the provided shader source.
|
||||||
|
pub fn compile(source: &ShaderSource) -> Result<Self, ShaderCompileError> {
|
||||||
|
compile_spirv(source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<&ShaderSource> for GlslangCompilation {
|
||||||
|
type Error = ShaderCompileError;
|
||||||
|
|
||||||
|
/// Tries to compile SPIR-V from the provided shader source.
|
||||||
|
fn try_from(source: &ShaderSource) -> Result<Self, Self::Error> {
|
||||||
|
GlslangCompilation::compile(source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn get_shaderc_options() -> Result<CompileOptions<'static>, ShaderCompileError> {
|
fn get_shaderc_options() -> Result<CompileOptions<'static>, ShaderCompileError> {
|
||||||
let mut options = CompileOptions::new().ok_or(ShaderCompileError::ShaderCInitError)?;
|
let mut options = CompileOptions::new().ok_or(ShaderCompileError::ShaderCInitError)?;
|
||||||
options.set_include_callback(|_, _, _, _| {
|
options.set_include_callback(|_, _, _, _| {
|
||||||
|
@ -99,7 +116,7 @@ fn get_shaderc_options() -> Result<CompileOptions<'static>, ShaderCompileError>
|
||||||
Ok(options)
|
Ok(options)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compile_spirv(source: &ShaderSource) -> Result<GlslangCompilation, ShaderCompileError> {
|
fn compile_spirv(source: &ShaderSource) -> Result<GlslangCompilation, ShaderCompileError> {
|
||||||
let compiler = shaderc::Compiler::new().ok_or(ShaderCompileError::ShaderCInitError)?;
|
let compiler = shaderc::Compiler::new().ok_or(ShaderCompileError::ShaderCInitError)?;
|
||||||
let name = source.name.as_deref().unwrap_or("shader.slang");
|
let name = source.name.as_deref().unwrap_or("shader.slang");
|
||||||
let options = get_shaderc_options()?;
|
let options = get_shaderc_options()?;
|
||||||
|
|
|
@ -5,6 +5,7 @@ use librashader_reflect::back::CompileShader;
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use librashader_reflect::front::shaderc::GlslangCompilation;
|
||||||
|
|
||||||
use librashader_reflect::reflect::semantics::{SemanticMap, TextureSemantics, VariableSemantics};
|
use librashader_reflect::reflect::semantics::{SemanticMap, TextureSemantics, VariableSemantics};
|
||||||
use librashader_reflect::reflect::{ReflectSemantics, ReflectShader, UniformSemantic};
|
use librashader_reflect::reflect::{ReflectSemantics, ReflectShader, UniformSemantic};
|
||||||
|
@ -65,7 +66,7 @@ pub fn load(path: impl AsRef<Path>) -> Result<(), Box<dyn Error>> {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|shader| {
|
.map(|shader| {
|
||||||
let source = ShaderSource::load(&shader.name).unwrap();
|
let source = ShaderSource::load(&shader.name).unwrap();
|
||||||
let spirv = librashader_reflect::front::shaderc::compile_spirv(&source).unwrap();
|
let spirv = GlslangCompilation::compile(&source).unwrap();
|
||||||
let reflect = HLSL::from_compilation(spirv).unwrap();
|
let reflect = HLSL::from_compilation(spirv).unwrap();
|
||||||
(shader, source, reflect)
|
(shader, source, reflect)
|
||||||
})
|
})
|
||||||
|
|
|
@ -22,6 +22,7 @@ use spirv_cross::spirv::Decoration;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use librashader_reflect::front::shaderc::GlslangCompilation;
|
||||||
|
|
||||||
pub struct FilterChain {
|
pub struct FilterChain {
|
||||||
passes: Box<[FilterPass]>,
|
passes: Box<[FilterPass]>,
|
||||||
|
@ -207,7 +208,7 @@ impl FilterChain {
|
||||||
eprintln!("[gl] loading {}", &shader.name.display());
|
eprintln!("[gl] loading {}", &shader.name.display());
|
||||||
let source: ShaderSource = ShaderSource::load(&shader.name)?;
|
let source: ShaderSource = ShaderSource::load(&shader.name)?;
|
||||||
|
|
||||||
let spirv = librashader_reflect::front::shaderc::compile_spirv(&source)?;
|
let spirv = GlslangCompilation::compile(&source)?;
|
||||||
let reflect = GLSL::from_compilation(spirv)?;
|
let reflect = GLSL::from_compilation(spirv)?;
|
||||||
|
|
||||||
for parameter in source.parameters.iter() {
|
for parameter in source.parameters.iter() {
|
||||||
|
|
Loading…
Reference in a new issue