diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index fbbdf69d8e..01a47a3384 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -10,6 +10,7 @@ jobs:
   check:
     name: Test
     strategy:
+      fail-fast: false
       matrix:
         include:
           - os: ubuntu-latest
@@ -82,11 +83,13 @@ jobs:
           # Unset legacy paths:
           echo "ANDROID_NDK_HOME=" >> $env:GITHUB_ENV
           echo "ANDROID_NDK_PATH=" >> $env:GITHUB_ENV
+          # Perform a clean build on Windows.
+          cargo clean --manifest-path examples/runners/wgpu/Cargo.toml
 
       - name: Compile WGPU example for Android
         run: |
           rustup target add aarch64-linux-android
-          cargo apk build --manifest-path examples/runners/wgpu/Cargo.toml --features use-installed-tools --no-default-features
+          cargo apk build --manifest-path examples/runners/wgpu/Cargo.toml
 
   lint:
     name: Lint
diff --git a/.github/workflows/clippy.sh b/.github/workflows/clippy.sh
index eabdd8b69d..b72a75015e 100755
--- a/.github/workflows/clippy.sh
+++ b/.github/workflows/clippy.sh
@@ -29,13 +29,12 @@ function clippy_no_features() {
 
 # Core crates
 clippy crates/rustc_codegen_spirv
-clippy crates/spirv-builder
+clippy_no_features crates/spirv-builder
 
-# Examples
+# Examples		
+clippy_no_features examples/runners/ash		
+clippy_no_features examples/runners/wgpu		
 
-clippy examples/runners/ash
-clippy examples/runners/wgpu
-
-clippy_no_features examples/runners/cpu
-clippy_no_features examples/shaders/sky-shader
+clippy_no_features examples/runners/cpu		
+clippy_no_features examples/shaders/sky-shader		
 clippy_no_features examples/shaders/simplest-shader
diff --git a/.github/workflows/test.sh b/.github/workflows/test.sh
index 33926893f7..8068dbba9e 100755
--- a/.github/workflows/test.sh
+++ b/.github/workflows/test.sh
@@ -11,11 +11,11 @@ os=$1
 
 function cargo_test() {
     echo ::group::"$1 build"
-    cargo test \
+    cargo build \
         --manifest-path "$1/Cargo.toml" \
         --no-default-features \
         --features "$FEAT" \
-        --no-run
+        --tests
     echo ::endgroup::
 
     echo ::group::"$1 test"
@@ -28,26 +28,26 @@ function cargo_test() {
 
 function cargo_test_no_features() {
     echo ::group::"$1 build"
-    cargo test --manifest-path "$1/Cargo.toml" --no-run
+    cargo build --manifest-path $1/Cargo.toml
     echo ::endgroup::
 
     echo ::group::"$1 test"
-    cargo test --manifest-path "$1/Cargo.toml"
+    cargo test --manifest-path $1/Cargo.toml
     echo ::endgroup::
 }
 
-# Core crates
-cargo_test crates/rustc_codegen_spirv
-cargo_test crates/spirv-builder
+# # Core crates
+cargo_test_no_features crates/rustc_codegen_spirv
+cargo_test_no_features crates/spirv-builder
+cargo_test_no_features crates/spirv-std
 
 # Examples
 # See: https://github.com/EmbarkStudios/rust-gpu/issues/84
 if [[ "$os" != "macOS" ]]; then
-    cargo_test examples/runners/ash
+    cargo_test_no_features examples/runners/ash
 fi
 
-cargo_test examples/runners/wgpu
-
+cargo_test_no_features examples/runners/wgpu
 cargo_test_no_features examples/runners/cpu
 cargo_test_no_features examples/shaders/sky-shader
 cargo_test_no_features examples/shaders/simplest-shader
diff --git a/.gitignore b/.gitignore
index 2f7896d1d1..3497f57d4b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 target/
+examples/**/Cargo.lock
diff --git a/Cargo.lock b/Cargo.lock
index df1a02666c..19f88e6192 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,11 +1,5 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-[[package]]
-name = "ab_glyph_rasterizer"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9fe5e32de01730eb1f6b7f5b51c17e03e2325bf40a74f754f04f130043affff"
-
 [[package]]
 name = "aho-corasick"
 version = "0.7.15"
@@ -15,71 +9,20 @@ dependencies = [
  "memchr",
 ]
 
-[[package]]
-name = "andrew"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c4afb09dd642feec8408e33f92f3ffc4052946f6b20f32fb99c1f58cd4fa7cf"
-dependencies = [
- "bitflags",
- "rusttype",
- "walkdir",
- "xdg",
- "xml-rs",
-]
-
 [[package]]
 name = "ansi_term"
 version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
 dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "ansi_term"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
-dependencies = [
- "winapi 0.3.9",
+ "winapi",
 ]
 
 [[package]]
-name = "arrayvec"
-version = "0.5.2"
+name = "anyhow"
+version = "1.0.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
-
-[[package]]
-name = "ash"
-version = "0.31.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c69a8137596e84c22d57f3da1b5de1d4230b1742a710091c85f4d7ce50f00f38"
-dependencies = [
- "libloading",
-]
-
-[[package]]
-name = "ash-molten"
-version = "0.7.2+1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b31c40fe3810300e6a0083a4b8fad1be08f20eb1a4b5b07bfd477e287570f64e"
-dependencies = [
- "ash",
-]
-
-[[package]]
-name = "ash-window"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "905c4ca25f752e7ab3c3e8f2882625f876e4c3ea5feffbc83f81d697e043afd6"
-dependencies = [
- "ash",
- "raw-window-handle",
- "raw-window-metal",
-]
+checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7"
 
 [[package]]
 name = "atty"
@@ -89,15 +32,9 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
 dependencies = [
  "hermit-abi",
  "libc",
- "winapi 0.3.9",
+ "winapi",
 ]
 
-[[package]]
-name = "autocfg"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
-
 [[package]]
 name = "autocfg"
 version = "1.0.1"
@@ -110,39 +47,12 @@ version = "0.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3528c4b6f81eb2aadd3504da4ddc5bf5caec1b4aaf0d9dccfb8aaf2850f5b39c"
 
-[[package]]
-name = "bit-set"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
-dependencies = [
- "bit-vec",
-]
-
-[[package]]
-name = "bit-vec"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3"
-
 [[package]]
 name = "bitflags"
 version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
 
-[[package]]
-name = "block"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
-
-[[package]]
-name = "bumpalo"
-version = "3.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820"
-
 [[package]]
 name = "byteorder"
 version = "1.3.4"
@@ -150,20 +60,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
 
 [[package]]
-name = "calloop"
-version = "0.6.5"
+name = "cargo-sysroot"
+version = "0.8.0-alpha"
+source = "git+https://github.com/XAMPPRocky/cargo-sysroot?branch=main#bd9e5d53508b6e9e0d0de5ac43795bd199da41a5"
+dependencies = [
+ "anyhow",
+ "cargo-toml2",
+ "fs_extra",
+ "remove_dir_all 0.6.1",
+ "structopt",
+]
+
+[[package]]
+name = "cargo-toml2"
+version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b036167e76041694579972c28cf4877b4f92da222560ddb49008937b6a6727c"
+checksum = "22b689b002fa6142753b431e1414d0336065b692e1d0e400504698f75997817d"
 dependencies = [
- "log",
- "nix 0.18.0",
+ "serde",
+ "serde_derive",
+ "toml",
 ]
 
 [[package]]
 name = "cc"
-version = "1.0.62"
+version = "1.0.65"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1770ced377336a88a67c473594ccc14eca6f4559217c34f64aac8f83d641b40"
+checksum = "95752358c8f7552394baf48cd82695b345628ad3f170d607de3ca03b8dacca15"
 dependencies = [
  "jobserver",
 ]
@@ -180,2895 +103,1010 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
-[[package]]
-name = "chrono"
-version = "0.4.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
-dependencies = [
- "libc",
- "num-integer",
- "num-traits",
- "time",
- "winapi 0.3.9",
-]
-
 [[package]]
 name = "clap"
 version = "2.33.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
 dependencies = [
- "ansi_term 0.11.0",
+ "ansi_term",
  "atty",
  "bitflags",
- "strsim 0.8.0",
- "textwrap 0.11.0",
+ "strsim",
+ "textwrap",
  "unicode-width",
  "vec_map",
 ]
 
 [[package]]
-name = "clap"
-version = "3.0.0-beta.2"
+name = "const_fn"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142"
-dependencies = [
- "atty",
- "bitflags",
- "clap_derive",
- "indexmap",
- "lazy_static",
- "os_str_bytes",
- "strsim 0.10.0",
- "termcolor",
- "textwrap 0.12.1",
- "unicode-width",
- "vec_map",
-]
+checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab"
 
 [[package]]
-name = "clap_derive"
-version = "3.0.0-beta.2"
+name = "crossbeam-channel"
+version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1"
+checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
 dependencies = [
- "heck",
- "proc-macro-error",
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
 ]
 
 [[package]]
-name = "cloudabi"
-version = "0.0.3"
+name = "crossbeam-channel"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
 dependencies = [
- "bitflags",
+ "cfg-if 1.0.0",
+ "crossbeam-utils 0.8.1",
 ]
 
 [[package]]
-name = "cloudabi"
-version = "0.1.0"
+name = "crossbeam-deque"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467"
+checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
 dependencies = [
- "bitflags",
+ "cfg-if 1.0.0",
+ "crossbeam-epoch",
+ "crossbeam-utils 0.8.1",
 ]
 
 [[package]]
-name = "cocoa"
-version = "0.20.2"
+name = "crossbeam-epoch"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c49e86fc36d5704151f5996b7b3795385f50ce09e3be0f47a0cfde869681cf8"
+checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d"
 dependencies = [
- "bitflags",
- "block",
- "core-foundation 0.7.0",
- "core-graphics 0.19.2",
- "foreign-types",
- "libc",
- "objc",
+ "cfg-if 1.0.0",
+ "const_fn",
+ "crossbeam-utils 0.8.1",
+ "lazy_static",
+ "memoffset",
+ "scopeguard",
 ]
 
 [[package]]
-name = "cocoa"
-version = "0.23.0"
+name = "crossbeam-utils"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c54201c07dcf3a5ca33fececb8042aed767ee4bfd5a0235a8ceabcda956044b2"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
 dependencies = [
- "bitflags",
- "block",
- "cocoa-foundation",
- "core-foundation 0.9.1",
- "core-graphics 0.22.1",
- "foreign-types",
- "libc",
- "objc",
+ "autocfg",
+ "cfg-if 0.1.10",
+ "lazy_static",
 ]
 
 [[package]]
-name = "cocoa-foundation"
-version = "0.1.0"
+name = "crossbeam-utils"
+version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
-dependencies = [
- "bitflags",
- "block",
- "core-foundation 0.9.1",
- "core-graphics-types",
- "foreign-types",
- "libc",
- "objc",
-]
-
-[[package]]
-name = "compute-shader"
-version = "0.1.0"
+checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"
 dependencies = [
- "spirv-std",
+ "autocfg",
+ "cfg-if 1.0.0",
+ "lazy_static",
 ]
 
 [[package]]
-name = "console_error_panic_hook"
-version = "0.1.6"
+name = "ctor"
+version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211"
+checksum = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484"
 dependencies = [
- "cfg-if 0.1.10",
- "wasm-bindgen",
+ "quote 1.0.7",
+ "syn 1.0.53",
 ]
 
 [[package]]
-name = "console_log"
-version = "0.2.0"
+name = "derive_more"
+version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494"
+checksum = "7a141330240c921ec6d074a3e188a7c7ef95668bb95e7d44fa0e5778ec2a7afe"
 dependencies = [
- "log",
- "web-sys",
+ "lazy_static",
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "regex",
+ "rustc_version",
+ "syn 0.15.44",
 ]
 
 [[package]]
-name = "const_fn"
-version = "0.4.3"
+name = "difference"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab"
+checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
 
 [[package]]
-name = "copyless"
-version = "0.1.5"
+name = "either"
+version = "1.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
 
 [[package]]
-name = "core-foundation"
-version = "0.7.0"
+name = "eyre"
+version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171"
+checksum = "5f29abf4740a4778632fe27a4f681ef5b7a6f659aeba3330ac66f48e20cfa3b7"
 dependencies = [
- "core-foundation-sys 0.7.0",
- "libc",
+ "indenter",
+ "once_cell",
 ]
 
 [[package]]
-name = "core-foundation"
-version = "0.9.1"
+name = "filetime"
+version = "0.2.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62"
+checksum = "0c122a393ea57648015bf06fbd3d372378992e86b9ff5a7a497b076a28c79efe"
 dependencies = [
- "core-foundation-sys 0.8.2",
+ "cfg-if 1.0.0",
  "libc",
+ "redox_syscall",
+ "winapi",
 ]
 
 [[package]]
-name = "core-foundation-sys"
-version = "0.7.0"
+name = "form_urlencoded"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac"
+checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00"
+dependencies = [
+ "matches",
+ "percent-encoding",
+]
 
 [[package]]
-name = "core-foundation-sys"
-version = "0.8.2"
+name = "fs_extra"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b"
+checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394"
 
 [[package]]
-name = "core-graphics"
-version = "0.19.2"
+name = "fxhash"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
 dependencies = [
- "bitflags",
- "core-foundation 0.7.0",
- "foreign-types",
- "libc",
+ "byteorder",
 ]
 
 [[package]]
-name = "core-graphics"
-version = "0.22.1"
+name = "getrandom"
+version = "0.1.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc239bba52bab96649441699533a68de294a101533b0270b2d65aa402b29a7f9"
+checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
 dependencies = [
- "bitflags",
- "core-foundation 0.9.1",
- "core-graphics-types",
- "foreign-types",
+ "cfg-if 0.1.10",
  "libc",
+ "wasi",
 ]
 
 [[package]]
-name = "core-graphics-types"
-version = "0.1.1"
+name = "git2"
+version = "0.13.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
+checksum = "ca6f1a0238d7f8f8fd5ee642f4ebac4dbc03e03d1f78fbe7a3ede35dcf7e2224"
 dependencies = [
  "bitflags",
- "core-foundation 0.9.1",
- "foreign-types",
  "libc",
+ "libgit2-sys",
+ "log",
+ "openssl-probe",
+ "openssl-sys",
+ "url",
 ]
 
 [[package]]
-name = "core-video-sys"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828"
+name = "glam"
+version = "0.10.2"
+source = "git+https://github.com/EmbarkStudios/glam-rs?rev=238c449e3a326d7586e707841835c8736b4a418f#238c449e3a326d7586e707841835c8736b4a418f"
 dependencies = [
- "cfg-if 0.1.10",
- "core-foundation-sys 0.7.0",
- "core-graphics 0.19.2",
- "libc",
- "objc",
+ "num-traits",
+ "version_check",
 ]
 
 [[package]]
-name = "crossbeam-channel"
-version = "0.4.4"
+name = "heck"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
+checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
 dependencies = [
- "crossbeam-utils 0.7.2",
- "maybe-uninit",
+ "unicode-segmentation",
 ]
 
 [[package]]
-name = "crossbeam-channel"
-version = "0.5.0"
+name = "hermit-abi"
+version = "0.1.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
+checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
 dependencies = [
- "cfg-if 1.0.0",
- "crossbeam-utils 0.8.0",
+ "libc",
 ]
 
 [[package]]
-name = "crossbeam-deque"
-version = "0.8.0"
+name = "idna"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
+checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
 dependencies = [
- "cfg-if 1.0.0",
- "crossbeam-epoch",
- "crossbeam-utils 0.8.0",
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
 ]
 
 [[package]]
-name = "crossbeam-epoch"
-version = "0.9.0"
+name = "indenter"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0f606a85340376eef0d6d8fec399e6d4a544d648386c6645eb6d0653b27d9f"
-dependencies = [
- "cfg-if 1.0.0",
- "const_fn",
- "crossbeam-utils 0.8.0",
- "lazy_static",
- "memoffset",
- "scopeguard",
-]
+checksum = "e0bd112d44d9d870a6819eb505d04dd92b5e4d94bb8c304924a0872ae7016fb5"
 
 [[package]]
-name = "crossbeam-utils"
-version = "0.7.2"
+name = "itoa"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
-dependencies = [
- "autocfg 1.0.1",
- "cfg-if 0.1.10",
- "lazy_static",
-]
+checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
 
 [[package]]
-name = "crossbeam-utils"
-version = "0.8.0"
+name = "jobserver"
+version = "0.1.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec91540d98355f690a86367e566ecad2e9e579f230230eb7c21398372be73ea5"
+checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
 dependencies = [
- "autocfg 1.0.1",
- "cfg-if 1.0.0",
- "const_fn",
- "lazy_static",
+ "libc",
 ]
 
 [[package]]
-name = "ctor"
-version = "0.1.16"
+name = "lazy_static"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484"
-dependencies = [
- "quote 1.0.7",
- "syn 1.0.48",
-]
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
 [[package]]
-name = "d3d12"
-version = "0.3.2"
+name = "libc"
+version = "0.2.80"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0a60cceb22c7c53035f8980524fdc7f17cf49681a3c154e6757d30afbec6ec4"
-dependencies = [
- "bitflags",
- "libloading",
- "winapi 0.3.9",
-]
+checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
 
 [[package]]
-name = "darling"
-version = "0.10.2"
+name = "libgit2-sys"
+version = "0.12.14+1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
+checksum = "8f25af58e6495f7caf2919d08f212de550cfa3ed2f5e744988938ea292b9f549"
 dependencies = [
- "darling_core",
- "darling_macro",
-]
+ "cc",
+ "libc",
+ "libssh2-sys",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+]
 
 [[package]]
-name = "darling_core"
-version = "0.10.2"
+name = "libm"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
-dependencies = [
- "fnv",
- "ident_case",
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "strsim 0.9.3",
- "syn 1.0.48",
-]
+checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
 
 [[package]]
-name = "darling_macro"
-version = "0.10.2"
+name = "libssh2-sys"
+version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
+checksum = "df40b13fe7ea1be9b9dffa365a51273816c345fc1811478b57ed7d964fbfc4ce"
 dependencies = [
- "darling_core",
- "quote 1.0.7",
- "syn 1.0.48",
+ "cc",
+ "libc",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+ "vcpkg",
 ]
 
 [[package]]
-name = "derivative"
-version = "2.1.1"
+name = "libz-sys"
+version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb582b60359da160a9477ee80f15c8d784c477e69c217ef2cdd4169c24ea380f"
+checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655"
 dependencies = [
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
 ]
 
 [[package]]
-name = "derive_more"
-version = "0.15.0"
+name = "log"
+version = "0.4.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a141330240c921ec6d074a3e188a7c7ef95668bb95e7d44fa0e5778ec2a7afe"
+checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
 dependencies = [
- "lazy_static",
- "proc-macro2 0.4.30",
- "quote 0.6.13",
- "regex",
- "rustc_version",
- "syn 0.15.44",
+ "cfg-if 0.1.10",
 ]
 
 [[package]]
-name = "difference"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
-
-[[package]]
-name = "dispatch"
-version = "0.2.0"
+name = "matches"
+version = "0.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
 
 [[package]]
-name = "dlib"
-version = "0.4.2"
+name = "maybe-uninit"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b11f15d1e3268f140f68d390637d5e76d849782d971ae7063e0da69fe9709a76"
-dependencies = [
- "libloading",
-]
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
 
 [[package]]
-name = "downcast-rs"
-version = "1.2.0"
+name = "memchr"
+version = "2.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
 
 [[package]]
-name = "either"
-version = "1.6.1"
+name = "memoffset"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
-
-[[package]]
-name = "example-runner-ash"
-version = "0.1.0"
-dependencies = [
- "ash",
- "ash-molten",
- "ash-window",
- "cfg-if 1.0.0",
- "shared",
- "spirv-builder",
- "structopt",
- "winit",
-]
-
-[[package]]
-name = "example-runner-cpu"
-version = "0.1.0"
+checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87"
 dependencies = [
- "minifb",
- "rayon",
- "shared",
- "sky-shader",
- "spirv-std",
+ "autocfg",
 ]
 
 [[package]]
-name = "example-runner-wgpu"
-version = "0.1.0"
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
 dependencies = [
- "cfg-if 1.0.0",
- "clap 3.0.0-beta.2",
- "console_error_panic_hook",
- "console_log",
- "futures",
- "ndk-glue",
- "shared",
- "spirv-builder",
- "strum",
- "wasm-bindgen-futures",
- "web-sys",
- "wgpu",
- "wgpu-subscriber",
- "winit",
+ "autocfg",
+ "libm",
 ]
 
 [[package]]
-name = "filetime"
-version = "0.2.13"
+name = "num_cpus"
+version = "1.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c122a393ea57648015bf06fbd3d372378992e86b9ff5a7a497b076a28c79efe"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
 dependencies = [
- "cfg-if 1.0.0",
+ "hermit-abi",
  "libc",
- "redox_syscall",
- "winapi 0.3.9",
 ]
 
 [[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
+name = "once_cell"
+version = "1.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-dependencies = [
- "foreign-types-shared",
-]
+checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0"
 
 [[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
+name = "openssl-probe"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
 
 [[package]]
-name = "fuchsia-cprng"
-version = "0.1.1"
+name = "openssl-sys"
+version = "0.9.58"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de"
+dependencies = [
+ "autocfg",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
 
 [[package]]
-name = "fuchsia-zircon"
-version = "0.3.3"
+name = "output_vt100"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9"
 dependencies = [
- "bitflags",
- "fuchsia-zircon-sys",
+ "winapi",
 ]
 
 [[package]]
-name = "fuchsia-zircon-sys"
-version = "0.3.3"
+name = "percent-encoding"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
 
 [[package]]
-name = "futures"
-version = "0.3.8"
+name = "pipe"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b3b0c040a1fe6529d30b3c5944b280c7f0dcb2930d2c3062bca967b602583d0"
+checksum = "bcd11e042e056991b5df9c0c5ae6bd0cce219b74294c40f65b89f40f7030106c"
 dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
+ "crossbeam-channel 0.4.4",
 ]
 
 [[package]]
-name = "futures-channel"
-version = "0.3.8"
+name = "pkg-config"
+version = "0.3.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b7109687aa4e177ef6fe84553af6280ef2778bdb7783ba44c9dc3399110fe64"
-dependencies = [
- "futures-core",
- "futures-sink",
-]
+checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
 
 [[package]]
-name = "futures-core"
-version = "0.3.8"
+name = "ppv-lite86"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748"
+checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
 
 [[package]]
-name = "futures-executor"
-version = "0.3.8"
+name = "pretty_assertions"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4caa2b2b68b880003057c1dd49f1ed937e38f22fcf6c212188a121f08cf40a65"
+checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427"
 dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
+ "ansi_term",
+ "ctor",
+ "difference",
+ "output_vt100",
 ]
 
 [[package]]
-name = "futures-io"
-version = "0.3.8"
+name = "proc-macro-error"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2 1.0.24",
+ "quote 1.0.7",
+ "syn 1.0.53",
+ "version_check",
+]
 
 [[package]]
-name = "futures-macro"
-version = "0.3.8"
+name = "proc-macro-error-attr"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
 dependencies = [
- "proc-macro-hack",
  "proc-macro2 1.0.24",
  "quote 1.0.7",
- "syn 1.0.48",
+ "version_check",
 ]
 
 [[package]]
-name = "futures-sink"
-version = "0.3.8"
+name = "proc-macro2"
+version = "0.4.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f878195a49cee50e006b02b93cf7e0a95a38ac7b776b4c4d9cc1207cd20fcb3d"
+checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+dependencies = [
+ "unicode-xid 0.1.0",
+]
 
 [[package]]
-name = "futures-task"
-version = "0.3.8"
+name = "proc-macro2"
+version = "1.0.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d"
+checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
 dependencies = [
- "once_cell",
+ "unicode-xid 0.2.1",
 ]
 
 [[package]]
-name = "futures-util"
-version = "0.3.8"
+name = "quote"
+version = "0.6.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2"
+checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
 dependencies = [
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-macro",
- "futures-sink",
- "futures-task",
- "memchr",
- "pin-project",
- "pin-utils",
- "proc-macro-hack",
- "proc-macro-nested",
- "slab",
+ "proc-macro2 0.4.30",
 ]
 
 [[package]]
-name = "fxhash"
-version = "0.2.1"
+name = "quote"
+version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
 dependencies = [
- "byteorder",
+ "proc-macro2 1.0.24",
 ]
 
 [[package]]
-name = "generator"
-version = "0.6.23"
+name = "rand"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cdc09201b2e8ca1b19290cf7e65de2246b8e91fb6874279722189c4de7b94dc"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
 dependencies = [
- "cc",
+ "getrandom",
  "libc",
- "log",
- "rustc_version",
- "winapi 0.3.9",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
 ]
 
 [[package]]
-name = "getrandom"
-version = "0.1.15"
+name = "rand_chacha"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
 dependencies = [
- "cfg-if 0.1.10",
- "libc",
- "wasi 0.9.0+wasi-snapshot-preview1",
+ "ppv-lite86",
+ "rand_core",
 ]
 
 [[package]]
-name = "gfx-auxil"
-version = "0.7.0"
+name = "rand_core"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07cd956b592970f08545b9325b87580eb95a51843b6f39da27b8667fec1a1216"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
 dependencies = [
- "fxhash",
- "gfx-hal",
- "spirv_cross",
+ "getrandom",
 ]
 
 [[package]]
-name = "gfx-backend-dx11"
-version = "0.6.15"
+name = "rand_hc"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52b0c3b8b2e0a60c1380a7c27652cd86b791e5d8312fb9592a7a59bd437e9532"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
 dependencies = [
- "arrayvec",
- "bitflags",
- "gfx-auxil",
- "gfx-hal",
- "libloading",
- "log",
- "parking_lot",
- "range-alloc",
- "raw-window-handle",
- "smallvec",
- "spirv_cross",
- "thunderdome",
- "winapi 0.3.9",
- "wio",
+ "rand_core",
 ]
 
 [[package]]
-name = "gfx-backend-dx12"
-version = "0.6.13"
+name = "raw-string"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "375014deed24d76b03604736dd899f0925158a1a96db90cbefb9cce070f71af7"
-dependencies = [
- "arrayvec",
- "bit-set",
- "bitflags",
- "d3d12",
- "gfx-auxil",
- "gfx-hal",
- "log",
- "range-alloc",
- "raw-window-handle",
- "smallvec",
- "spirv_cross",
- "winapi 0.3.9",
-]
+checksum = "e0501e134c6905fee1f10fed25b0a7e1261bf676cffac9543a7d0730dec01af2"
 
 [[package]]
-name = "gfx-backend-empty"
-version = "0.6.0"
+name = "rayon"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2085227c12b78f6657a900c829f2d0deb46a9be3eaf86844fde263cdc218f77c"
+checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
 dependencies = [
- "gfx-hal",
- "log",
- "raw-window-handle",
+ "autocfg",
+ "crossbeam-deque",
+ "either",
+ "rayon-core",
 ]
 
 [[package]]
-name = "gfx-backend-metal"
-version = "0.6.4"
+name = "rayon-core"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60ba1c77c112e7d35786dbd49ed26f2a76ce53a44bc09fe964935e4e35ed7f2b"
+checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
 dependencies = [
- "arrayvec",
- "bitflags",
- "block",
- "cocoa-foundation",
- "copyless",
- "foreign-types",
- "gfx-auxil",
- "gfx-hal",
+ "crossbeam-channel 0.5.0",
+ "crossbeam-deque",
+ "crossbeam-utils 0.8.1",
  "lazy_static",
- "log",
- "metal",
- "objc",
- "parking_lot",
- "range-alloc",
- "raw-window-handle",
- "smallvec",
- "spirv_cross",
- "storage-map",
+ "num_cpus",
 ]
 
 [[package]]
-name = "gfx-backend-vulkan"
-version = "0.6.5"
+name = "redox_syscall"
+version = "0.1.57"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a3a63cf61067a09b7d1ac480af3cb2ae0c5ede5bed294607bbd814cb1666c45"
-dependencies = [
- "arrayvec",
- "ash",
- "byteorder",
- "core-graphics-types",
- "gfx-hal",
- "inplace_it",
- "lazy_static",
- "log",
- "objc",
- "raw-window-handle",
- "smallvec",
- "winapi 0.3.9",
- "x11",
-]
+checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
 
 [[package]]
-name = "gfx-descriptor"
-version = "0.2.0"
+name = "regex"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd8c7afcd000f279d541a490e27117e61037537279b9342279abf4938fe60c6b"
+checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
 dependencies = [
- "arrayvec",
- "fxhash",
- "gfx-hal",
- "log",
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+ "thread_local",
 ]
 
 [[package]]
-name = "gfx-hal"
-version = "0.6.0"
+name = "regex-syntax"
+version = "0.6.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18d0754f5b7a43915fd7466883b2d1bb0800d7cc4609178d0b27bf143b9e5123"
+checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
 dependencies = [
- "bitflags",
- "raw-window-handle",
+ "winapi",
 ]
 
 [[package]]
-name = "gfx-memory"
-version = "0.2.2"
+name = "remove_dir_all"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dccdda5d2b39412f4ca2cb15c70b5a82783a86b0606f5e985342754c8ed88f05"
+checksum = "d7b19f5c2df95a07275e7224924cc62f76f04525f4fda801473f85e325e81977"
 dependencies = [
- "bit-set",
- "fxhash",
- "gfx-hal",
  "log",
- "slab",
+ "num_cpus",
+ "rayon",
+ "winapi",
 ]
 
 [[package]]
-name = "glam"
-version = "0.10.2"
-source = "git+https://github.com/EmbarkStudios/glam-rs?rev=238c449e3a326d7586e707841835c8736b4a418f#238c449e3a326d7586e707841835c8736b4a418f"
+name = "rspirv"
+version = "0.7.0"
+source = "git+https://github.com/gfx-rs/rspirv.git?rev=01ca0d2e5b667a0e4ff1bc1804511e38f9a08759#01ca0d2e5b667a0e4ff1bc1804511e38f9a08759"
 dependencies = [
+ "derive_more",
+ "fxhash",
  "num-traits",
- "version_check",
+ "spirv_headers",
 ]
 
 [[package]]
-name = "hashbrown"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
-
-[[package]]
-name = "heck"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
-dependencies = [
- "unicode-segmentation",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.1.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "ident_case"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
-
-[[package]]
-name = "indexmap"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2"
-dependencies = [
- "autocfg 1.0.1",
- "hashbrown",
-]
-
-[[package]]
-name = "inplace_it"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd01a2a73f2f399df96b22dc88ea687ef4d76226284e7531ae3c7ee1dc5cb534"
-
-[[package]]
-name = "instant"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb1fc4429a33e1f80d41dc9fea4d108a88bec1de8053878898ae448a0b52f613"
-dependencies = [
- "cfg-if 1.0.0",
- "js-sys",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "iovec"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "itoa"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
-
-[[package]]
-name = "jni-sys"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
-
-[[package]]
-name = "jobserver"
-version = "0.1.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "js-sys"
-version = "0.3.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8"
-dependencies = [
- "wasm-bindgen",
-]
-
-[[package]]
-name = "kernel32-sys"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
-dependencies = [
- "winapi 0.2.8",
- "winapi-build",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "lazycell"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
-
-[[package]]
-name = "libc"
-version = "0.2.80"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
-
-[[package]]
-name = "libloading"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1090080fe06ec2648d0da3881d9453d97e71a45f00eb179af7fdd7e3f686fdb0"
-dependencies = [
- "cfg-if 1.0.0",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "libm"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
-
-[[package]]
-name = "lock_api"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312"
-dependencies = [
- "scopeguard",
-]
-
-[[package]]
-name = "log"
-version = "0.4.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
-dependencies = [
- "cfg-if 0.1.10",
-]
-
-[[package]]
-name = "loom"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0e8460f2f2121162705187214720353c517b97bdfb3494c0b1e33d83ebe4bed"
-dependencies = [
- "cfg-if 0.1.10",
- "generator",
- "scoped-tls",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "malloc_buf"
-version = "0.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "matchers"
-version = "0.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1"
-dependencies = [
- "regex-automata",
-]
-
-[[package]]
-name = "maybe-uninit"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
-
-[[package]]
-name = "memchr"
-version = "2.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
-
-[[package]]
-name = "memmap"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
-dependencies = [
- "libc",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "memoffset"
-version = "0.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa"
-dependencies = [
- "autocfg 1.0.1",
-]
-
-[[package]]
-name = "metal"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c4e8a431536529327e28c9ba6992f2cb0c15d4222f0602a16e6d7695ff3bccf"
-dependencies = [
- "bitflags",
- "block",
- "cocoa-foundation",
- "foreign-types",
- "log",
- "objc",
-]
-
-[[package]]
-name = "minifb"
-version = "0.19.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eb411a297b8f714800f085846cbda55fbd2ae17ecd381f1b4652af0e5bebe63"
-dependencies = [
- "cc",
- "orbclient",
- "raw-window-handle",
- "tempfile",
- "wayland-client 0.27.0",
- "wayland-cursor 0.27.0",
- "wayland-protocols 0.27.0",
- "winapi 0.3.9",
- "x11-dl",
- "xkb",
- "xkbcommon-sys",
-]
-
-[[package]]
-name = "mio"
-version = "0.6.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430"
-dependencies = [
- "cfg-if 0.1.10",
- "fuchsia-zircon",
- "fuchsia-zircon-sys",
- "iovec",
- "kernel32-sys",
- "libc",
- "log",
- "miow",
- "net2",
- "slab",
- "winapi 0.2.8",
-]
-
-[[package]]
-name = "mio-extras"
-version = "2.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
-dependencies = [
- "lazycell",
- "log",
- "mio",
- "slab",
-]
-
-[[package]]
-name = "miow"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
-dependencies = [
- "kernel32-sys",
- "net2",
- "winapi 0.2.8",
- "ws2_32-sys",
-]
-
-[[package]]
-name = "naga"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0873deb76cf44b7454fba7b2ba6a89d3de70c08aceffd2c489379b3d9d08e661"
-dependencies = [
- "bitflags",
- "fxhash",
- "log",
- "num-traits",
- "spirv_headers 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "thiserror",
-]
-
-[[package]]
-name = "ndk"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5eb167c1febed0a496639034d0c76b3b74263636045db5489eee52143c246e73"
-dependencies = [
- "jni-sys",
- "ndk-sys",
- "num_enum",
- "thiserror",
-]
-
-[[package]]
-name = "ndk-glue"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdf399b8b7a39c6fb153c4ec32c72fd5fe789df24a647f229c239aa7adb15241"
-dependencies = [
- "lazy_static",
- "libc",
- "log",
- "ndk",
- "ndk-macro",
- "ndk-sys",
-]
-
-[[package]]
-name = "ndk-macro"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d"
-dependencies = [
- "darling",
- "proc-macro-crate",
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
-]
-
-[[package]]
-name = "ndk-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d"
-
-[[package]]
-name = "net2"
-version = "0.2.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ebc3ec692ed7c9a255596c67808dee269f64655d8baf7b4f0638e51ba1d6853"
-dependencies = [
- "cfg-if 0.1.10",
- "libc",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "nix"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363"
-dependencies = [
- "bitflags",
- "cc",
- "cfg-if 0.1.10",
- "libc",
- "void",
-]
-
-[[package]]
-name = "nix"
-version = "0.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055"
-dependencies = [
- "bitflags",
- "cc",
- "cfg-if 0.1.10",
- "libc",
-]
-
-[[package]]
-name = "nom"
-version = "5.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
-dependencies = [
- "memchr",
- "version_check",
-]
-
-[[package]]
-name = "num"
-version = "0.1.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e"
-dependencies = [
- "num-integer",
- "num-iter",
- "num-traits",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
-dependencies = [
- "autocfg 1.0.1",
- "num-traits",
-]
-
-[[package]]
-name = "num-iter"
-version = "0.1.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
-dependencies = [
- "autocfg 1.0.1",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
-dependencies = [
- "autocfg 1.0.1",
- "libm",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
-dependencies = [
- "hermit-abi",
- "libc",
-]
-
-[[package]]
-name = "num_enum"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca565a7df06f3d4b485494f25ba05da1435950f4dc263440eda7a6fa9b8e36e4"
-dependencies = [
- "derivative",
- "num_enum_derive",
-]
-
-[[package]]
-name = "num_enum_derive"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d"
-dependencies = [
- "proc-macro-crate",
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
-]
-
-[[package]]
-name = "objc"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
-dependencies = [
- "malloc_buf",
- "objc_exception",
-]
-
-[[package]]
-name = "objc_exception"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0"
-
-[[package]]
-name = "orbclient"
-version = "0.3.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8b18f57ab94fbd058e30aa57f712ec423c0bb7403f8493a6c58eef0c36d9402"
-dependencies = [
- "redox_syscall",
- "sdl2",
-]
-
-[[package]]
-name = "os_str_bytes"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85"
-
-[[package]]
-name = "output_vt100"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "owned_ttf_parser"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f923fb806c46266c02ab4a5b239735c144bdeda724a50ed058e5226f594cde3"
-dependencies = [
- "ttf-parser",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b"
-dependencies = [
- "cfg-if 0.1.10",
- "cloudabi 0.1.0",
- "instant",
- "libc",
- "redox_syscall",
- "smallvec",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
-
-[[package]]
-name = "pin-project"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee41d838744f60d959d7074e3afb6b35c7456d0f61cad38a24e35e6553f73841"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81a4ffa594b66bff340084d4081df649a7dc049ac8d7fc458d8e628bfbbb2f86"
-dependencies = [
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "pipe"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcd11e042e056991b5df9c0c5ae6bd0cce219b74294c40f65b89f40f7030106c"
-dependencies = [
- "crossbeam-channel 0.4.4",
-]
-
-[[package]]
-name = "pkg-config"
-version = "0.3.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
-
-[[package]]
-name = "pretty_assertions"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427"
-dependencies = [
- "ansi_term 0.11.0",
- "ctor",
- "difference",
- "output_vt100",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
-dependencies = [
- "toml",
-]
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-hack"
-version = "0.5.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
-
-[[package]]
-name = "proc-macro-nested"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a"
-
-[[package]]
-name = "proc-macro2"
-version = "0.4.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
-dependencies = [
- "unicode-xid 0.1.0",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
-dependencies = [
- "unicode-xid 0.2.1",
-]
-
-[[package]]
-name = "quote"
-version = "0.6.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
-dependencies = [
- "proc-macro2 0.4.30",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
-dependencies = [
- "proc-macro2 1.0.24",
-]
-
-[[package]]
-name = "rand"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
-dependencies = [
- "autocfg 0.1.7",
- "libc",
- "rand_chacha 0.1.1",
- "rand_core 0.4.2",
- "rand_hc 0.1.0",
- "rand_isaac",
- "rand_jitter",
- "rand_os",
- "rand_pcg",
- "rand_xorshift",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "rand"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
-dependencies = [
- "getrandom",
- "libc",
- "rand_chacha 0.2.2",
- "rand_core 0.5.1",
- "rand_hc 0.2.0",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
-dependencies = [
- "autocfg 0.1.7",
- "rand_core 0.3.1",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
-dependencies = [
- "rand_core 0.4.2",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
-
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-dependencies = [
- "getrandom",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
-dependencies = [
- "rand_core 0.3.1",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-dependencies = [
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_isaac"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
-dependencies = [
- "rand_core 0.3.1",
-]
-
-[[package]]
-name = "rand_jitter"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
-dependencies = [
- "libc",
- "rand_core 0.4.2",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "rand_os"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
-dependencies = [
- "cloudabi 0.0.3",
- "fuchsia-cprng",
- "libc",
- "rand_core 0.4.2",
- "rdrand",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "rand_pcg"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
-dependencies = [
- "autocfg 0.1.7",
- "rand_core 0.4.2",
-]
-
-[[package]]
-name = "rand_xorshift"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
-dependencies = [
- "rand_core 0.3.1",
-]
-
-[[package]]
-name = "range-alloc"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a871f1e45a3a3f0c73fb60343c811238bb5143a81642e27c2ac7aac27ff01a63"
-
-[[package]]
-name = "raw-string"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0501e134c6905fee1f10fed25b0a7e1261bf676cffac9543a7d0730dec01af2"
-
-[[package]]
-name = "raw-window-handle"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "raw-window-metal"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b0f43bdc87adef4ce827b07775c9e59716b52f369696e7fb4ec7c4acb4e20b1"
-dependencies = [
- "cocoa 0.20.2",
- "core-graphics 0.19.2",
- "objc",
- "raw-window-handle",
-]
-
-[[package]]
-name = "rayon"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
-dependencies = [
- "autocfg 1.0.1",
- "crossbeam-deque",
- "either",
- "rayon-core",
-]
-
-[[package]]
-name = "rayon-core"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
-dependencies = [
- "crossbeam-channel 0.5.0",
- "crossbeam-deque",
- "crossbeam-utils 0.8.0",
- "lazy_static",
- "num_cpus",
-]
-
-[[package]]
-name = "rdrand"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
-dependencies = [
- "rand_core 0.3.1",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.1.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
-
-[[package]]
-name = "regex"
-version = "1.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
- "thread_local",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4"
-dependencies = [
- "byteorder",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
-
-[[package]]
-name = "remove_dir_all"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "rspirv"
-version = "0.7.0"
-source = "git+https://github.com/gfx-rs/rspirv.git?rev=01ca0d2e5b667a0e4ff1bc1804511e38f9a08759#01ca0d2e5b667a0e4ff1bc1804511e38f9a08759"
-dependencies = [
- "derive_more",
- "fxhash",
- "num-traits",
- "spirv_headers 1.5.0 (git+https://github.com/gfx-rs/rspirv.git?rev=01ca0d2e5b667a0e4ff1bc1804511e38f9a08759)",
-]
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
-
-[[package]]
-name = "rustc_codegen_spirv"
-version = "0.1.0"
-dependencies = [
- "bimap",
- "pipe",
- "pretty_assertions",
- "rspirv",
- "rustc-demangle",
- "spirv-tools",
- "tar",
- "tempfile",
- "topological-sort",
-]
-
-[[package]]
-name = "rustc_version"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
-dependencies = [
- "semver",
-]
-
-[[package]]
-name = "rusttype"
-version = "0.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc7c727aded0be18c5b80c1640eae0ac8e396abf6fa8477d96cb37d18ee5ec59"
-dependencies = [
- "ab_glyph_rasterizer",
- "owned_ttf_parser",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "scoped-tls"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
-
-[[package]]
-name = "scopeguard"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-
-[[package]]
-name = "sdl2"
-version = "0.32.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d051a07231e303f5f719da78cb6f7394f6d5b54f733aef5b0b447804a83edd7b"
-dependencies = [
- "bitflags",
- "lazy_static",
- "libc",
- "num",
- "rand 0.6.5",
- "sdl2-sys",
-]
-
-[[package]]
-name = "sdl2-sys"
-version = "0.32.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34e71125077d297d57e4c1acfe8981b5bdfbf5a20e7b589abfdcb33bf1127f86"
-dependencies = [
- "cfg-if 0.1.10",
- "libc",
-]
-
-[[package]]
-name = "semver"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
-dependencies = [
- "semver-parser",
-]
-
-[[package]]
-name = "semver-parser"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
-
-[[package]]
-name = "serde"
-version = "1.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e"
-dependencies = [
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.59"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95"
-dependencies = [
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b4921be914e16899a80adefb821f8ddb7974e3f1250223575a44ed994882127"
-dependencies = [
- "lazy_static",
- "loom",
-]
-
-[[package]]
-name = "shared"
-version = "0.1.0"
-dependencies = [
- "spirv-std",
-]
-
-[[package]]
-name = "simplest-shader"
-version = "0.1.0"
-dependencies = [
- "spirv-std",
-]
-
-[[package]]
-name = "sky-shader"
-version = "0.1.0"
-dependencies = [
- "shared",
- "spirv-std",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
-
-[[package]]
-name = "smallvec"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7acad6f34eb9e8a259d3283d1e8c1d34d7415943d4895f65cc73813c7396fc85"
-
-[[package]]
-name = "smithay-client-toolkit"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ec5c077def8af49f9b5aeeb5fcf8079c638c6615c3a8f9305e2dea601de57f7"
-dependencies = [
- "andrew",
- "bitflags",
- "byteorder",
- "calloop",
- "dlib",
- "lazy_static",
- "log",
- "memmap",
- "nix 0.18.0",
- "wayland-client 0.28.2",
- "wayland-cursor 0.28.2",
- "wayland-protocols 0.28.2",
-]
-
-[[package]]
-name = "spirv-builder"
-version = "0.1.0"
-dependencies = [
- "lazy_static",
- "memchr",
- "pretty_assertions",
- "raw-string",
- "rustc_codegen_spirv",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "spirv-std"
-version = "0.1.0"
-dependencies = [
- "glam",
- "num-traits",
-]
-
-[[package]]
-name = "spirv-tools"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c8f9f3a25d16682ec4836cffa89dbadecaa5e3416f19680a8697e32eb58751a"
-dependencies = [
- "memchr",
- "spirv-tools-sys",
- "tempfile",
-]
-
-[[package]]
-name = "spirv-tools-sys"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "723f109c9b1c106ec9a2e6c353e20db4ef4840157e33a1dbf6519dc2a48d6769"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "spirv_cross"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea964c42ce40326fe96111918abe71fa45076da1ea85769f3f1ab1cda9a1d496"
-dependencies = [
- "cc",
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "spirv_headers"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f5b132530b1ac069df335577e3581765995cba5a13995cdbbdbc8fb057c532c"
-dependencies = [
- "bitflags",
- "num-traits",
-]
-
-[[package]]
-name = "spirv_headers"
-version = "1.5.0"
-source = "git+https://github.com/gfx-rs/rspirv.git?rev=01ca0d2e5b667a0e4ff1bc1804511e38f9a08759#01ca0d2e5b667a0e4ff1bc1804511e38f9a08759"
-dependencies = [
- "bitflags",
- "num-traits",
-]
-
-[[package]]
-name = "storage-map"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418bb14643aa55a7841d5303f72cf512cfb323b8cc221d51580500a1ca75206c"
-dependencies = [
- "lock_api",
-]
-
-[[package]]
-name = "strsim"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
-
-[[package]]
-name = "strsim"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
-
-[[package]]
-name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
-[[package]]
-name = "structopt"
-version = "0.3.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "126d630294ec449fae0b16f964e35bf3c74f940da9dca17ee9b905f7b3112eb8"
-dependencies = [
- "clap 2.33.3",
- "lazy_static",
- "structopt-derive",
-]
-
-[[package]]
-name = "structopt-derive"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65e51c492f9e23a220534971ff5afc14037289de430e3c83f9daf6a1b6ae91e8"
-dependencies = [
- "heck",
- "proc-macro-error",
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
-]
-
-[[package]]
-name = "strum"
-version = "0.19.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b89a286a7e3b5720b9a477b23253bc50debac207c8d21505f8e70b36792f11b5"
-dependencies = [
- "strum_macros",
-]
-
-[[package]]
-name = "strum_macros"
-version = "0.19.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e61bb0be289045cb80bfce000512e32d09f8337e54c186725da381377ad1f8d5"
-dependencies = [
- "heck",
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
-]
-
-[[package]]
-name = "syn"
-version = "0.15.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
-dependencies = [
- "proc-macro2 0.4.30",
- "quote 0.6.13",
- "unicode-xid 0.1.0",
-]
-
-[[package]]
-name = "syn"
-version = "1.0.48"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac"
-dependencies = [
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "unicode-xid 0.2.1",
-]
-
-[[package]]
-name = "tar"
-version = "0.4.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "489997b7557e9a43e192c527face4feacc78bfbe6eed67fd55c4c9e381cba290"
-dependencies = [
- "filetime",
- "libc",
- "redox_syscall",
- "xattr",
-]
-
-[[package]]
-name = "tempfile"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
-dependencies = [
- "cfg-if 0.1.10",
- "libc",
- "rand 0.7.3",
- "redox_syscall",
- "remove_dir_all",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "termcolor"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
-dependencies = [
- "thiserror-impl",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
-dependencies = [
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
-]
-
-[[package]]
-name = "thread-id"
-version = "3.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1"
-dependencies = [
- "libc",
- "redox_syscall",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "thunderdome"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7572415bd688d401c52f6e36f4c8e805b9ae1622619303b9fa835d531db0acae"
-
-[[package]]
-name = "time"
-version = "0.1.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
-dependencies = [
- "libc",
- "wasi 0.10.0+wasi-snapshot-preview1",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "toml"
-version = "0.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "topological-sort"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa7c7f42dea4b1b99439786f5633aeb9c14c1b53f75e282803c2ec2ad545873c"
-
-[[package]]
-name = "tracing"
-version = "0.1.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27"
-dependencies = [
- "cfg-if 0.1.10",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada"
-dependencies = [
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9"
-dependencies = [
- "lazy_static",
- "log",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-serde"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b"
-dependencies = [
- "serde",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1fa8f0c8f4c594e4fc9debc1990deab13238077271ba84dd853d54902ee3401"
-dependencies = [
- "ansi_term 0.12.1",
- "chrono",
- "lazy_static",
- "matchers",
- "regex",
- "serde",
- "serde_json",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
- "tracing-serde",
-]
-
-[[package]]
-name = "ttf-parser"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc"
-
-[[package]]
-name = "typed-arena"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae"
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db8716a166f290ff49dabc18b44aa407cb7c6dbe1aa0971b44b8a24b0ca35aae"
-
-[[package]]
-name = "unicode-width"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
-
-[[package]]
-name = "unicode-xid"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
-
-[[package]]
-name = "vec_map"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
-
-[[package]]
-name = "version_check"
-version = "0.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
-
-[[package]]
-name = "void"
-version = "1.0.2"
+name = "rustc-demangle"
+version = "0.1.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
 
 [[package]]
-name = "walkdir"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
+name = "rustc_codegen_spirv"
+version = "0.1.0"
 dependencies = [
- "same-file",
- "winapi 0.3.9",
- "winapi-util",
+ "bimap",
+ "pipe",
+ "pretty_assertions",
+ "rspirv",
+ "rustc-demangle",
+ "spirv-tools",
+ "tar",
+ "tempfile",
+ "topological-sort",
 ]
 
 [[package]]
-name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
+name = "rustc_version"
+version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver",
+]
 
 [[package]]
-name = "wasi"
-version = "0.10.0+wasi-snapshot-preview1"
+name = "ryu"
+version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
 
 [[package]]
-name = "wasm-bindgen"
-version = "0.2.68"
+name = "scopeguard"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42"
-dependencies = [
- "cfg-if 0.1.10",
- "wasm-bindgen-macro",
-]
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
 [[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.68"
+name = "semver"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
 dependencies = [
- "bumpalo",
- "lazy_static",
- "log",
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "syn 1.0.48",
- "wasm-bindgen-shared",
+ "semver-parser",
 ]
 
 [[package]]
-name = "wasm-bindgen-futures"
-version = "0.4.18"
+name = "semver-parser"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7866cab0aa01de1edf8b5d7936938a7e397ee50ce24119aef3e1eaa3b6171da"
-dependencies = [
- "cfg-if 0.1.10",
- "js-sys",
- "wasm-bindgen",
- "web-sys",
-]
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
 [[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.68"
+name = "serde"
+version = "1.0.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038"
+checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
 dependencies = [
- "quote 1.0.7",
- "wasm-bindgen-macro-support",
+ "serde_derive",
 ]
 
 [[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.68"
+name = "serde_derive"
+version = "1.0.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe"
+checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e"
 dependencies = [
  "proc-macro2 1.0.24",
  "quote 1.0.7",
- "syn 1.0.48",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
+ "syn 1.0.53",
 ]
 
 [[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.68"
+name = "serde_json"
+version = "1.0.59"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307"
+checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
 
 [[package]]
-name = "wayland-client"
-version = "0.27.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab702fefbcd6d6f67fb5816e3a89a3b5a42a94290abbc015311c9a30d1068ae4"
+name = "spirv-builder"
+version = "0.1.0"
 dependencies = [
- "bitflags",
- "downcast-rs",
- "libc",
- "nix 0.17.0",
- "wayland-commons 0.27.0",
- "wayland-scanner 0.27.0",
- "wayland-sys 0.27.0",
+ "cargo-sysroot",
+ "eyre",
+ "git2",
+ "lazy_static",
+ "memchr",
+ "pretty_assertions",
+ "raw-string",
+ "remove_dir_all 0.6.1",
+ "rspirv",
+ "serde",
+ "serde_json",
 ]
 
 [[package]]
-name = "wayland-client"
-version = "0.28.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "222b227f47871e47d657c1c5e5360b4af9a877aa9c892716787be1c192c78c42"
+name = "spirv-std"
+version = "0.1.0"
 dependencies = [
- "bitflags",
- "downcast-rs",
- "libc",
- "nix 0.18.0",
- "scoped-tls",
- "wayland-commons 0.28.2",
- "wayland-scanner 0.28.2",
- "wayland-sys 0.28.2",
+ "glam",
+ "num-traits",
 ]
 
 [[package]]
-name = "wayland-commons"
-version = "0.27.0"
+name = "spirv-tools"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e972e9336ad5a9dd861b4e21ff35ad71d3e5c6b4803d65c39913612f851b95f1"
+checksum = "ca2e46e8bb4bf5d0d06aaea116c97787886b083806c9de3b6d22c347ddf3674f"
 dependencies = [
- "nix 0.17.0",
- "once_cell",
- "smallvec",
- "wayland-sys 0.27.0",
+ "memchr",
+ "spirv-tools-sys",
+ "tempfile",
 ]
 
 [[package]]
-name = "wayland-commons"
-version = "0.28.2"
+name = "spirv-tools-sys"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "230b3ffeda101f877ff8ecb8573f5d26e7beb345b197807c4df34ec06879a3e6"
+checksum = "fe1f35217731380e8c0665c3013b63aa34fd528863f8563735e4a052a847fb52"
 dependencies = [
- "nix 0.18.0",
- "once_cell",
- "smallvec",
- "wayland-sys 0.28.2",
+ "cc",
 ]
 
 [[package]]
-name = "wayland-cursor"
-version = "0.27.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "539f346e1a3f706f38c8ccbe1196001e2fb1c9b3e6b605c27d665db2f5b60d41"
+name = "spirv_headers"
+version = "1.5.0"
+source = "git+https://github.com/gfx-rs/rspirv.git?rev=01ca0d2e5b667a0e4ff1bc1804511e38f9a08759#01ca0d2e5b667a0e4ff1bc1804511e38f9a08759"
 dependencies = [
- "nix 0.17.0",
- "wayland-client 0.27.0",
- "xcursor",
+ "bitflags",
+ "num-traits",
 ]
 
 [[package]]
-name = "wayland-cursor"
-version = "0.28.2"
+name = "strsim"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0aad1b4301cdccfb5f64056a4736e8155a5f4734bac41fdbca80b1fdbe1ab3e1"
-dependencies = [
- "nix 0.18.0",
- "wayland-client 0.28.2",
- "xcursor",
-]
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
 
 [[package]]
-name = "wayland-protocols"
-version = "0.27.0"
+name = "structopt"
+version = "0.3.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3d6fc54b17b98b5083bc21ae3a30e6d75cb4b01647360e4c3a04648bcf8781d"
+checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c"
 dependencies = [
- "bitflags",
- "wayland-client 0.27.0",
- "wayland-commons 0.27.0",
- "wayland-scanner 0.27.0",
+ "clap",
+ "lazy_static",
+ "structopt-derive",
 ]
 
 [[package]]
-name = "wayland-protocols"
-version = "0.28.2"
+name = "structopt-derive"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc16a9db803cae58b45f9a84a6cf364434cc49a95c8b1ef98ffeb467d228bdc9"
+checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90"
 dependencies = [
- "bitflags",
- "wayland-client 0.28.2",
- "wayland-commons 0.28.2",
- "wayland-scanner 0.28.2",
+ "heck",
+ "proc-macro-error",
+ "proc-macro2 1.0.24",
+ "quote 1.0.7",
+ "syn 1.0.53",
 ]
 
 [[package]]
-name = "wayland-scanner"
-version = "0.27.0"
+name = "syn"
+version = "0.15.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "030f56009d932bd9400bb472764fea8109be1b0fc482d9cd75496c943ac30328"
+checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
 dependencies = [
- "proc-macro2 1.0.24",
- "quote 1.0.7",
- "xml-rs",
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "unicode-xid 0.1.0",
 ]
 
 [[package]]
-name = "wayland-scanner"
-version = "0.28.2"
+name = "syn"
+version = "1.0.53"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ee5bd43a1d746efc486515fec561e47205f328b74802b959f10f5500f7e56cc"
+checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68"
 dependencies = [
  "proc-macro2 1.0.24",
  "quote 1.0.7",
- "xml-rs",
+ "unicode-xid 0.2.1",
 ]
 
 [[package]]
-name = "wayland-sys"
-version = "0.27.0"
+name = "tar"
+version = "0.4.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bdeffbbb474477dfa2acb45ac7479e5fe8f741c64ab032c5d11b94d07edc269"
+checksum = "489997b7557e9a43e192c527face4feacc78bfbe6eed67fd55c4c9e381cba290"
 dependencies = [
- "pkg-config",
+ "filetime",
+ "libc",
+ "redox_syscall",
+ "xattr",
 ]
 
 [[package]]
-name = "wayland-sys"
-version = "0.28.2"
+name = "tempfile"
+version = "3.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0814adbecc7ea97869971e1d1c1b657e31863dda6fd768f119ad3dc408a01e58"
+checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
 dependencies = [
- "dlib",
- "lazy_static",
- "pkg-config",
+ "cfg-if 0.1.10",
+ "libc",
+ "rand",
+ "redox_syscall",
+ "remove_dir_all 0.5.3",
+ "winapi",
 ]
 
 [[package]]
-name = "web-sys"
-version = "0.3.39"
+name = "textwrap"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bc359e5dd3b46cb9687a051d50a2fdd228e4ba7cf6fcf861a5365c3d671a642"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
 dependencies = [
- "js-sys",
- "wasm-bindgen",
+ "unicode-width",
 ]
 
 [[package]]
-name = "wgpu"
-version = "0.6.0"
+name = "thread_local"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "549160f188eef412ac978499ddf0ceadad4c9159bb1160f9e6b9d4cc8ee977dc"
+checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
 dependencies = [
- "arrayvec",
- "futures",
- "gfx-backend-vulkan",
- "js-sys",
- "objc",
- "parking_lot",
- "raw-window-handle",
- "smallvec",
- "tracing",
- "typed-arena",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "wgpu-core",
- "wgpu-types",
+ "lazy_static",
 ]
 
 [[package]]
-name = "wgpu-core"
-version = "0.6.5"
+name = "tinyvec"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea487deeae90e06d77eb8e6cef945247774e7c0a0a226d238b31e90633594365"
+checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f"
 dependencies = [
- "arrayvec",
- "bitflags",
- "copyless",
- "fxhash",
- "gfx-backend-dx11",
- "gfx-backend-dx12",
- "gfx-backend-empty",
- "gfx-backend-metal",
- "gfx-backend-vulkan",
- "gfx-descriptor",
- "gfx-hal",
- "gfx-memory",
- "naga",
- "parking_lot",
- "raw-window-handle",
- "smallvec",
- "thiserror",
- "tracing",
- "wgpu-types",
-]
-
-[[package]]
-name = "wgpu-subscriber"
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91955b0d6480d86e577bbd0b0d1dd5acd0699c054610dc8673c4c3366295ed27"
-dependencies = [
- "parking_lot",
- "thread-id",
- "tracing",
- "tracing-log",
- "tracing-subscriber",
-]
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
 
 [[package]]
-name = "wgpu-types"
-version = "0.6.1"
+name = "toml"
+version = "0.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e3529528e608b54838ee618c3923b0f46e6db0334cfc6c42a16cf4ceb3bdb57"
+checksum = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645"
 dependencies = [
- "bitflags",
+ "serde",
 ]
 
 [[package]]
-name = "winapi"
-version = "0.2.8"
+name = "topological-sort"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+checksum = "aa7c7f42dea4b1b99439786f5633aeb9c14c1b53f75e282803c2ec2ad545873c"
 
 [[package]]
-name = "winapi"
-version = "0.3.9"
+name = "unicode-bidi"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
 dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
+ "matches",
 ]
 
 [[package]]
-name = "winapi-build"
-version = "0.1.1"
+name = "unicode-normalization"
+version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606"
+dependencies = [
+ "tinyvec",
+]
 
 [[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
+name = "unicode-segmentation"
+version = "1.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
 
 [[package]]
-name = "winapi-util"
-version = "0.1.5"
+name = "unicode-width"
+version = "0.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
-dependencies = [
- "winapi 0.3.9",
-]
+checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
 
 [[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
+name = "unicode-xid"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
 
 [[package]]
-name = "winit"
-version = "0.23.0"
+name = "unicode-xid"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5bc559da567d8aa671bbcd08304d49e982c7bf2cb91e10288b9188931c1b772"
-dependencies = [
- "bitflags",
- "cocoa 0.23.0",
- "core-foundation 0.9.1",
- "core-graphics 0.22.1",
- "core-video-sys",
- "dispatch",
- "instant",
- "lazy_static",
- "libc",
- "log",
- "mio",
- "mio-extras",
- "ndk",
- "ndk-glue",
- "ndk-sys",
- "objc",
- "parking_lot",
- "percent-encoding",
- "raw-window-handle",
- "smithay-client-toolkit",
- "wasm-bindgen",
- "wayland-client 0.28.2",
- "web-sys",
- "winapi 0.3.9",
- "x11-dl",
-]
+checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
 
 [[package]]
-name = "wio"
-version = "0.2.2"
+name = "url"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5"
+checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e"
 dependencies = [
- "winapi 0.3.9",
+ "form_urlencoded",
+ "idna",
+ "matches",
+ "percent-encoding",
 ]
 
 [[package]]
-name = "ws2_32-sys"
-version = "0.2.1"
+name = "vcpkg"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
-dependencies = [
- "winapi 0.2.8",
- "winapi-build",
-]
+checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c"
 
 [[package]]
-name = "x11"
-version = "2.18.2"
+name = "vec_map"
+version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77ecd092546cb16f25783a5451538e73afc8d32e242648d54f4ae5459ba1e773"
-dependencies = [
- "libc",
- "pkg-config",
-]
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
 
 [[package]]
-name = "x11-dl"
-version = "2.18.5"
+name = "version_check"
+version = "0.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bf981e3a5b3301209754218f962052d4d9ee97e478f4d26d4a6eced34c1fef8"
-dependencies = [
- "lazy_static",
- "libc",
- "maybe-uninit",
- "pkg-config",
-]
+checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
 
 [[package]]
-name = "xattr"
-version = "0.2.2"
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
-dependencies = [
- "libc",
-]
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
 
 [[package]]
-name = "xcursor"
-version = "0.3.2"
+name = "winapi"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3a481cfdefd35e1c50073ae33a8000d695c98039544659f5dc5dd71311b0d01"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
 dependencies = [
- "nom",
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
 ]
 
 [[package]]
-name = "xdg"
-version = "2.2.0"
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
 [[package]]
-name = "xkb"
-version = "0.2.1"
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aec02bc5de902aa579f3d2f2c522edaf40fa42963cbaffe645b058ddcc68fdb2"
-dependencies = [
- "bitflags",
- "libc",
- "xkbcommon-sys",
-]
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
 [[package]]
-name = "xkbcommon-sys"
-version = "0.7.4"
+name = "xattr"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa434980dca02ebf28795d71e570dbb78316d095a228707efd6117bf8246d78b"
+checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
 dependencies = [
  "libc",
- "pkg-config",
 ]
-
-[[package]]
-name = "xml-rs"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a"
diff --git a/Cargo.toml b/Cargo.toml
index cc904e6ec7..fbf6a6df6b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,13 +1,7 @@
 [workspace]
 members = [
-    "examples/runners/cpu",
-    "examples/runners/ash",
-    "examples/runners/wgpu",
-    "examples/shaders/sky-shader",
-    "examples/shaders/simplest-shader",
-    "examples/shaders/compute-shader",
-
     "crates/rustc_codegen_spirv",
     "crates/spirv-builder",
     "crates/spirv-std",
 ]
+exclude = ["examples"]
diff --git a/crates/spirv-builder/Cargo.toml b/crates/spirv-builder/Cargo.toml
index 4c1bd46244..998c708194 100644
--- a/crates/spirv-builder/Cargo.toml
+++ b/crates/spirv-builder/Cargo.toml
@@ -5,20 +5,18 @@ authors = ["Embark <opensource@embark-studios.com>"]
 edition = "2018"
 license = "MIT OR Apache-2.0"
 
-# See rustc_codegen_spirv/Cargo.toml for details on these features
-[features]
-default = ["use-compiled-tools"]
-use-installed-tools = ["rustc_codegen_spirv/use-installed-tools"]
-use-compiled-tools = ["rustc_codegen_spirv/use-compiled-tools"]
-
 [dependencies]
 memchr = "2.3"
 raw-string = "0.3.5"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-# See comment in lib.rs invoke_rustc for why this is here
-rustc_codegen_spirv = { path = "../rustc_codegen_spirv", default-features = false }
+# TODO: Update before merge.
+cargo-sysroot = { git = "https://github.com/XAMPPRocky/cargo-sysroot", branch = "main" }
+git2 = "0.13.12"
+eyre = "0.6.2"
+remove_dir_all = "0.6.1"
 
 [dev-dependencies]
 lazy_static = "1.4"
 pretty_assertions = "0.6"
+rspirv = { git = "https://github.com/gfx-rs/rspirv.git", rev = "01ca0d2e5b667a0e4ff1bc1804511e38f9a08759" }
diff --git a/crates/spirv-builder/build.rs b/crates/spirv-builder/build.rs
new file mode 100644
index 0000000000..b6d9144723
--- /dev/null
+++ b/crates/spirv-builder/build.rs
@@ -0,0 +1,3 @@
+/// Empty build script to force cargo to generate an empty `OUT_DIR` directory
+/// that we can use as a scratchpad directory for tests.
+fn main() {}
diff --git a/crates/spirv-builder/src/depfile.rs b/crates/spirv-builder/src/depfile.rs
index be0acecbc1..38b08a6715 100644
--- a/crates/spirv-builder/src/depfile.rs
+++ b/crates/spirv-builder/src/depfile.rs
@@ -1,5 +1,5 @@
 //! Reading Makefile-style dependency files.
-//! Taken with permission from https://github.com/m-ou-se/ninj/blob/master/lib/depfile/mod.rs
+//! Taken with permission from <https://github.com/m-ou-se/ninj/blob/master/lib/depfile/mod.rs>
 
 use raw_string::{RawStr, RawString};
 use std::fs::File;
diff --git a/crates/spirv-builder/src/error.rs b/crates/spirv-builder/src/error.rs
new file mode 100644
index 0000000000..8e3178c327
--- /dev/null
+++ b/crates/spirv-builder/src/error.rs
@@ -0,0 +1,13 @@
+use std::fmt;
+
+/// An error occurred while Building the SPIR-V module.
+#[derive(Debug)]
+pub struct SpirvBuilderError;
+
+impl fmt::Display for SpirvBuilderError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.write_str("Build failed")
+    }
+}
+
+impl std::error::Error for SpirvBuilderError {}
diff --git a/crates/spirv-builder/src/lib.rs b/crates/spirv-builder/src/lib.rs
index 6ad9cdda6e..64e3dae53a 100644
--- a/crates/spirv-builder/src/lib.rs
+++ b/crates/spirv-builder/src/lib.rs
@@ -1,63 +1,119 @@
+//! `spirv-builder` is crate designed to automate the process of compiling and
+//! building SPIR-V crates.
+//!
+//! # Dependencies
+//! `spirv-builder` requires `cargo` to be available in the environment, in
+//! order to compile crates. You can override which `cargo` is used with the
+//! `CARGO` environment variable.
+//!
+//! # Build script example
+//! In this example we'll show how to compile a SPIR-V crate to be included
+//! at compile time.
+//!
+//! ## `build.rs`
+//! ```no_run
+//! use spirv_builder::{options::{Source, SourceKind}, SpirvBuilder};
+//!
+//! fn main() -> Result<(), Box<dyn std::error::Error>> {
+//! #   let path_to_crate_source = std::path::PathBuf::new();
+//!     let out_dir = std::path::PathBuf::from(std::env::var("OUT_DIR")?);
+//!     SpirvBuilder::new(path_to_crate_source, &out_dir)
+//!         // Currently `librustc_codegen_spirv` and the `spirv-unknown-unknown`
+//!         // sysroot are not packaged with Rust, so we have to build it ourselves.
+//!         // See `Source` for more information on different ways to provide or
+//!         // compile the sources.
+//!         .codegen_source(Source {
+//!             compile_source: true,
+//!             kind: SourceKind::Git {
+//!                 repository: "https://github.com/EmbarkStudios/rust-gpu".into(),
+//!                 into: out_dir.join("rust-gpu"),
+//!                 commitish: None,
+//!             }
+//!         })
+//!         .sysroot_location(Source {
+//!             compile_source: true,
+//!             kind: SourceKind::Path(out_dir.join("sysroot"))
+//!         })
+//!         // Emit cargo build script metadata for the SPIR-V project.
+//!         .emit_build_script_metadata()
+//!         .build()?;
+//!     Ok(())
+//! }
+//! ```
+//!
+//! ## `main.rs`
+//! ```no_compile
+//! const SPIRV_BINARY: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/crate_name.spv"));
+//! ```
+
 #[cfg(test)]
 mod test;
 
 mod depfile;
+mod error;
+pub mod options;
+mod rustc;
+mod utils;
 
-use raw_string::{RawStr, RawString};
-use serde::Deserialize;
-use std::collections::HashMap;
 use std::env;
-use std::error::Error;
-use std::fmt;
 use std::path::{Path, PathBuf};
-use std::process::{Command, Stdio};
+use std::process::Stdio;
 
-#[derive(Debug)]
-pub enum SpirvBuilderError {
-    BuildFailed,
-}
+use eyre::Result;
 
-impl fmt::Display for SpirvBuilderError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        match self {
-            SpirvBuilderError::BuildFailed => f.write_str("Build failed"),
-        }
-    }
-}
-
-impl Error for SpirvBuilderError {}
+use options::{CodegenBuildOptions, MemoryModel, Source, Version};
 
-pub enum MemoryModel {
-    Simple,
-    Vulkan,
-    GLSL450,
-}
+pub use error::SpirvBuilderError;
 
+/// The builder struct that compiles SPIR-V crates using
+/// either a compiled or installed `librustc_codegen_spirv` and
+/// `spirv-unknown-unknown` sysroot.
+#[derive(Default)]
 pub struct SpirvBuilder {
-    path_to_crate: PathBuf,
-    print_metadata: bool,
-    spirv_version: Option<(u8, u8)>,
+    build_script_metadata: bool,
+    codegen_options: CodegenBuildOptions,
+    codegen_source: Source,
+    destination: PathBuf,
     memory_model: Option<MemoryModel>,
+    rust_src: Option<PathBuf>,
+    sysroot_location: Source,
+    source: PathBuf,
+    spirv_version: Option<Version>,
 }
+
 impl SpirvBuilder {
-    pub fn new(path_to_crate: impl AsRef<Path>) -> Self {
+    /// Initialise a new [`SpirvBuilder`] with a source and
+    /// destination directories.
+    pub fn new(source: impl Into<PathBuf>, destination: impl Into<PathBuf>) -> Self {
         Self {
-            path_to_crate: path_to_crate.as_ref().to_owned(),
-            print_metadata: true,
-            spirv_version: None,
-            memory_model: None,
+            source: source.into(),
+            destination: destination.into(),
+            ..Default::default()
         }
     }
 
-    /// Whether to print build.rs cargo metadata (e.g. cargo:rustc-env=var=val). Defaults to true.
-    pub fn print_metadata(mut self, v: bool) -> Self {
-        self.print_metadata = v;
+    /// Sets the source for code generation.
+    pub fn codegen_source(mut self, codegen_source: Source) -> Self {
+        self.codegen_source = codegen_source;
+        self
+    }
+
+    /// Sets the location for the sysroot.
+    pub fn sysroot_location(mut self, sysroot_location: Source) -> Self {
+        self.sysroot_location = sysroot_location;
         self
     }
 
     /// Sets the SPIR-V binary version to use. Defaults to v1.3.
     pub fn spirv_version(mut self, major: u8, minor: u8) -> Self {
-        self.spirv_version = Some((major, minor));
+        self.spirv_version = Some(Version { major, minor });
+        self
+    }
+
+    /// Sets the path to the rust source to use for building sysroot. Default:
+    /// The current toolchain's `rust-src` component.
+    pub fn rust_src(mut self, rust_src: impl Into<PathBuf>) -> Self {
+        self.rust_src = Some(rust_src.into());
         self
     }
 
@@ -67,166 +123,182 @@ impl SpirvBuilder {
         self
     }
 
-    /// Builds the module. Returns the path to the built spir-v file. If print_metadata is true,
-    /// you usually don't have to inspect the path, as the environment variable will already be
-    /// set.
-    pub fn build(self) -> Result<PathBuf, SpirvBuilderError> {
-        let spirv_module = invoke_rustc(&self)?;
-        let env_var = spirv_module.file_name().unwrap().to_str().unwrap();
-        if self.print_metadata {
-            println!("cargo:rustc-env={}={}", env_var, spirv_module.display());
-        }
-        Ok(spirv_module)
+    /// Sets whether to print build script metadata (e.g. `rerun-if-changed`
+    /// for artifacts) to `cargo`.
+    pub fn emit_build_script_metadata(mut self) -> Self {
+        self.build_script_metadata = true;
+        self
     }
-}
 
-// https://github.com/rust-lang/cargo/blob/1857880b5124580c4aeb4e8bc5f1198f491d61b1/src/cargo/util/paths.rs#L29-L52
-fn dylib_path_envvar() -> &'static str {
-    if cfg!(windows) {
-        "PATH"
-    } else if cfg!(target_os = "macos") {
-        "DYLD_FALLBACK_LIBRARY_PATH"
-    } else {
-        "LD_LIBRARY_PATH"
+    /// Creates the target feature flag for rustc, setting the SPIR-V version
+    /// and/or memory model.
+    fn target_feature_flag(&self) -> String {
+        let mut target_features = Vec::new();
+        if let Some(version) = self.spirv_version {
+            target_features.push(format!("+{}", version));
+        }
+        if let Some(memory_model) = &self.memory_model {
+            target_features.push(format!("+{}", memory_model));
+        }
+
+        if target_features.is_empty() {
+            String::new()
+        } else {
+            format!("-C target-feature={}", target_features.join(","))
+        }
     }
-}
-fn dylib_path() -> Vec<PathBuf> {
-    match env::var_os(dylib_path_envvar()) {
-        Some(var) => env::split_paths(&var).collect(),
-        None => Vec::new(),
+
+    fn rustc_flags(&self, sysroot: Option<impl AsRef<Path>>, codegen: impl AsRef<Path>) -> String {
+        vec![
+            match sysroot {
+                Some(path) => format!("--sysroot={}", path.as_ref().display()),
+                None => String::new(),
+            },
+            format!("-Zcodegen-backend={}", codegen.as_ref().display()),
+            self.target_feature_flag(),
+        ]
+        .join(" ")
     }
-}
 
-fn find_rustc_codegen_spirv() -> PathBuf {
-    let filename = format!(
-        "{}rustc_codegen_spirv{}",
-        env::consts::DLL_PREFIX,
-        env::consts::DLL_SUFFIX
-    );
-    for mut path in dylib_path() {
-        path.push(&filename);
-        if path.is_file() {
-            return path;
+    /// Builds the module. Returns the path to the built spir-v file(s).
+    pub fn build(mut self) -> Result<PathBuf> {
+        if std::fs::metadata(&self.destination).is_ok() {
+            remove_dir_all::remove_dir_all(&self.destination)?;
+        }
+        std::fs::create_dir_all(&self.destination)?;
+        self.destination = self.destination.canonicalize()?;
+        self.source = self.source.canonicalize()?;
+        utils::fix_canon_paths(&mut self.destination);
+        utils::fix_canon_paths(&mut self.source);
+
+        for module in self.build_shader()? {
+            std::fs::copy(&module, self.destination.join(module.file_name().unwrap()))?;
         }
-    }
-    panic!("Could not find {} in library path", filename);
-}
 
-fn invoke_rustc(builder: &SpirvBuilder) -> Result<PathBuf, SpirvBuilderError> {
-    // Okay, this is a little bonkers: in a normal world, we'd have the user clone
-    // rustc_codegen_spirv and pass in the path to it, and then we'd invoke cargo to build it, grab
-    // the resulting .so, and pass it into -Z codegen-backend. But that's really gross: the user
-    // needs to clone rustc_codegen_spirv and tell us its path! So instead, we *directly reference
-    // rustc_codegen_spirv in spirv-builder's Cargo.toml*, which means that it will get built
-    // alongside build.rs, and cargo will helpfully add it to LD_LIBRARY_PATH for us! However,
-    // rustc expects a full path, instead of a filename looked up via LD_LIBRARY_PATH, so we need
-    // to copy cargo's understanding of library lookup and find the library and its full path.
-    let rustc_codegen_spirv = find_rustc_codegen_spirv();
-    let mut target_features = Vec::new();
-    // these must match codegen_cx/mod.rs
-    if let Some((major, minor)) = builder.spirv_version {
-        target_features.push(format!("+spirv{}.{}", major, minor));
+        Ok(self.destination)
     }
-    if let Some(memory_model) = &builder.memory_model {
-        target_features.push(
-            match memory_model {
-                MemoryModel::Simple => "+simple",
-                MemoryModel::Vulkan => "+vulkan",
-                MemoryModel::GLSL450 => "+glsl450",
-            }
-            .to_string(),
+
+    /// Builds the SPIR-V codegen backend and returns a path to the
+    /// compiled dynamic library. If `codegen_source.compile_source` is `false`
+    /// then then it will return the `codegen_source` path with the DLL file name.
+    pub fn build_spirv_codegen(&self) -> Result<PathBuf> {
+        const CRATE_NAME: &str = "rustc_codegen_spirv";
+        let dll_file_name = format!(
+            "{}{}{}",
+            env::consts::DLL_PREFIX,
+            CRATE_NAME,
+            env::consts::DLL_SUFFIX
         );
+
+        let path = self.codegen_source.get()?;
+        let repo_dir = match self.codegen_source.compile_source {
+            true => path,
+            false => return Ok(path.join(&dll_file_name)),
+        };
+
+        let crate_path = repo_dir.join("crates").join(CRATE_NAME);
+        let mut args = vec![
+            "build".into(),
+            "--no-default-features".into(),
+            format!("--features={}", self.codegen_options.spirv_tools),
+            format!(
+                "--manifest-path={}",
+                crate_path.join("Cargo.toml").display()
+            ),
+        ];
+
+        if self.codegen_options.release {
+            args.push("--release".into());
+        }
+
+        let output = rustc::cargo()
+            .args(&args)
+            .stderr(Stdio::inherit())
+            .current_dir(&crate_path)
+            .output()?;
+
+        let backend = repo_dir
+            .join("target")
+            .join(if self.codegen_options.release {
+                "release"
+            } else {
+                "debug"
+            })
+            .join(&dll_file_name);
+
+        if !output.status.success() || std::fs::metadata(&backend).is_err() {
+            Err(eyre::eyre!("Building `rustc_codegen_spirv` failed."))
+        } else {
+            Ok(backend)
+        }
     }
-    let feature_flag = if target_features.is_empty() {
-        String::new()
-    } else {
-        format!(" -C target-feature={}", target_features.join(","))
-    };
-    let rustflags = format!(
-        "-Z codegen-backend={} -Z symbol-mangling-version=v0{}",
-        rustc_codegen_spirv.display(),
-        feature_flag,
-    );
-    let build = Command::new("cargo")
-        .args(&[
-            "build",
-            "--message-format=json-render-diagnostics",
-            "-Z",
-            "build-std=core",
-            "--target",
-            "spirv-unknown-unknown",
-            "--release",
-        ])
-        .stderr(Stdio::inherit())
-        .current_dir(&builder.path_to_crate)
-        .env("RUSTFLAGS", rustflags)
-        .output()
-        .expect("failed to execute cargo build");
-
-    // `get_last_artifact` has the side-effect of printing invalid lines, so
-    // we do that even in case of an error, to let through any useful messages
-    // that ended up on stdout instead of stderr.
-    let stdout = String::from_utf8(build.stdout).unwrap();
-    let artifact = get_last_artifact(&stdout);
-
-    if build.status.success() {
-        if builder.print_metadata {
-            print_deps_of(&artifact);
+
+    pub fn build_sysroot(&self, backend: impl AsRef<Path>) -> Result<Option<PathBuf>> {
+        const TARGET_NAME: &str = "spirv-unknown-unknown";
+        if self.sysroot_location.kind.is_environment() {
+            return Ok(None);
+        }
+
+        let backend = backend.as_ref();
+        let path = self.sysroot_location.get()?;
+
+        let sysroot_dir = match self.sysroot_location.compile_source {
+            true => path,
+            false => return Ok(Some(path)),
+        };
+
+        let mut builder =
+            cargo_sysroot::SysrootBuilder::new(cargo_sysroot::Sysroot::CompilerBuiltins);
+        builder
+            .target(TARGET_NAME.into())
+            .output(sysroot_dir)
+            .rustc_flags(&[format!("-Zcodegen-backend={}", backend.display())]);
+
+        if let Some(path) = &self.rust_src {
+            builder.rust_src(path.clone());
         }
-        Ok(artifact)
-    } else {
-        Err(SpirvBuilderError::BuildFailed)
+
+        let sysroot = builder.build().map_err(|e| eyre::eyre!("{}", e))?;
+        let sysroot_codegen = sysroot.join(backend.file_name().unwrap());
+        std::fs::copy(&backend, &sysroot_codegen)?;
+        Ok(Some(sysroot))
     }
-}
 
-#[derive(Deserialize)]
-struct RustcOutput {
-    reason: String,
-    filenames: Option<Vec<String>>,
-}
+    pub fn build_shader(&self) -> eyre::Result<Vec<PathBuf>> {
+        let backend = self.build_spirv_codegen()?;
+        let sysroot = self.build_sysroot(&backend)?;
+        let flags = self.rustc_flags(sysroot, backend);
+        let build = rustc::cargo()
+            .args(&[
+                "build",
+                "--verbose",
+                "--release",
+                "--message-format=json-render-diagnostics",
+                "--target",
+                "spirv-unknown-unknown",
+            ])
+            .stderr(Stdio::inherit())
+            .current_dir(&self.source)
+            .env("RUSTFLAGS", flags)
+            .output()
+            .expect("failed to execute cargo build");
 
-fn get_last_artifact(out: &str) -> PathBuf {
-    let last = out
-        .lines()
-        .filter_map(|line| match serde_json::from_str::<RustcOutput>(line) {
-            Ok(line) => Some(line),
-            Err(_) => {
-                // Pass through invalid lines
-                println!("{}", line);
-                None
-            }
-        })
-        .filter(|line| line.reason == "compiler-artifact")
-        .last()
-        .expect("Did not find output file in rustc output");
-
-    let mut filenames = last
-        .filenames
-        .unwrap()
-        .into_iter()
-        .filter(|v| v.ends_with(".spv"));
-    let filename = filenames.next().expect("Crate had no .spv artifacts");
-    assert_eq!(filenames.next(), None, "Crate had multiple .spv artifacts");
-    filename.into()
-}
+        // get_artifacts_from_output` has the side-effect of printing invalid
+        // lines, so we do that even in case of an error, to let through any
+        // useful messages that ended up on stdout instead of stderr.
+        let stdout = String::from_utf8(build.stdout).unwrap();
+        let artifacts = rustc::get_artifacts_from_output(&stdout);
 
-fn print_deps_of(artifact: &Path) {
-    let deps_file = artifact.with_extension("d");
-    let mut deps_map = HashMap::new();
-    depfile::read_deps_file(&deps_file, |item, deps| {
-        deps_map.insert(item, deps);
-        Ok(())
-    })
-    .expect("Could not read dep file");
-    fn recurse(map: &HashMap<RawString, Vec<RawString>>, artifact: &RawStr) {
-        match map.get(artifact) {
-            Some(entries) => {
-                for entry in entries {
-                    recurse(map, entry)
+        if build.status.success() {
+            if self.build_script_metadata {
+                for artifact in &artifacts {
+                    rustc::print_deps_of(&artifact);
                 }
             }
-            None => println!("cargo:rerun-if-changed={}", artifact),
+
+            Ok(artifacts)
+        } else {
+            Err(SpirvBuilderError.into())
         }
     }
-    recurse(&deps_map, artifact.to_str().unwrap().into());
 }
diff --git a/crates/spirv-builder/src/options.rs b/crates/spirv-builder/src/options.rs
new file mode 100644
index 0000000000..0b034c8dc0
--- /dev/null
+++ b/crates/spirv-builder/src/options.rs
@@ -0,0 +1,102 @@
+//! Various options for building SPIR-V modules and relevant components.
+
+mod source;
+
+use std::fmt;
+
+pub use source::{Source, SourceKind};
+
+/// Options for compiling `librustc_codegen_spirv`.
+#[derive(Default)]
+pub struct CodegenBuildOptions {
+    /// Whether to compile in release mode. Default: `false`
+    pub release: bool,
+    /// Whether to use installed SPIR-V tools, or compile them. Default: `Auto`
+    pub spirv_tools: SpirvTools,
+}
+
+/// Sets the memory model to use for the SPIR-V module. See [Memory Model]
+/// from the SPIR-V specification for more information.
+///
+/// [memory model]: https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html#_a_id_memorymodelsection_a_memory_model
+pub enum MemoryModel {
+    /// No shared memory consistency issues. Capabilities: Shader
+    Simple,
+    /// Vulkan memory model, as specified by the client API. This memory model
+    /// must be declared if and only if the `VulkanMemoryModel` capability
+    /// is declared. Capabilities: VulkanMemoryModel
+    Vulkan,
+    /// Memory model needed by later versions of GLSL and ESSL. Works across
+    /// multiple versions. Capabilities: Shader
+    Glsl450,
+}
+
+impl fmt::Display for MemoryModel {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "{}",
+            match self {
+                MemoryModel::Simple => "simple",
+                MemoryModel::Vulkan => "vulkan",
+                MemoryModel::Glsl450 => "glsl450",
+            }
+        )
+    }
+}
+
+/// How to compile SPIR-V tools.
+pub enum SpirvTools {
+    /// Detect whether SPIR-V tools are present in the environment and use
+    /// those, else compile them.
+    Auto,
+    /// Compile SPIR-V tools from source.
+    Compiled,
+    /// Use SPIR-V tools available in the environment.
+    Installed,
+}
+
+impl Default for SpirvTools {
+    fn default() -> Self {
+        Self::Auto
+    }
+}
+
+impl fmt::Display for SpirvTools {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        const COMPILED_FEATURE: &str = "use-compiled-tools";
+        const INSTALLED_FEATURE: &str = "use-installed-tools";
+        write!(
+            f,
+            "{}",
+            match self {
+                Self::Auto => {
+                    if std::process::Command::new("spirv-val")
+                        .args(&["--version"])
+                        .status()
+                        .map_or(false, |s| s.success())
+                    {
+                        INSTALLED_FEATURE
+                    } else {
+                        COMPILED_FEATURE
+                    }
+                }
+                Self::Compiled => COMPILED_FEATURE,
+                Self::Installed => INSTALLED_FEATURE,
+            }
+        )
+    }
+}
+
+/// The version of SPIR-V to when compiling.
+#[derive(Clone, Copy)]
+pub(crate) struct Version {
+    pub major: u8,
+    pub minor: u8,
+}
+
+impl fmt::Display for Version {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "spirv{}.{}", self.major, self.minor)
+    }
+}
diff --git a/crates/spirv-builder/src/options/source.rs b/crates/spirv-builder/src/options/source.rs
new file mode 100644
index 0000000000..aa6e03034e
--- /dev/null
+++ b/crates/spirv-builder/src/options/source.rs
@@ -0,0 +1,82 @@
+use std::path::PathBuf;
+
+/// Defines the source to use for `rustc_codegen_spirv` and `sysroot`.
+#[derive(Debug, Default)]
+pub struct Source {
+    /// Whether to attempt to compile the source provided by `kind`. If `false`
+    /// expects the source to point to a prebuilt sysroot containing the
+    /// `spirv-unknown-unknown` sysroot and codegen. Errors if `true`, and
+    /// using `SourceKind::Environment`.
+    pub compile_source: bool,
+    pub kind: SourceKind,
+}
+
+impl Source {
+    pub fn get(&self) -> eyre::Result<PathBuf> {
+        if self.compile_source && self.kind == SourceKind::Environment {
+            return Err(eyre::eyre!(
+                "Invalid source configuration. Environment \
+                                    can't use compile_source."
+            ));
+        }
+
+        Ok(match &self.kind {
+            SourceKind::Environment => PathBuf::from("spirv"),
+            SourceKind::Path(path) => {
+                std::fs::create_dir_all(path)?;
+                let mut path = path
+                    .canonicalize()
+                    .map_err(|e| eyre::eyre!("Path: `{}`\n{}", path.display(), e))?;
+                crate::utils::fix_canon_paths(&mut path);
+                path
+            }
+            SourceKind::Git {
+                repository,
+                commitish,
+                into,
+            } => {
+                let into = into.to_owned();
+                std::fs::create_dir_all(&into)?;
+                let repo = git2::build::RepoBuilder::new().clone(&repository, &into)?;
+
+                if let Some(commitish) = commitish {
+                    repo.set_head(commitish)?;
+                }
+
+                into
+            }
+        })
+    }
+}
+
+/// Where the source of a component is located.
+#[derive(Debug, Eq, PartialEq)]
+pub enum SourceKind {
+    /// Clones a git repository for the source.
+    Git {
+        /// The git repository.
+        repository: String,
+        /// The branch or commit to checkout Default: default branch of the
+        /// repository.
+        commitish: Option<String>,
+        /// The directory to clone the repository into.
+        into: PathBuf,
+    },
+    /// Uses the path provided for the source.
+    Path(PathBuf),
+    /// Assume that `rustc_codegen_spirv` and `spirv-unknown-unknown` are
+    /// already available in the environment.
+    Environment,
+}
+
+impl SourceKind {
+    pub fn is_environment(&self) -> bool {
+        *self == Self::Environment
+    }
+}
+
+impl Default for SourceKind {
+    fn default() -> Self {
+        Self::Environment
+    }
+}
diff --git a/crates/spirv-builder/src/rustc.rs b/crates/spirv-builder/src/rustc.rs
new file mode 100644
index 0000000000..b2dbc720cd
--- /dev/null
+++ b/crates/spirv-builder/src/rustc.rs
@@ -0,0 +1,63 @@
+use std::collections::HashMap;
+use std::path::{Path, PathBuf};
+use std::process::Command;
+
+use raw_string::{RawStr, RawString};
+
+pub fn cargo() -> Command {
+    let mut cmd = Command::new(std::env::var("CARGO").unwrap_or_else(|_| String::from("cargo")));
+    cmd.env_clear();
+    cmd.env("PATH", std::env::var("PATH").unwrap());
+    cmd
+}
+
+#[derive(serde::Deserialize)]
+struct RustcOutput {
+    reason: String,
+    filenames: Option<Vec<String>>,
+}
+
+pub fn get_artifacts_from_output(out: &str) -> Vec<PathBuf> {
+    let filenames = out
+        .lines()
+        .filter_map(|line| match serde_json::from_str::<RustcOutput>(line) {
+            Ok(line) => Some(line),
+            Err(_) => {
+                // Pass through invalid lines
+                println!("{}", line);
+                None
+            }
+        })
+        .filter(|line| line.reason == "compiler-artifact")
+        .flat_map(|line| line.filenames.unwrap())
+        .filter(|v| v.ends_with(".spv"))
+        .map(Into::into)
+        .collect::<Vec<_>>();
+
+    if filenames.is_empty() {
+        panic!("Crate had no .spv artifacts");
+    }
+
+    filenames
+}
+
+pub fn print_deps_of(artifact: &Path) {
+    let deps_file = artifact.with_extension("d");
+    let mut deps_map = HashMap::new();
+    crate::depfile::read_deps_file(&deps_file, |item, deps| {
+        deps_map.insert(item, deps);
+        Ok(())
+    })
+    .expect("Could not read dep file");
+    fn recurse(map: &HashMap<RawString, Vec<RawString>>, artifact: &RawStr) {
+        match map.get(artifact) {
+            Some(entries) => {
+                for entry in entries {
+                    recurse(map, entry)
+                }
+            }
+            None => println!("cargo:rerun-if-changed={}", artifact),
+        }
+    }
+    recurse(&deps_map, artifact.to_str().unwrap().into());
+}
diff --git a/crates/spirv-builder/src/test/mod.rs b/crates/spirv-builder/src/test/mod.rs
index 8bdb48f8c4..0e6f35fdbf 100644
--- a/crates/spirv-builder/src/test/mod.rs
+++ b/crates/spirv-builder/src/test/mod.rs
@@ -2,7 +2,6 @@ mod basic;
 mod control_flow;
 
 use lazy_static::lazy_static;
-use rustc_codegen_spirv::rspirv;
 use std::error::Error;
 use std::path::{Path, PathBuf};
 use std::sync::{Mutex, MutexGuard};
@@ -34,7 +33,7 @@ fn global_lock() -> MutexGuard<'static, ()> {
 }
 
 static CARGO_TOML: &str = r#"[package]
-name = "test-project"
+name = "spirv-module"
 version = "0.1.0"
 authors = ["Embark <opensource@embark-studios.com>"]
 edition = "2018"
@@ -70,11 +69,19 @@ fn setup(src: &str) -> Result<PathBuf, Box<dyn Error>> {
 }
 
 fn build(src: &str) -> PathBuf {
+    let out_dir = PathBuf::from(env!("OUT_DIR"));
     let project = setup(src).expect("Failed to set up project");
-    crate::SpirvBuilder::new(&project)
-        .print_metadata(false)
+    crate::SpirvBuilder::new(&project, out_dir.join("spirv"))
+        .codegen_source(crate::Source {
+            compile_source: false,
+            kind: crate::options::SourceKind::Path("../../target/debug/".into()),
+        })
+        .sysroot_location(crate::Source {
+            compile_source: true,
+            kind: crate::options::SourceKind::Path("../../target/sysroot".into()),
+        })
         .build()
-        .expect("Failed to build test")
+        .unwrap()
 }
 
 fn read_module(path: &Path) -> Result<rspirv::dr::Module, Box<dyn Error>> {
@@ -108,8 +115,8 @@ fn assert_str_eq(expected: &str, result: &str) {
 
 fn dis_fn(src: &str, func: &str, expect: &str) {
     let _lock = global_lock();
-    let module = read_module(&build(src)).unwrap();
-    let abs_func_path = format!("test_project::{}", func);
+    let module = read_module(&build(src).join("spirv_module.spv")).unwrap();
+    let abs_func_path = format!("spirv_module::{}", func);
     let id = module
         .debugs
         .iter()
diff --git a/crates/spirv-builder/src/utils.rs b/crates/spirv-builder/src/utils.rs
new file mode 100644
index 0000000000..fbed13922c
--- /dev/null
+++ b/crates/spirv-builder/src/utils.rs
@@ -0,0 +1,21 @@
+use std::path::PathBuf;
+
+/// Currently cargo doesn't work well with UNC (`\\?\`) paths on Windows
+/// so we have to remove it.
+pub fn fix_canon_paths(path: &mut PathBuf) {
+    if cfg!(windows) {
+        let prefix = path
+            .components()
+            .next()
+            .and_then(|p| p.as_os_str().to_str())
+            .map(|s| s.replace(r"\\?\", ""))
+            .unwrap();
+
+        *path = vec![
+            prefix.into(),
+            path.components().skip(1).collect::<PathBuf>(),
+        ]
+        .into_iter()
+        .collect();
+    }
+}
diff --git a/deny.toml b/deny.toml
index e0137f1424..9d5bba4425 100644
--- a/deny.toml
+++ b/deny.toml
@@ -37,9 +37,7 @@ skip = [
 # by default infinite
 skip-tree = [
     # we don't really care if our example brings in some duplicate dependencies, for now
-    { name = "example-runner-ash", version = "*", depth = 20 },
-    { name = "example-runner-cpu", version = "*", depth = 20 },
-    { name = "example-runner-wgpu", version = "*", depth = 20 },
+    { name = "spirv-builder", version = "*", depth = 20 },
 ]
 
 
diff --git a/examples/runners/ash/Cargo.toml b/examples/runners/ash/Cargo.toml
index 9cb533ca55..19f2fb7b16 100644
--- a/examples/runners/ash/Cargo.toml
+++ b/examples/runners/ash/Cargo.toml
@@ -8,9 +8,6 @@ publish = false
 
 # See rustc_codegen_spirv/Cargo.toml for details on these features
 [features]
-default = ["use-compiled-tools"]
-use-installed-tools = ["spirv-builder/use-installed-tools"]
-use-compiled-tools = ["spirv-builder/use-compiled-tools"]
 
 [dependencies]
 shared = { path = "../../shaders/shared" }
diff --git a/examples/runners/ash/build.rs b/examples/runners/ash/build.rs
index b0cb1f6292..5921eabf2b 100644
--- a/examples/runners/ash/build.rs
+++ b/examples/runners/ash/build.rs
@@ -1,10 +1,24 @@
-use spirv_builder::SpirvBuilder;
 use std::error::Error;
+use std::path::PathBuf;
+
+use spirv_builder::{options::{Source, SourceKind}, SpirvBuilder};
 
 fn main() -> Result<(), Box<dyn Error>> {
+    let out_dir = PathBuf::from(std::env::var("OUT_DIR")?);
     // This will set the env var `sky-shader.spv` to a spir-v file that can be include!()'d
-    SpirvBuilder::new("../../shaders/sky-shader")
-        .spirv_version(1, 3)
-        .build()?;
+    SpirvBuilder::new(
+        "../../shaders/sky-shader",
+        std::env::var("OUT_DIR").unwrap(),
+    )
+    .spirv_version(1, 3)
+    .codegen_source(Source {
+        compile_source: true,
+        kind: SourceKind::Path(std::fs::canonicalize("../../../")?)
+    })
+    .sysroot_location(Source {
+        compile_source: true,
+        kind: SourceKind::Path(out_dir.join("sysroot"))
+    })
+    .build()?;
     Ok(())
 }
diff --git a/examples/runners/ash/src/main.rs b/examples/runners/ash/src/main.rs
index e2c80bf062..4ce7a08b81 100644
--- a/examples/runners/ash/src/main.rs
+++ b/examples/runners/ash/src/main.rs
@@ -19,7 +19,7 @@ use std::ops::Drop;
 use structopt::StructOpt;
 
 fn shader_module() -> &'static [u8] {
-    &include_bytes!(env!("sky_shader.spv"))[..]
+    &include_bytes!(concat!(env!("OUT_DIR"), "/sky_shader.spv"))[..]
 }
 
 // Simple offset_of macro akin to C++ offsetof
diff --git a/examples/runners/wgpu/Cargo.toml b/examples/runners/wgpu/Cargo.toml
index 66d8300366..8fad40de85 100644
--- a/examples/runners/wgpu/Cargo.toml
+++ b/examples/runners/wgpu/Cargo.toml
@@ -11,9 +11,6 @@ crate-type = ["lib", "cdylib"]
 
 # See rustc_codegen_spirv/Cargo.toml for details on these features
 [features]
-default = ["use-compiled-tools"]
-use-installed-tools = ["spirv-builder/use-installed-tools"]
-use-compiled-tools = ["spirv-builder/use-compiled-tools"]
 
 [dependencies]
 cfg-if = "1.0.0"
diff --git a/examples/runners/wgpu/build.rs b/examples/runners/wgpu/build.rs
index 87322e3d6a..ba4c8bf0e6 100644
--- a/examples/runners/wgpu/build.rs
+++ b/examples/runners/wgpu/build.rs
@@ -1,16 +1,26 @@
-use spirv_builder::SpirvBuilder;
 use std::error::Error;
+use std::path::PathBuf;
 
-fn build_shader(path_to_create: &str) -> Result<(), Box<dyn Error>> {
-    SpirvBuilder::new(path_to_create)
-        .spirv_version(1, 0)
+use spirv_builder::{options::{Source, SourceKind}, SpirvBuilder};
+
+fn build_shader(path_to_crate: &str) -> Result<(), Box<dyn Error>> {
+    let out_dir = PathBuf::from(std::env::var("OUT_DIR")?);
+    SpirvBuilder::new(path_to_crate, &out_dir)
+        .spirv_version(1, 3)
+        .codegen_source(Source {
+            compile_source: true,
+            kind: SourceKind::Path("../../../".into())
+        })
+        .sysroot_location(Source {
+            compile_source: true,
+            kind: SourceKind::Path(out_dir.join("sysroot"))
+        })
+        .emit_build_script_metadata()
         .build()?;
     Ok(())
 }
 
 fn main() -> Result<(), Box<dyn Error>> {
-    build_shader("../../shaders/sky-shader")?;
-    build_shader("../../shaders/simplest-shader")?;
-    build_shader("../../shaders/compute-shader")?;
+    build_shader("../../shaders")?;
     Ok(())
 }
diff --git a/examples/runners/wgpu/src/lib.rs b/examples/runners/wgpu/src/lib.rs
index c86876bfa5..add045ac7f 100644
--- a/examples/runners/wgpu/src/lib.rs
+++ b/examples/runners/wgpu/src/lib.rs
@@ -13,9 +13,15 @@ pub enum RustGPUShader {
 
 fn shader_module(shader: RustGPUShader) -> wgpu::ShaderModuleSource<'static> {
     match shader {
-        RustGPUShader::Simplest => wgpu::include_spirv!(env!("simplest_shader.spv")),
-        RustGPUShader::Sky => wgpu::include_spirv!(env!("sky_shader.spv")),
-        RustGPUShader::Compute => wgpu::include_spirv!(env!("compute_shader.spv")),
+        RustGPUShader::Compute => {
+            wgpu::include_spirv!(concat!(env!("OUT_DIR"), "/compute_shader.spv"))
+        }
+        RustGPUShader::Simplest => {
+            wgpu::include_spirv!(concat!(env!("OUT_DIR"), "/simplest_shader.spv"))
+        }
+        RustGPUShader::Sky => {
+            wgpu::include_spirv!(concat!(env!("OUT_DIR"), "/sky_shader.spv"))
+        }
     }
 }
 
diff --git a/examples/shaders/Cargo.toml b/examples/shaders/Cargo.toml
new file mode 100644
index 0000000000..3e4457383d
--- /dev/null
+++ b/examples/shaders/Cargo.toml
@@ -0,0 +1,6 @@
+[workspace]
+members = [
+    "compute-shader",
+    "simplest-shader",
+    "sky-shader",
+]