Files
Graphite/node-graph/wgpu-executor/build.rs
2025-06-05 16:00:36 +02:00

35 lines
1.4 KiB
Rust

use cargo_gpu::CompileResultNagaExt;
use cargo_gpu::naga::back::wgsl::WriterFlags;
use cargo_gpu::naga::valid::Capabilities;
use cargo_gpu::spirv_builder::{MetadataPrintout, SpirvMetadata};
use std::path::PathBuf;
pub fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::builder().init();
let shader_crate = PathBuf::from("../gcore-shader");
// install the toolchain and build the `rustc_codegen_spirv` codegen backend with it
let backend = cargo_gpu::Install::from_shader_crate(shader_crate.clone()).run()?;
// build the shader crate
let mut builder = backend.to_spirv_builder(shader_crate, "spirv-unknown-vulkan1.2");
builder.print_metadata = MetadataPrintout::DependencyOnly;
builder.spirv_metadata = SpirvMetadata::Full;
builder.shader_crate_features.default_features = false;
builder.shader_crate_features.features = vec![String::from("gpu")];
let spv_result = builder.build()?;
// transpile the spv binaries to wgsl
let wgsl_result = spv_result.naga_transpile(Capabilities::empty())?.to_wgsl(WriterFlags::empty())?;
let path_to_wgsl = wgsl_result.module.unwrap_single();
// emit path to wgsl into env var, used in `quad.rs` like this:
// > include_str!(env!("WGSL_SHADER_PATH"))
println!("cargo::rustc-env=WGSL_SHADER_PATH={}", path_to_wgsl.display());
// you could also generate some rust source code into the `std::env::var("OUT_DIR")` dir
// and use `include!(concat!(env!("OUT_DIR"), "/shader_symbols.rs"));` to include it
Ok(())
}