expose wgsl source code
diff --git a/sparse_strips/vello_hybrid/Cargo.toml b/sparse_strips/vello_hybrid/Cargo.toml
index d2d6836..65ce9dc 100644
--- a/sparse_strips/vello_hybrid/Cargo.toml
+++ b/sparse_strips/vello_hybrid/Cargo.toml
@@ -49,5 +49,5 @@
[features]
default = ["wgpu"]
-wgpu = ["dep:wgpu"]
-webgl = ["dep:js-sys", "dep:web-sys", "dep:vello_sparse_shaders"]
+wgpu = ["dep:wgpu", "dep:vello_sparse_shaders"]
+webgl = ["dep:js-sys", "dep:web-sys", "dep:vello_sparse_shaders", "vello_sparse_shaders/glsl"]
diff --git a/sparse_strips/vello_hybrid/src/render/wgpu.rs b/sparse_strips/vello_hybrid/src/render/wgpu.rs
index aaa5ebe..d3db90c 100644
--- a/sparse_strips/vello_hybrid/src/render/wgpu.rs
+++ b/sparse_strips/vello_hybrid/src/render/wgpu.rs
@@ -227,16 +227,12 @@
let strip_shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
label: Some("Strip Shader"),
- source: wgpu::ShaderSource::Wgsl(
- include_str!("../../../vello_sparse_shaders/shaders/render_strips.wgsl").into(),
- ),
+ source: wgpu::ShaderSource::Wgsl(vello_sparse_shaders::wgsl::RENDER_STRIPS.into()),
});
let clear_shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
label: Some("Clear Slots Shader"),
- source: wgpu::ShaderSource::Wgsl(
- include_str!("../../../vello_sparse_shaders/shaders/clear_slots.wgsl").into(),
- ),
+ source: wgpu::ShaderSource::Wgsl(vello_sparse_shaders::wgsl::CLEAR_SLOTS.into()),
});
let strip_pipeline_layout =
diff --git a/sparse_strips/vello_sparse_shaders/Cargo.toml b/sparse_strips/vello_sparse_shaders/Cargo.toml
index 50a54d6..6123c54 100644
--- a/sparse_strips/vello_sparse_shaders/Cargo.toml
+++ b/sparse_strips/vello_sparse_shaders/Cargo.toml
@@ -17,10 +17,13 @@
targets = []
[dependencies]
-naga = { version = "24.0.0", features = ["wgsl-in", "glsl-out"] }
+naga = { version = "24.0.0", features = ["wgsl-in", "glsl-out"], optional = true }
[build-dependencies]
-naga = { version = "24.0.0", features = ["wgsl-in", "glsl-out"] }
+naga = { version = "24.0.0", features = ["wgsl-in", "glsl-out"], optional = true }
+
+[features]
+glsl = ["dep:naga"]
[lints]
workspace = true
diff --git a/sparse_strips/vello_sparse_shaders/build.rs b/sparse_strips/vello_sparse_shaders/build.rs
index fda04fd..90218ef 100644
--- a/sparse_strips/vello_sparse_shaders/build.rs
+++ b/sparse_strips/vello_sparse_shaders/build.rs
@@ -9,12 +9,15 @@
use std::path::{Path, PathBuf};
#[allow(warnings)]
+#[cfg(feature = "glsl")]
#[path = "src/compile.rs"]
mod compile;
#[allow(warnings)]
+#[cfg(feature = "glsl")]
#[path = "src/types.rs"]
mod types;
+#[cfg(feature = "glsl")]
use compile::compile_wgsl_shader;
// TODO: Format the generated code via `rustfmt`.
@@ -22,7 +25,6 @@
fn main() {
// Rerun build if the shaders directory changes
println!("cargo:rerun-if-changed=shaders");
-
let out_dir = env::var_os("OUT_DIR").unwrap();
// Build outputs a `compiled_shaders.rs` module containing the GLSL source and reflection
// metadata.
@@ -63,18 +65,45 @@
"// Generated code by `vello_sparse_shaders` - DO NOT EDIT"
)
.unwrap();
- writeln!(
- buf,
- "/// Build time GLSL shaders derived from wgsl shaders."
- )
- .unwrap();
+
+ writeln!(buf, "/// Re-exporting wgsl shader source code.").unwrap();
+
+ writeln!(buf, "pub mod wgsl {{").unwrap();
+ for (shader_name, shader_source) in shader_infos {
+ generate_wgsl_shader_module(buf, shader_name, shader_source).unwrap();
+ }
+ writeln!(buf, "}}").unwrap();
// Implementation for creating a CompiledGlsl struct per shader assuming the standard entry
// names of `vs_main` and `fs_main`.
- for (shader_name, shader_source) in shader_infos {
- let compiled = compile_wgsl_shader(shader_source, "vs_main", "fs_main");
+ #[cfg(feature = "glsl")]
+ {
+ writeln!(
+ buf,
+ "/// Build time GLSL shaders derived from wgsl shaders."
+ )
+ .unwrap();
- let generated_code = compiled.to_generated_code(shader_name);
- writeln!(buf, "{generated_code}").unwrap();
+ for (shader_name, shader_source) in shader_infos {
+ let compiled = compile_wgsl_shader(shader_source, "vs_main", "fs_main");
+
+ let generated_code = compiled.to_generated_code(shader_name);
+ writeln!(buf, "{generated_code}").unwrap();
+ }
}
}
+
+fn generate_wgsl_shader_module<T: Write>(
+ buf: &mut T,
+ shader_name: &str,
+ shader_source: &str,
+) -> std::fmt::Result {
+ let const_name = shader_name.to_uppercase();
+ writeln!(buf, " /// Source for `{shader_name}.wgsl`")?;
+ writeln!(
+ buf,
+ " pub const {const_name}: &str = r###\"{shader_source}\"###;"
+ )?;
+
+ Ok(())
+}
diff --git a/sparse_strips/vello_sparse_shaders/src/lib.rs b/sparse_strips/vello_sparse_shaders/src/lib.rs
index 75e9ac2..6932063 100644
--- a/sparse_strips/vello_sparse_shaders/src/lib.rs
+++ b/sparse_strips/vello_sparse_shaders/src/lib.rs
@@ -3,7 +3,9 @@
//! This is a utility library to help integrate `vello_hybrid` WebGPU wgsl shaders into glsl.
+#[cfg(feature = "glsl")]
mod compile;
+#[cfg(feature = "glsl")]
mod types;
include!(concat!(env!("OUT_DIR"), "/compiled_shaders.rs"));
diff --git a/sparse_strips/vello_sparse_shaders/src/types.rs b/sparse_strips/vello_sparse_shaders/src/types.rs
index 06b3ee0..03fa15c 100644
--- a/sparse_strips/vello_sparse_shaders/src/types.rs
+++ b/sparse_strips/vello_sparse_shaders/src/types.rs
@@ -79,7 +79,7 @@
pub(crate) fn to_generated_code(&self, shader_name: &str) -> String {
let mut code = format!("/// Compiled glsl for `{shader_name}.wgsl`\n");
code.push_str(&format!("pub mod {shader_name} {{\n"));
- code.push_str(r#" #![allow(missing_docs, reason="No metadata to generate precise documentation forgenerated code.")]"#);
+ code.push_str(r#" #![allow(missing_docs, reason="No metadata to generate precise documentation for generated code.")]"#);
code.push_str("\n\n");
code.push_str(" pub const VERTEX_SOURCE: &str = r###\"");