From 5500435d2fc81d1e473a1b7e3ce02c2ff7924362 Mon Sep 17 00:00:00 2001
From: Joshua Yanovski <pythonesque@gmail.com>
Date: Sat, 4 Sep 2021 11:59:18 -0700
Subject: [PATCH] Revert "Replace shaderc with naga"

This reverts commit 446d93dda0db486d65ec9374946205cc5bf35a59.
---
 Cargo.lock                                    |  81 +++----
 Cargo.toml                                    |   3 +-
 assets/voxygen/shaders/blit-frag.glsl         |   2 +-
 assets/voxygen/shaders/blit-vert.glsl         |   2 +-
 assets/voxygen/shaders/clouds-frag.glsl       |   2 +-
 assets/voxygen/shaders/clouds-vert.glsl       |   2 +-
 assets/voxygen/shaders/debug-frag.glsl        |   2 +-
 assets/voxygen/shaders/debug-vert.glsl        |   2 +-
 .../dual-downsample-filtered-frag.glsl        |   2 +-
 .../voxygen/shaders/dual-downsample-frag.glsl |   2 +-
 .../voxygen/shaders/dual-upsample-frag.glsl   |   2 +-
 assets/voxygen/shaders/figure-frag.glsl       |   2 +-
 assets/voxygen/shaders/figure-vert.glsl       |   2 +-
 assets/voxygen/shaders/fluid-frag/cheap.glsl  |   2 +-
 assets/voxygen/shaders/fluid-frag/shiny.glsl  |   2 +-
 assets/voxygen/shaders/fluid-vert.glsl        |   2 +-
 assets/voxygen/shaders/include/random.glsl    |   3 +
 .../shaders/light-shadows-directed-vert.glsl  |   2 +-
 .../shaders/light-shadows-figure-vert.glsl    |   2 +-
 .../voxygen/shaders/light-shadows-frag.glsl   |   2 +-
 assets/voxygen/shaders/lod-terrain-frag.glsl  |   2 +-
 assets/voxygen/shaders/lod-terrain-vert.glsl  |   2 +-
 assets/voxygen/shaders/particle-frag.glsl     |   2 +-
 assets/voxygen/shaders/particle-vert.glsl     |   2 +-
 .../shaders/point-light-shadows-vert.glsl     |   2 +-
 assets/voxygen/shaders/postprocess-frag.glsl  |   2 +-
 assets/voxygen/shaders/postprocess-vert.glsl  |   2 +-
 assets/voxygen/shaders/skybox-frag.glsl       |   2 +-
 assets/voxygen/shaders/skybox-vert.glsl       |   2 +-
 assets/voxygen/shaders/sprite-frag.glsl       |   2 +-
 assets/voxygen/shaders/sprite-vert.glsl       |   2 +-
 assets/voxygen/shaders/terrain-frag.glsl      |   2 +-
 assets/voxygen/shaders/terrain-vert.glsl      |   2 +-
 assets/voxygen/shaders/ui-frag.glsl           |   2 +-
 assets/voxygen/shaders/ui-vert.glsl           |   2 +-
 voxygen/Cargo.toml                            |   4 +-
 voxygen/src/render/error.rs                   |  75 +------
 voxygen/src/render/renderer.rs                |   1 -
 .../src/render/renderer/pipeline_creation.rs  | 200 +++++++-----------
 39 files changed, 145 insertions(+), 286 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 3461ea8e4c..9a359f9253 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2023,7 +2023,7 @@ dependencies = [
  "khronos-egl",
  "libloading 0.7.0",
  "log",
- "naga 0.4.0",
+ "naga",
  "parking_lot 0.11.1",
  "raw-window-handle",
  "spirv_cross",
@@ -2047,7 +2047,7 @@ dependencies = [
  "gfx-hal",
  "log",
  "metal",
- "naga 0.4.0",
+ "naga",
  "objc",
  "parking_lot 0.11.1",
  "profiling",
@@ -2070,7 +2070,7 @@ dependencies = [
  "inplace_it",
  "libloading 0.7.0",
  "log",
- "naga 0.4.0",
+ "naga",
  "objc",
  "parking_lot 0.11.1",
  "raw-window-handle",
@@ -2085,7 +2085,7 @@ version = "0.8.0"
 source = "git+https://github.com/gfx-rs/gfx?rev=27a1dae3796d33d23812f2bb8c7e3b5aea18b521#27a1dae3796d33d23812f2bb8c7e3b5aea18b521"
 dependencies = [
  "bitflags",
- "naga 0.4.0",
+ "naga",
  "raw-window-handle",
  "thiserror",
 ]
@@ -2175,16 +2175,6 @@ dependencies = [
  "web-sys",
 ]
 
-[[package]]
-name = "glsl-include"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daa2afb1631e7ab4543e0dde0e3fc68bb49c58fee89c07f30a26553b1f684ab6"
-dependencies = [
- "lazy_static",
- "regex",
-]
-
 [[package]]
 name = "glyph_brush"
 version = "0.7.2"
@@ -3212,22 +3202,6 @@ dependencies = [
  "thiserror",
 ]
 
-[[package]]
-name = "naga"
-version = "0.6.0"
-source = "git+https://github.com/gfx-rs/naga.git?rev=2069ea698f4ff570c7d065b899f16a88725aca85#2069ea698f4ff570c7d065b899f16a88725aca85"
-dependencies = [
- "bit-set",
- "bitflags",
- "codespan-reporting",
- "fxhash",
- "log",
- "num-traits",
- "pp-rs",
- "spirv",
- "thiserror",
-]
-
 [[package]]
 name = "native-dialog"
 version = "0.5.5"
@@ -3949,15 +3923,6 @@ dependencies = [
  "rand 0.8.4",
 ]
 
-[[package]]
-name = "pp-rs"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee"
-dependencies = [
- "unicode-xid 0.2.2",
-]
-
 [[package]]
 name = "ppv-lite86"
 version = "0.2.10"
@@ -4883,6 +4848,26 @@ version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d"
 
+[[package]]
+name = "shaderc"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50b8aeaae10b9bda5cba66736a7e265f67698e912e1cc6a4678acba286e22be9"
+dependencies = [
+ "libc",
+ "shaderc-sys",
+]
+
+[[package]]
+name = "shaderc-sys"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b12d7c62d6732884c9dfab587503fa3a795b108df152415a89da23812d4737e"
+dependencies = [
+ "cmake",
+ "libc",
+]
+
 [[package]]
 name = "sharded-slab"
 version = "0.1.1"
@@ -5138,16 +5123,6 @@ dependencies = [
  "winapi 0.3.9",
 ]
 
-[[package]]
-name = "spirv"
-version = "0.2.0+1.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830"
-dependencies = [
- "bitflags",
- "num-traits",
-]
-
 [[package]]
 name = "spirv_cross"
 version = "0.23.1"
@@ -6183,7 +6158,6 @@ dependencies = [
  "bytemuck",
  "chrono",
  "chumsky",
- "codespan-reporting",
  "conrod_core",
  "conrod_winit",
  "copy_dir",
@@ -6201,7 +6175,6 @@ dependencies = [
  "enum-iterator",
  "euc",
  "gilrs",
- "glsl-include",
  "glyph_brush",
  "guillotiere",
  "hashbrown 0.11.2",
@@ -6212,7 +6185,6 @@ dependencies = [
  "keyboard-keynames",
  "lazy_static",
  "mumble-link",
- "naga 0.6.0",
  "native-dialog",
  "num 0.4.0",
  "num_cpus",
@@ -6223,6 +6195,7 @@ dependencies = [
  "rodio",
  "ron",
  "serde",
+ "shaderc",
  "specs",
  "specs-idvs",
  "strum",
@@ -6803,7 +6776,7 @@ dependencies = [
  "arrayvec",
  "js-sys",
  "log",
- "naga 0.4.0",
+ "naga",
  "parking_lot 0.11.1",
  "raw-window-handle",
  "serde",
@@ -6835,7 +6808,7 @@ dependencies = [
  "gpu-alloc",
  "gpu-descriptor",
  "log",
- "naga 0.4.0",
+ "naga",
  "parking_lot 0.11.1",
  "profiling",
  "raw-window-handle",
diff --git a/Cargo.toml b/Cargo.toml
index 204810922d..45716c89b9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -136,8 +136,9 @@ nativeBuildInputs = ["pkg-config"]
 vek = { git = "https://gitlab.com/veloren/vek.git", branch = "fix_intrinsics2" }
 # patch wgpu so we can use wgpu-profiler crate
 wgpu = { git = "https://github.com/gfx-rs/wgpu.git", rev = "a92b8549a8e2cb9dac781bafc5ed32828f3caf46" }
-naga = { git = "https://github.com/gfx-rs/naga.git", rev = "2069ea698f4ff570c7d065b899f16a88725aca85" }
 
+# # use the latest fixes in naga (remove when updates trickle down to wgpu-rs)
+# naga = { git = "https://github.com/gfx-rs/naga.git", rev = "3a0f0144112ff621dd7f731bf455adf6cab19164" }
 # # use the latest fixes in gfx (remove when updates trickle down to wgpu-rs)
 # gfx-hal = { git = "https://github.com/gfx-rs/gfx.git", rev = "e305dcca3557923a6a8810162d8dd09cb45a43a6" }
 # gfx-backend-empty = { git = "https://github.com/gfx-rs/gfx.git", rev = "e305dcca3557923a6a8810162d8dd09cb45a43a6" }
diff --git a/assets/voxygen/shaders/blit-frag.glsl b/assets/voxygen/shaders/blit-frag.glsl
index c54cca2a8f..d0818b374a 100644
--- a/assets/voxygen/shaders/blit-frag.glsl
+++ b/assets/voxygen/shaders/blit-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 layout(set = 0, binding = 0)
 uniform texture2D t_src_color;
diff --git a/assets/voxygen/shaders/blit-vert.glsl b/assets/voxygen/shaders/blit-vert.glsl
index c6f9c04eda..f6538bd743 100644
--- a/assets/voxygen/shaders/blit-vert.glsl
+++ b/assets/voxygen/shaders/blit-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 layout(location = 0) out vec2 uv;
 
diff --git a/assets/voxygen/shaders/clouds-frag.glsl b/assets/voxygen/shaders/clouds-frag.glsl
index 9e83b8f168..7d02bf0f1d 100644
--- a/assets/voxygen/shaders/clouds-frag.glsl
+++ b/assets/voxygen/shaders/clouds-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/clouds-vert.glsl b/assets/voxygen/shaders/clouds-vert.glsl
index 2c77d689c3..933d3a3dc3 100644
--- a/assets/voxygen/shaders/clouds-vert.glsl
+++ b/assets/voxygen/shaders/clouds-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/debug-frag.glsl b/assets/voxygen/shaders/debug-frag.glsl
index da1932b1cf..c681b64bfc 100644
--- a/assets/voxygen/shaders/debug-frag.glsl
+++ b/assets/voxygen/shaders/debug-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <globals.glsl>
 
diff --git a/assets/voxygen/shaders/debug-vert.glsl b/assets/voxygen/shaders/debug-vert.glsl
index 14c0221ecd..97d774a642 100644
--- a/assets/voxygen/shaders/debug-vert.glsl
+++ b/assets/voxygen/shaders/debug-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <globals.glsl>
 
diff --git a/assets/voxygen/shaders/dual-downsample-filtered-frag.glsl b/assets/voxygen/shaders/dual-downsample-filtered-frag.glsl
index d20d3b9df4..9ce06098ae 100644
--- a/assets/voxygen/shaders/dual-downsample-filtered-frag.glsl
+++ b/assets/voxygen/shaders/dual-downsample-filtered-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 layout(set = 0, binding = 0)
 uniform texture2D t_src_color;
diff --git a/assets/voxygen/shaders/dual-downsample-frag.glsl b/assets/voxygen/shaders/dual-downsample-frag.glsl
index d41280b430..af9fa46c09 100644
--- a/assets/voxygen/shaders/dual-downsample-frag.glsl
+++ b/assets/voxygen/shaders/dual-downsample-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 layout(set = 0, binding = 0)
 uniform texture2D t_src_color;
diff --git a/assets/voxygen/shaders/dual-upsample-frag.glsl b/assets/voxygen/shaders/dual-upsample-frag.glsl
index 0036a68260..10d1b1fdc6 100644
--- a/assets/voxygen/shaders/dual-upsample-frag.glsl
+++ b/assets/voxygen/shaders/dual-upsample-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 layout(set = 0, binding = 0)
 uniform texture2D t_src_color;
diff --git a/assets/voxygen/shaders/figure-frag.glsl b/assets/voxygen/shaders/figure-frag.glsl
index 1836621f26..0c1948023c 100644
--- a/assets/voxygen/shaders/figure-frag.glsl
+++ b/assets/voxygen/shaders/figure-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #define FIGURE_SHADER
 
diff --git a/assets/voxygen/shaders/figure-vert.glsl b/assets/voxygen/shaders/figure-vert.glsl
index 1cbb86a54f..489c439d4b 100644
--- a/assets/voxygen/shaders/figure-vert.glsl
+++ b/assets/voxygen/shaders/figure-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/fluid-frag/cheap.glsl b/assets/voxygen/shaders/fluid-frag/cheap.glsl
index aa6e5988d2..f405fdd039 100644
--- a/assets/voxygen/shaders/fluid-frag/cheap.glsl
+++ b/assets/voxygen/shaders/fluid-frag/cheap.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/fluid-frag/shiny.glsl b/assets/voxygen/shaders/fluid-frag/shiny.glsl
index b83c932e3e..67aae23766 100644
--- a/assets/voxygen/shaders/fluid-frag/shiny.glsl
+++ b/assets/voxygen/shaders/fluid-frag/shiny.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/fluid-vert.glsl b/assets/voxygen/shaders/fluid-vert.glsl
index cfdfdd8876..0d68559912 100644
--- a/assets/voxygen/shaders/fluid-vert.glsl
+++ b/assets/voxygen/shaders/fluid-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/include/random.glsl b/assets/voxygen/shaders/include/random.glsl
index c79306975d..482e631911 100644
--- a/assets/voxygen/shaders/include/random.glsl
+++ b/assets/voxygen/shaders/include/random.glsl
@@ -98,5 +98,8 @@ vec4 rand_perm_4(vec4 pos) {
 
 vec3 smooth_rand(vec3 pos, float lerp_axis) {
     return vec3(snoise(vec4(pos, lerp_axis)), snoise(vec4(pos + 400.0, lerp_axis)), snoise(vec4(pos + 1000.0, lerp_axis)));
+    vec3 r0 = rand_perm_3(vec3(pos.x, pos.y, pos.z) + floor(lerp_axis));
+    vec3 r1 = rand_perm_3(vec3(pos.x, pos.y, pos.z) + floor(lerp_axis + 1.0));
+    return r0 + (r1 - r0) * fract(lerp_axis);
 }
 #endif
diff --git a/assets/voxygen/shaders/light-shadows-directed-vert.glsl b/assets/voxygen/shaders/light-shadows-directed-vert.glsl
index a99cae8373..99aeaa61b1 100644
--- a/assets/voxygen/shaders/light-shadows-directed-vert.glsl
+++ b/assets/voxygen/shaders/light-shadows-directed-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 // #extension ARB_texture_storage : enable
 
 #include <constants.glsl>
diff --git a/assets/voxygen/shaders/light-shadows-figure-vert.glsl b/assets/voxygen/shaders/light-shadows-figure-vert.glsl
index 2ba601889c..1df58ae055 100644
--- a/assets/voxygen/shaders/light-shadows-figure-vert.glsl
+++ b/assets/voxygen/shaders/light-shadows-figure-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 // #extension ARB_texture_storage : enable
 
 #define FIGURE_SHADER
diff --git a/assets/voxygen/shaders/light-shadows-frag.glsl b/assets/voxygen/shaders/light-shadows-frag.glsl
index b264f60495..3671ace978 100644
--- a/assets/voxygen/shaders/light-shadows-frag.glsl
+++ b/assets/voxygen/shaders/light-shadows-frag.glsl
@@ -2,7 +2,7 @@
 //
 // However, in the future we might apply some depth transforms here.
 
-#version 460 core
+#version 420 core
 // #extension ARB_texture_storage : enable
 
 #include <constants.glsl>
diff --git a/assets/voxygen/shaders/lod-terrain-frag.glsl b/assets/voxygen/shaders/lod-terrain-frag.glsl
index 9e84124a35..f55ae4e98c 100644
--- a/assets/voxygen/shaders/lod-terrain-frag.glsl
+++ b/assets/voxygen/shaders/lod-terrain-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/lod-terrain-vert.glsl b/assets/voxygen/shaders/lod-terrain-vert.glsl
index c80cd4a1a8..48554ea74e 100644
--- a/assets/voxygen/shaders/lod-terrain-vert.glsl
+++ b/assets/voxygen/shaders/lod-terrain-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/particle-frag.glsl b/assets/voxygen/shaders/particle-frag.glsl
index d6f89694c5..bd04b3388d 100644
--- a/assets/voxygen/shaders/particle-frag.glsl
+++ b/assets/voxygen/shaders/particle-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/particle-vert.glsl b/assets/voxygen/shaders/particle-vert.glsl
index 641b68d4a0..1e29ffb9e4 100644
--- a/assets/voxygen/shaders/particle-vert.glsl
+++ b/assets/voxygen/shaders/particle-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/point-light-shadows-vert.glsl b/assets/voxygen/shaders/point-light-shadows-vert.glsl
index dca09849b6..7670a2f368 100644
--- a/assets/voxygen/shaders/point-light-shadows-vert.glsl
+++ b/assets/voxygen/shaders/point-light-shadows-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 // #extension ARB_texture_storage : enable
 
 #include <constants.glsl>
diff --git a/assets/voxygen/shaders/postprocess-frag.glsl b/assets/voxygen/shaders/postprocess-frag.glsl
index 343c073e79..17b90c0895 100644
--- a/assets/voxygen/shaders/postprocess-frag.glsl
+++ b/assets/voxygen/shaders/postprocess-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/postprocess-vert.glsl b/assets/voxygen/shaders/postprocess-vert.glsl
index a0c31268cf..21a6b3d8c2 100644
--- a/assets/voxygen/shaders/postprocess-vert.glsl
+++ b/assets/voxygen/shaders/postprocess-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/skybox-frag.glsl b/assets/voxygen/shaders/skybox-frag.glsl
index 97fc04f3ef..37e1676520 100644
--- a/assets/voxygen/shaders/skybox-frag.glsl
+++ b/assets/voxygen/shaders/skybox-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/skybox-vert.glsl b/assets/voxygen/shaders/skybox-vert.glsl
index 0628170054..9f362fedb7 100644
--- a/assets/voxygen/shaders/skybox-vert.glsl
+++ b/assets/voxygen/shaders/skybox-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/sprite-frag.glsl b/assets/voxygen/shaders/sprite-frag.glsl
index f8c0fc65b5..119bf61e59 100644
--- a/assets/voxygen/shaders/sprite-frag.glsl
+++ b/assets/voxygen/shaders/sprite-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/sprite-vert.glsl b/assets/voxygen/shaders/sprite-vert.glsl
index c0d1966f0c..097e5e25f2 100644
--- a/assets/voxygen/shaders/sprite-vert.glsl
+++ b/assets/voxygen/shaders/sprite-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl
index 56811591b0..6aff7daaf3 100644
--- a/assets/voxygen/shaders/terrain-frag.glsl
+++ b/assets/voxygen/shaders/terrain-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 // #extension GL_ARB_texture_storage : require
 
 #include <constants.glsl>
diff --git a/assets/voxygen/shaders/terrain-vert.glsl b/assets/voxygen/shaders/terrain-vert.glsl
index 760314c831..36be96776d 100644
--- a/assets/voxygen/shaders/terrain-vert.glsl
+++ b/assets/voxygen/shaders/terrain-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <constants.glsl>
 
diff --git a/assets/voxygen/shaders/ui-frag.glsl b/assets/voxygen/shaders/ui-frag.glsl
index f8f2553140..549f60bfb3 100644
--- a/assets/voxygen/shaders/ui-frag.glsl
+++ b/assets/voxygen/shaders/ui-frag.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <globals.glsl>
 
diff --git a/assets/voxygen/shaders/ui-vert.glsl b/assets/voxygen/shaders/ui-vert.glsl
index 06fe4aacdf..7c25f01fd3 100644
--- a/assets/voxygen/shaders/ui-vert.glsl
+++ b/assets/voxygen/shaders/ui-vert.glsl
@@ -1,4 +1,4 @@
-#version 460 core
+#version 420 core
 
 #include <globals.glsl>
 
diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml
index 6bae0d9213..4203f309e1 100644
--- a/voxygen/Cargo.toml
+++ b/voxygen/Cargo.toml
@@ -55,9 +55,7 @@ winit = {version = "0.25.0", features = ["serde"]}
 wgpu = { version = "=0.8.0", features = ["trace", "cross"] }
 wgpu-profiler = { git = "https://github.com/Imberflur/wgpu-profiler", tag = "wgpu-0.8" }
 bytemuck = { version="1.4", features=["derive"] }
-naga = { version = "=0.6.0", features = ["glsl-in", "glsl-validate", "spv-out", "codespan-reporting"] }
-glsl-include = "0.3.1"
-codespan-reporting = "0.11.1"
+shaderc = "0.6.2"
 
 # Ui
 conrod_core = {git = "https://gitlab.com/veloren/conrod.git", branch="copypasta_0.7"}
diff --git a/voxygen/src/render/error.rs b/voxygen/src/render/error.rs
index 65f86d09bc..d3736216c4 100644
--- a/voxygen/src/render/error.rs
+++ b/voxygen/src/render/error.rs
@@ -6,13 +6,11 @@ pub enum RenderError {
     SwapChainError(wgpu::SwapChainError),
     CustomError(String),
     CouldNotFindAdapter,
-    GlslIncludeError(String, glsl_include::Error),
-    ParserError(String),
-    ValidationError(String, naga::valid::ValidationError),
-    SpirvError(String, naga::back::spv::Error),
+    ErrorInitializingCompiler,
+    ShaderError(String, shaderc::Error),
 }
 
-use std::{error::Error, fmt};
+use std::fmt;
 impl fmt::Debug for RenderError {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
@@ -27,56 +25,12 @@ impl fmt::Debug for RenderError {
                 .finish(),
             Self::CustomError(err) => f.debug_tuple("CustomError").field(err).finish(),
             Self::CouldNotFindAdapter => f.debug_tuple("CouldNotFindAdapter").finish(),
-            Self::GlslIncludeError(shader_name, err) => write!(
+            Self::ErrorInitializingCompiler => f.debug_tuple("ErrorInitializingCompiler").finish(),
+            Self::ShaderError(shader_name, err) => write!(
                 f,
-                "\"{}\" shader contains invalid include directives: {}",
+                "\"{}\" shader failed to compile due to the following error: {}",
                 shader_name, err
             ),
-            Self::ParserError(shader_name) => {
-                write!(f, "\"{}\" shader failed to parse", shader_name)
-            },
-            Self::ValidationError(shader_name, err) => {
-                write!(
-                    f,
-                    "\"{}\" shader failed to validate due to the following error: {}",
-                    shader_name, err
-                )?;
-
-                let mut e = err.source();
-                if e.is_some() {
-                    writeln!(f, ": ")?;
-                } else {
-                    writeln!(f)?;
-                }
-
-                while let Some(source) = e {
-                    writeln!(f, "\t{}", source)?;
-                    e = source.source();
-                }
-
-                Ok(())
-            },
-            Self::SpirvError(shader_name, err) => {
-                write!(
-                    f,
-                    "\"{}\" shader failed to emit due to the following error: {}",
-                    shader_name, err
-                )?;
-
-                let mut e = err.source();
-                if e.is_some() {
-                    writeln!(f, ": ")?;
-                } else {
-                    writeln!(f)?;
-                }
-
-                while let Some(source) = e {
-                    writeln!(f, "\t{}", source)?;
-                    e = source.source();
-                }
-
-                Ok(())
-            },
         }
     }
 }
@@ -93,19 +47,8 @@ impl From<wgpu::SwapChainError> for RenderError {
     fn from(err: wgpu::SwapChainError) -> Self { Self::SwapChainError(err) }
 }
 
-impl From<(&str, glsl_include::Error)> for RenderError {
-    fn from((shader_name, err): (&str, glsl_include::Error)) -> Self {
-        Self::GlslIncludeError(shader_name.into(), err)
-    }
-}
-
-impl From<(&str, naga::valid::ValidationError)> for RenderError {
-    fn from((shader_name, err): (&str, naga::valid::ValidationError)) -> Self {
-        Self::ValidationError(shader_name.into(), err)
-    }
-}
-impl From<(&str, naga::back::spv::Error)> for RenderError {
-    fn from((shader_name, err): (&str, naga::back::spv::Error)) -> Self {
-        Self::SpirvError(shader_name.into(), err)
+impl From<(&str, shaderc::Error)> for RenderError {
+    fn from((shader_name, err): (&str, shaderc::Error)) -> Self {
+        Self::ShaderError(shader_name.into(), err)
     }
 }
diff --git a/voxygen/src/render/renderer.rs b/voxygen/src/render/renderer.rs
index b1daab7abe..820b1353d2 100644
--- a/voxygen/src/render/renderer.rs
+++ b/voxygen/src/render/renderer.rs
@@ -12,7 +12,6 @@ use pipeline_creation::{
     IngameAndShadowPipelines, InterfacePipelines, PipelineCreation, Pipelines, ShadowPipelines,
 };
 use shaders::Shaders;
-
 use shadow_map::{ShadowMap, ShadowMapRenderer};
 
 use super::{
diff --git a/voxygen/src/render/renderer/pipeline_creation.rs b/voxygen/src/render/renderer/pipeline_creation.rs
index 310ec72cbe..3ec6f4f479 100644
--- a/voxygen/src/render/renderer/pipeline_creation.rs
+++ b/voxygen/src/render/renderer/pipeline_creation.rs
@@ -13,39 +13,6 @@ use super::{
 use common_base::prof_span;
 use std::sync::Arc;
 
-/// Shader compiler
-pub struct Compiler {
-    glsl: naga::front::glsl::Parser,
-    validator: naga::valid::Validator,
-    spirv: naga::back::spv::Writer,
-}
-
-impl Compiler {
-    pub fn new() -> Self {
-        use naga::{
-            back::spv,
-            front::glsl,
-            valid::{Capabilities, ValidationFlags, Validator},
-        };
-
-        let glsl = glsl::Parser::default();
-        let validator = Validator::new(ValidationFlags::all(), Capabilities::all());
-        let options = spv::Options {
-            flags: spv::WriterFlags::DEBUG,
-            ..Default::default()
-        };
-        let spirv = spv::Writer::new(&options)
-            // Only happens if the options are invalid
-            .expect("Failed to create spirv emitter");
-
-        Compiler {
-            glsl,
-            validator,
-            spirv,
-        }
-    }
-}
-
 /// All the pipelines
 pub struct Pipelines {
     pub debug: debug::DebugPipeline,
@@ -164,6 +131,7 @@ impl ShaderModules {
         has_shadow_views: bool,
     ) -> Result<Self, RenderError> {
         prof_span!(_guard, "ShaderModules::new");
+        use shaderc::{CompileOptions, Compiler, OptimizationLevel, ResolvedInclude, ShaderKind};
 
         let constants = shaders.get("include.constants").unwrap();
         let globals = shaders.get("include.globals").unwrap();
@@ -248,30 +216,41 @@ impl ShaderModules {
             })
             .unwrap();
 
-        let mut context = glsl_include::Context::new();
-        context.include("constants.glsl", &constants);
-        context.include("globals.glsl", &globals.0);
-        context.include("shadows.glsl", &shadows.0);
-        context.include("sky.glsl", &sky.0);
-        context.include("light.glsl", &light.0);
-        context.include("srgb.glsl", &srgb.0);
-        context.include("random.glsl", &random.0);
-        context.include("lod.glsl", &lod.0);
-        context.include("anti-aliasing.glsl", &anti_alias.0);
-        context.include("cloud.glsl", &cloud.0);
+        let mut compiler = Compiler::new().ok_or(RenderError::ErrorInitializingCompiler)?;
+        let mut options = CompileOptions::new().ok_or(RenderError::ErrorInitializingCompiler)?;
+        options.set_optimization_level(OptimizationLevel::Performance);
+        options.set_forced_version_profile(430, shaderc::GlslProfile::Core);
+        options.set_include_callback(move |name, _, shader_name, _| {
+            Ok(ResolvedInclude {
+                resolved_name: name.to_string(),
+                content: match name {
+                    "constants.glsl" => constants.clone(),
+                    "globals.glsl" => globals.0.to_owned(),
+                    "shadows.glsl" => shadows.0.to_owned(),
+                    "sky.glsl" => sky.0.to_owned(),
+                    "light.glsl" => light.0.to_owned(),
+                    "srgb.glsl" => srgb.0.to_owned(),
+                    "random.glsl" => random.0.to_owned(),
+                    "lod.glsl" => lod.0.to_owned(),
+                    "anti-aliasing.glsl" => anti_alias.0.to_owned(),
+                    "cloud.glsl" => cloud.0.to_owned(),
+                    other => {
+                        return Err(format!(
+                            "Include {} in {} is not defined",
+                            other, shader_name
+                        ));
+                    },
+                },
+            })
+        });
 
-        let mut compiler = Compiler::new();
-
-        let mut create_shader = |name, stage| {
+        let mut create_shader = |name, kind| {
             let glsl = &shaders
                 .get(name)
                 .unwrap_or_else(|| panic!("Can't retrieve shader: {}", name))
                 .0;
             let file_name = format!("{}.glsl", name);
-            let source = context
-                .expand(glsl)
-                .map_err(|err| (file_name.as_str(), err))?;
-            create_shader_module(device, &file_name, &source, stage, &mut compiler)
+            create_shader_module(device, &mut compiler, glsl, kind, &file_name, &options)
         };
 
         let selected_fluid_shader = ["fluid-frag.", match pipeline_modes.fluid {
@@ -281,50 +260,47 @@ impl ShaderModules {
         .concat();
 
         Ok(Self {
+            skybox_vert: create_shader("skybox-vert", ShaderKind::Vertex)?,
+            skybox_frag: create_shader("skybox-frag", ShaderKind::Fragment)?,
+            debug_vert: create_shader("debug-vert", ShaderKind::Vertex)?,
+            debug_frag: create_shader("debug-frag", ShaderKind::Fragment)?,
+            figure_vert: create_shader("figure-vert", ShaderKind::Vertex)?,
+            figure_frag: create_shader("figure-frag", ShaderKind::Fragment)?,
+            terrain_vert: create_shader("terrain-vert", ShaderKind::Vertex)?,
+            terrain_frag: create_shader("terrain-frag", ShaderKind::Fragment)?,
+            fluid_vert: create_shader("fluid-vert", ShaderKind::Vertex)?,
+            fluid_frag: create_shader(&selected_fluid_shader, ShaderKind::Fragment)?,
+            sprite_vert: create_shader("sprite-vert", ShaderKind::Vertex)?,
+            sprite_frag: create_shader("sprite-frag", ShaderKind::Fragment)?,
+            particle_vert: create_shader("particle-vert", ShaderKind::Vertex)?,
+            particle_frag: create_shader("particle-frag", ShaderKind::Fragment)?,
+            ui_vert: create_shader("ui-vert", ShaderKind::Vertex)?,
+            ui_frag: create_shader("ui-frag", ShaderKind::Fragment)?,
+            lod_terrain_vert: create_shader("lod-terrain-vert", ShaderKind::Vertex)?,
+            lod_terrain_frag: create_shader("lod-terrain-frag", ShaderKind::Fragment)?,
+            clouds_vert: create_shader("clouds-vert", ShaderKind::Vertex)?,
+            clouds_frag: create_shader("clouds-frag", ShaderKind::Fragment)?,
             dual_downsample_filtered_frag: create_shader(
                 "dual-downsample-filtered-frag",
-                naga::ShaderStage::Fragment,
+                ShaderKind::Fragment,
             )?,
-            dual_downsample_frag: create_shader(
-                "dual-downsample-frag",
-                naga::ShaderStage::Fragment,
-            )?,
-            dual_upsample_frag: create_shader("dual-upsample-frag", naga::ShaderStage::Fragment)?,
-            skybox_vert: create_shader("skybox-vert", naga::ShaderStage::Vertex)?,
-            skybox_frag: create_shader("skybox-frag", naga::ShaderStage::Fragment)?,
-            debug_vert: create_shader("debug-vert", naga::ShaderStage::Vertex)?,
-            debug_frag: create_shader("debug-frag", naga::ShaderStage::Fragment)?,
-            figure_vert: create_shader("figure-vert", naga::ShaderStage::Vertex)?,
-            figure_frag: create_shader("figure-frag", naga::ShaderStage::Fragment)?,
-            terrain_vert: create_shader("terrain-vert", naga::ShaderStage::Vertex)?,
-            terrain_frag: create_shader("terrain-frag", naga::ShaderStage::Fragment)?,
-            fluid_vert: create_shader("fluid-vert", naga::ShaderStage::Vertex)?,
-            fluid_frag: create_shader(&selected_fluid_shader, naga::ShaderStage::Fragment)?,
-            sprite_vert: create_shader("sprite-vert", naga::ShaderStage::Vertex)?,
-            sprite_frag: create_shader("sprite-frag", naga::ShaderStage::Fragment)?,
-            particle_vert: create_shader("particle-vert", naga::ShaderStage::Vertex)?,
-            particle_frag: create_shader("particle-frag", naga::ShaderStage::Fragment)?,
-            ui_vert: create_shader("ui-vert", naga::ShaderStage::Vertex)?,
-            ui_frag: create_shader("ui-frag", naga::ShaderStage::Fragment)?,
-            lod_terrain_vert: create_shader("lod-terrain-vert", naga::ShaderStage::Vertex)?,
-            lod_terrain_frag: create_shader("lod-terrain-frag", naga::ShaderStage::Fragment)?,
-            clouds_vert: create_shader("clouds-vert", naga::ShaderStage::Vertex)?,
-            clouds_frag: create_shader("clouds-frag", naga::ShaderStage::Fragment)?,
-            postprocess_vert: create_shader("postprocess-vert", naga::ShaderStage::Vertex)?,
-            postprocess_frag: create_shader("postprocess-frag", naga::ShaderStage::Fragment)?,
-            blit_vert: create_shader("blit-vert", naga::ShaderStage::Vertex)?,
-            blit_frag: create_shader("blit-frag", naga::ShaderStage::Fragment)?,
+            dual_downsample_frag: create_shader("dual-downsample-frag", ShaderKind::Fragment)?,
+            dual_upsample_frag: create_shader("dual-upsample-frag", ShaderKind::Fragment)?,
+            postprocess_vert: create_shader("postprocess-vert", ShaderKind::Vertex)?,
+            postprocess_frag: create_shader("postprocess-frag", ShaderKind::Fragment)?,
+            blit_vert: create_shader("blit-vert", ShaderKind::Vertex)?,
+            blit_frag: create_shader("blit-frag", ShaderKind::Fragment)?,
             point_light_shadows_vert: create_shader(
                 "point-light-shadows-vert",
-                naga::ShaderStage::Vertex,
+                ShaderKind::Vertex,
             )?,
             light_shadows_directed_vert: create_shader(
                 "light-shadows-directed-vert",
-                naga::ShaderStage::Vertex,
+                ShaderKind::Vertex,
             )?,
             light_shadows_figure_vert: create_shader(
                 "light-shadows-figure-vert",
-                naga::ShaderStage::Vertex,
+                ShaderKind::Vertex,
             )?,
         })
     }
@@ -332,57 +308,23 @@ impl ShaderModules {
 
 fn create_shader_module(
     device: &wgpu::Device,
-    file_name: &str,
+    compiler: &mut shaderc::Compiler,
     source: &str,
-    stage: naga::ShaderStage,
-    compiler: &mut Compiler,
+    kind: shaderc::ShaderKind,
+    file_name: &str,
+    options: &shaderc::CompileOptions,
 ) -> Result<wgpu::ShaderModule, RenderError> {
     prof_span!(_guard, "create_shader_modules");
+    use std::borrow::Cow;
 
-    use codespan_reporting::{
-        diagnostic::{Diagnostic, Label},
-        files::SimpleFile,
-        term::{
-            self,
-            termcolor::{ColorChoice, StandardStream},
-        },
-    };
-    use naga::front::glsl;
-
-    // Parse
-    let options = glsl::Options::from(stage);
-    let module = compiler.glsl.parse(&options, source).map_err(|errors| {
-        let files = SimpleFile::new(file_name, source);
-        let config = codespan_reporting::term::Config::default();
-        let writer = StandardStream::stderr(ColorChoice::Auto);
-
-        for err in errors {
-            let diagnostic = Diagnostic::error()
-                .with_message(err.kind.to_string())
-                .with_labels(vec![Label::primary((), err.meta)]);
-
-            let _ = term::emit(&mut writer.lock(), &config, &files, &diagnostic);
-        }
-
-        RenderError::ParserError(file_name.to_string())
-    })?;
-
-    // Validate
-    let info = compiler
-        .validator
-        .validate(&module)
-        .map_err(|err| (file_name, err))?;
-
-    // Emit
-    let mut spv = Vec::new();
-    compiler
-        .spirv
-        .write(&module, &info, &mut spv)
-        .map_err(|err| (file_name, err))?;
+    let spv = compiler
+        .compile_into_spirv(source, kind, file_name, "main", Some(options))
+        .map_err(|e| (file_name, e))?;
 
+    let label = [file_name, "\n\n", source].concat();
     Ok(device.create_shader_module(&wgpu::ShaderModuleDescriptor {
-        label: Some(file_name),
-        source: wgpu::ShaderSource::SpirV(spv.into()),
+        label: Some(&label),
+        source: wgpu::ShaderSource::SpirV(Cow::Borrowed(spv.as_binary())),
         flags: wgpu::ShaderFlags::empty(),
         // TODO: renable // flags: wgpu::ShaderFlags::VALIDATION,
     }))