use std::env;
use std::path::{Path, PathBuf};
use std::process::Command;
use anyhow::Result;
fn get_dxc_path() -> Result<PathBuf> {
if cfg!(target_os = "linux") {
return Ok(PathBuf::from("/usr/bin/dxc"));
} else {
return Ok(env::var("VULKAN_SDK").map(|sdk| PathBuf::from(&sdk).join("Bin/dxc"))?);
}
}
enum Stage {
Vertex,
Fragment,
}
#[allow(unreachable_patterns)]
fn hlsl_profile(stage: Stage) -> Result<String> {
Ok(match stage {
Stage::Vertex => "vs",
Stage::Fragment => "ps",
_ => todo!(),
}
.to_owned()
+ "_6_7")
}
fn compile_hlsl(path: &Path, out: &Path, stage: Stage) -> Result<()> {
let dxc = get_dxc_path()?;
let output = Command::new(dxc)
.arg("-E main")
.arg("-Fo".to_owned() + out.to_str().unwrap())
.arg("-HV 2021")
.arg("-T ".to_owned() + &hlsl_profile(stage)?)
.arg("-fspv-target-env=vulkan1.3")
.arg("-spirv")
.arg(path)
.output()?;
println!(
"Error compiling shader: {}",
String::from_utf8(output.stderr).unwrap()
);
Ok(())
}
fn main() {
println!("cargo:rerun-if-changed=src/shaders/src/vert.hlsl");
println!("cargo:rerun-if-changed=src/shaders/src/frag.hlsl");
}