Move validate code to separate crate

This commit is contained in:
Maximilian Ammann 2021-12-08 18:12:38 +01:00
parent 95f6447108
commit 7998a5aeaa
6 changed files with 121 additions and 87 deletions

2
.gitignore vendored
View File

@ -13,4 +13,4 @@ Cargo.lock
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb
**/test-data
**/test-data

20
Cargo.lock generated
View File

@ -1217,17 +1217,17 @@ dependencies = [
"log",
"lyon",
"lyon_path",
"naga",
"pollster",
"serde",
"serde_json",
"style-spec",
"test-env-log",
"vector-tile",
"walkdir",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"wgpu",
"wgsl-validate",
"winit",
]
@ -2021,6 +2021,14 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
[[package]]
name = "style-spec"
version = "0.1.0"
dependencies = [
"log",
"serde_json",
]
[[package]]
name = "svgtypes"
version = "0.5.0"
@ -2411,6 +2419,14 @@ dependencies = [
"bitflags",
]
[[package]]
name = "wgsl-validate"
version = "0.1.0"
dependencies = [
"naga",
"walkdir",
]
[[package]]
name = "winapi"
version = "0.3.9"

View File

@ -4,9 +4,10 @@ version = "0.1.0"
authors = ["Maximilian Ammann <max@maxammann.org>"]
edition = "2021"
resolver = "2"
build = "build.rs"
[features]
web-webgl = [ "wgpu/webgl" ]
web-webgl = ["wgpu/webgl"]
[target.'cfg(target_arch = "wasm32")'.dependencies]
console_error_panic_hook = "0.1"
@ -16,7 +17,7 @@ js-sys = "0.3"
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
console_log = { version = "0.2", features = ["color"] }
instant = { version = "0.1", features = [ "stdweb" ] }
instant = { version = "0.1", features = ["stdweb"] }
[dependencies]
# Futures
@ -25,6 +26,7 @@ pollster = "0.2"
# Vector riles
vector-tile = { path = "libs/vector_tile" }
style-spec = { path = "libs/style_spec" }
geo = "0.18.0"
geo-types = "0.7"
# proj = "0.24" FIXME: Incompatible with wasm
@ -57,9 +59,7 @@ criterion = "0.3"
test-env-log = "0.2"
[build-dependencies]
naga = { version = "0.7", features = ["wgsl-in"] }
walkdir = "2.3"
wgsl-validate = { path = "libs/wgsl_validate" }
[[bin]]
name = "mapr"

View File

@ -1,82 +1,5 @@
use std::env;
use std::path::Path;
use std::process::exit;
use naga::front::wgsl;
use naga::valid::{Capabilities, ValidationFlags, Validator};
use naga::{front::wgsl::ParseError, valid::ValidationError};
use walkdir::WalkDir;
#[derive(Debug)]
pub enum WgslError {
ValidationErr(ValidationError),
ParserErr {
error: String,
line: usize,
pos: usize,
},
IoErr(std::io::Error),
}
impl From<std::io::Error> for WgslError {
fn from(err: std::io::Error) -> Self {
Self::IoErr(err)
}
}
impl WgslError {
pub fn from_parse_err(err: ParseError, src: &str) -> Self {
let (line, pos) = err.location(src);
let error = err.emit_to_string(src);
Self::ParserErr { error, line, pos }
}
}
pub fn validate_wgsl(validator: &mut Validator, path: &Path) -> Result<(), WgslError> {
let shader = std::fs::read_to_string(&path).map_err(WgslError::from)?;
let module = wgsl::parse_str(&shader).map_err(|err| WgslError::from_parse_err(err, &shader))?;
if let Err(err) = validator.validate(&module) {
Err(WgslError::ValidationErr(err))
} else {
Ok(())
}
}
use wgsl_validate::validate_project_wgsl;
fn main() {
let mut validator = Validator::new(ValidationFlags::all(), Capabilities::all());
let root_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let dir_walk = WalkDir::new(&root_dir);
let dir_walk = dir_walk.into_iter().filter_entry(|e| {
let path = e.path();
if !path.is_dir() {
path.extension().map(|ext| &*ext == "wgsl").unwrap_or(false)
} else {
true
}
});
for entry in dir_walk {
match entry {
Ok(entry) => {
let path = entry.path();
if !path.is_dir() {
match validate_wgsl(&mut validator, &path) {
Ok(_) => {}
Err(err) => {
let path = path.strip_prefix(&root_dir).unwrap_or(path);
println!("cargo:warning=Error ({:?}): {:?}", path, err);
exit(1);
}
};
}
}
Err(err) => {
println!("cargo:warning=Error: {:?}", err);
exit(1);
}
}
}
validate_project_wgsl();
}

View File

@ -0,0 +1,11 @@
[package]
name = "wgsl-validate"
version = "0.1.0"
description = "A library for validating WGSL shaders"
readme = "README.md"
categories = ["encoding"]
edition = "2021"
[dependencies]
naga = { version = "0.7", features = ["wgsl-in"] }
walkdir = "2.3"

View File

@ -0,0 +1,84 @@
use std::env;
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
use std::process::exit;
use naga::front::wgsl;
use naga::valid::{Capabilities, ValidationFlags, Validator};
use naga::{front::wgsl::ParseError, valid::ValidationError};
use walkdir::WalkDir;
#[derive(Debug)]
pub enum WgslError {
ValidationErr(ValidationError),
ParserErr {
error: String,
line: usize,
pos: usize,
},
IoErr(std::io::Error),
}
impl From<std::io::Error> for WgslError {
fn from(err: std::io::Error) -> Self {
Self::IoErr(err)
}
}
impl WgslError {
pub fn from_parse_err(err: ParseError, src: &str) -> Self {
let (line, pos) = err.location(src);
let error = err.emit_to_string(src);
Self::ParserErr { error, line, pos }
}
}
fn validate_wgsl(validator: &mut Validator, path: &Path) -> Result<(), WgslError> {
let shader = std::fs::read_to_string(&path).map_err(WgslError::from)?;
let module = wgsl::parse_str(&shader).map_err(|err| WgslError::from_parse_err(err, &shader))?;
if let Err(err) = validator.validate(&module) {
Err(WgslError::ValidationErr(err))
} else {
Ok(())
}
}
pub fn validate_project_wgsl() {
let mut validator = Validator::new(ValidationFlags::all(), Capabilities::all());
let root_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let dir_walk = WalkDir::new(&root_dir);
let dir_walk = dir_walk.into_iter().filter_entry(|e| {
let path = e.path();
if !path.is_dir() {
path.extension().map(|ext| &*ext == "wgsl").unwrap_or(false)
} else {
true
}
});
for entry in dir_walk {
match entry {
Ok(entry) => {
let path = entry.path();
if !path.is_dir() {
match validate_wgsl(&mut validator, &path) {
Ok(_) => {}
Err(err) => {
let path = path.strip_prefix(&root_dir).unwrap_or(path);
println!("cargo:warning=Error ({:?}): {:?}", path, err);
exit(1);
}
};
}
}
Err(err) => {
println!("cargo:warning=Error: {:?}", err);
exit(1);
}
}
}
}