2022-11-07 16:25:11 +11:00
|
|
|
use std::collections::HashMap;
|
|
|
|
use std::error::Error;
|
|
|
|
use std::path::Path;
|
|
|
|
use rustc_hash::FxHashMap;
|
2022-11-22 08:13:37 +11:00
|
|
|
use librashader_preprocess::ShaderSource;
|
2022-11-07 16:25:11 +11:00
|
|
|
use librashader_presets::ShaderPassConfig;
|
2022-11-11 17:53:02 +11:00
|
|
|
use librashader_reflect::back::{CompileShader};
|
2022-11-11 17:44:41 +11:00
|
|
|
use librashader_reflect::back::targets::{FromCompilation, HLSL};
|
2022-11-07 16:25:11 +11:00
|
|
|
use librashader_reflect::front::shaderc::GlslangCompilation;
|
2022-11-11 17:44:41 +11:00
|
|
|
use librashader_reflect::reflect::cross::{CrossReflect};
|
2022-11-07 16:25:11 +11:00
|
|
|
use librashader_reflect::reflect::{ReflectSemantics, ReflectShader, UniformSemantic};
|
|
|
|
use librashader_reflect::reflect::semantics::{SemanticMap, TextureSemantics, VariableSemantics};
|
|
|
|
|
|
|
|
|
|
|
|
pub fn load_pass_semantics(uniform_semantics: &mut FxHashMap<String, UniformSemantic>, texture_semantics: &mut FxHashMap<String, SemanticMap<TextureSemantics>>,
|
|
|
|
config: &ShaderPassConfig) {
|
|
|
|
let Some(alias) = &config.alias else {
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Ignore empty aliases
|
|
|
|
if alias.trim().is_empty() {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-11-21 18:39:39 +11:00
|
|
|
let index = config.id as usize;
|
2022-11-07 16:25:11 +11:00
|
|
|
|
|
|
|
// PassOutput
|
|
|
|
texture_semantics.insert(alias.clone(), SemanticMap {
|
|
|
|
semantics: TextureSemantics::PassOutput,
|
|
|
|
index
|
|
|
|
});
|
|
|
|
uniform_semantics.insert(format!("{alias}Size"), UniformSemantic::Texture(SemanticMap {
|
|
|
|
semantics: TextureSemantics::PassOutput,
|
|
|
|
index
|
|
|
|
}));
|
|
|
|
|
|
|
|
// PassFeedback
|
|
|
|
texture_semantics.insert(format!("{alias}Feedback"), SemanticMap {
|
|
|
|
semantics: TextureSemantics::PassFeedback,
|
|
|
|
index
|
|
|
|
});
|
|
|
|
uniform_semantics.insert(format!("{alias}FeedbackSize"), UniformSemantic::Texture(SemanticMap {
|
|
|
|
semantics: TextureSemantics::PassFeedback,
|
|
|
|
index
|
|
|
|
}));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn load(path: impl AsRef<Path>) -> Result<(), Box<dyn Error>>{
|
|
|
|
let preset = librashader_presets::ShaderPreset::try_parse(path)?;
|
2022-11-11 17:44:41 +11:00
|
|
|
let mut passes: Vec<(&ShaderPassConfig, ShaderSource, _)> = preset.shaders.iter()
|
2022-11-07 16:25:11 +11:00
|
|
|
.map(|shader| {
|
|
|
|
let source = librashader_preprocess::load_shader_source(&shader.name)
|
|
|
|
.unwrap();
|
|
|
|
let spirv = librashader_reflect::front::shaderc::compile_spirv(&source)
|
|
|
|
.unwrap();
|
2022-11-11 17:44:41 +11:00
|
|
|
let mut reflect = HLSL::from_compilation(spirv).unwrap();
|
2022-11-07 16:25:11 +11:00
|
|
|
(shader, source, reflect)
|
|
|
|
}).collect();
|
|
|
|
|
|
|
|
// todo: this can probably be extracted out.
|
|
|
|
let mut uniform_semantics: FxHashMap<String, UniformSemantic> = Default::default();
|
|
|
|
let mut texture_semantics: FxHashMap<String, SemanticMap<TextureSemantics>> = Default::default();
|
|
|
|
|
|
|
|
for details in &passes {
|
|
|
|
load_pass_semantics(&mut uniform_semantics, &mut texture_semantics, details.0)
|
|
|
|
}
|
|
|
|
|
|
|
|
// add float params
|
|
|
|
for (index, parameter) in preset.parameters.iter().enumerate() {
|
|
|
|
uniform_semantics.insert(parameter.name.clone(), UniformSemantic::Variable(SemanticMap {
|
|
|
|
semantics: VariableSemantics::FloatParameter,
|
2022-11-14 16:14:05 +11:00
|
|
|
index: ()
|
2022-11-07 16:25:11 +11:00
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
|
|
|
// add lut params
|
|
|
|
for (index, texture) in preset.textures.iter().enumerate() {
|
|
|
|
texture_semantics.insert(texture.name.clone(), SemanticMap {
|
|
|
|
semantics: TextureSemantics::User,
|
2022-11-21 18:39:39 +11:00
|
|
|
index
|
2022-11-07 16:25:11 +11:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
let semantics = ReflectSemantics {
|
|
|
|
uniform_semantics,
|
|
|
|
non_uniform_semantics: texture_semantics
|
|
|
|
};
|
|
|
|
|
|
|
|
let mut reflections = Vec::new();
|
|
|
|
let mut compiled = Vec::new();
|
|
|
|
|
2022-11-22 08:13:37 +11:00
|
|
|
for (index, (_, _, mut reflect)) in passes.into_iter().enumerate() {
|
2022-11-21 18:39:39 +11:00
|
|
|
let reflection = reflect.reflect(index, &semantics)
|
2022-11-07 16:25:11 +11:00
|
|
|
.unwrap();
|
|
|
|
|
2022-11-09 17:51:10 +11:00
|
|
|
let hlsl = reflect.compile(None)
|
2022-11-07 16:25:11 +11:00
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
eprintln!("{:#}", hlsl.vertex);
|
|
|
|
|
|
|
|
eprintln!("{:#}", hlsl.fragment);
|
|
|
|
|
|
|
|
compiled.push(hlsl);
|
|
|
|
reflections.push(reflection);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
eprintln!("{:#?}", reflections);
|
|
|
|
|
|
|
|
|
|
|
|
// //todo: add the semantics for other shit (slang_process:68)
|
|
|
|
// eprintln!("{:?}", preset);
|
|
|
|
// eprintln!("{:?}", reflect.reflect(&ReflectOptions {
|
|
|
|
// pass_number: i as u32,
|
|
|
|
// uniform_semantics,
|
|
|
|
// non_uniform_semantics: Default::default(),
|
|
|
|
// }));
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn load_preset() {
|
|
|
|
|
|
|
|
load("../test/basic.slangp")
|
|
|
|
.unwrap();
|
|
|
|
}
|
|
|
|
}
|