From 5500435d2fc81d1e473a1b7e3ce02c2ff7924362 Mon Sep 17 00:00:00 2001 From: Joshua Yanovski 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 { 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 { 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, }))