Revert "Replace shaderc with naga"

This reverts commit 446d93dda0.
This commit is contained in:
Joshua Yanovski 2021-09-04 11:59:18 -07:00
parent 896d9299e5
commit 5500435d2f
39 changed files with 145 additions and 286 deletions

81
Cargo.lock generated
View File

@ -2023,7 +2023,7 @@ dependencies = [
"khronos-egl", "khronos-egl",
"libloading 0.7.0", "libloading 0.7.0",
"log", "log",
"naga 0.4.0", "naga",
"parking_lot 0.11.1", "parking_lot 0.11.1",
"raw-window-handle", "raw-window-handle",
"spirv_cross", "spirv_cross",
@ -2047,7 +2047,7 @@ dependencies = [
"gfx-hal", "gfx-hal",
"log", "log",
"metal", "metal",
"naga 0.4.0", "naga",
"objc", "objc",
"parking_lot 0.11.1", "parking_lot 0.11.1",
"profiling", "profiling",
@ -2070,7 +2070,7 @@ dependencies = [
"inplace_it", "inplace_it",
"libloading 0.7.0", "libloading 0.7.0",
"log", "log",
"naga 0.4.0", "naga",
"objc", "objc",
"parking_lot 0.11.1", "parking_lot 0.11.1",
"raw-window-handle", "raw-window-handle",
@ -2085,7 +2085,7 @@ version = "0.8.0"
source = "git+https://github.com/gfx-rs/gfx?rev=27a1dae3796d33d23812f2bb8c7e3b5aea18b521#27a1dae3796d33d23812f2bb8c7e3b5aea18b521" source = "git+https://github.com/gfx-rs/gfx?rev=27a1dae3796d33d23812f2bb8c7e3b5aea18b521#27a1dae3796d33d23812f2bb8c7e3b5aea18b521"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"naga 0.4.0", "naga",
"raw-window-handle", "raw-window-handle",
"thiserror", "thiserror",
] ]
@ -2175,16 +2175,6 @@ dependencies = [
"web-sys", "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]] [[package]]
name = "glyph_brush" name = "glyph_brush"
version = "0.7.2" version = "0.7.2"
@ -3212,22 +3202,6 @@ dependencies = [
"thiserror", "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]] [[package]]
name = "native-dialog" name = "native-dialog"
version = "0.5.5" version = "0.5.5"
@ -3949,15 +3923,6 @@ dependencies = [
"rand 0.8.4", "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]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
version = "0.2.10" version = "0.2.10"
@ -4883,6 +4848,26 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 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]] [[package]]
name = "sharded-slab" name = "sharded-slab"
version = "0.1.1" version = "0.1.1"
@ -5138,16 +5123,6 @@ dependencies = [
"winapi 0.3.9", "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]] [[package]]
name = "spirv_cross" name = "spirv_cross"
version = "0.23.1" version = "0.23.1"
@ -6183,7 +6158,6 @@ dependencies = [
"bytemuck", "bytemuck",
"chrono", "chrono",
"chumsky", "chumsky",
"codespan-reporting",
"conrod_core", "conrod_core",
"conrod_winit", "conrod_winit",
"copy_dir", "copy_dir",
@ -6201,7 +6175,6 @@ dependencies = [
"enum-iterator", "enum-iterator",
"euc", "euc",
"gilrs", "gilrs",
"glsl-include",
"glyph_brush", "glyph_brush",
"guillotiere", "guillotiere",
"hashbrown 0.11.2", "hashbrown 0.11.2",
@ -6212,7 +6185,6 @@ dependencies = [
"keyboard-keynames", "keyboard-keynames",
"lazy_static", "lazy_static",
"mumble-link", "mumble-link",
"naga 0.6.0",
"native-dialog", "native-dialog",
"num 0.4.0", "num 0.4.0",
"num_cpus", "num_cpus",
@ -6223,6 +6195,7 @@ dependencies = [
"rodio", "rodio",
"ron", "ron",
"serde", "serde",
"shaderc",
"specs", "specs",
"specs-idvs", "specs-idvs",
"strum", "strum",
@ -6803,7 +6776,7 @@ dependencies = [
"arrayvec", "arrayvec",
"js-sys", "js-sys",
"log", "log",
"naga 0.4.0", "naga",
"parking_lot 0.11.1", "parking_lot 0.11.1",
"raw-window-handle", "raw-window-handle",
"serde", "serde",
@ -6835,7 +6808,7 @@ dependencies = [
"gpu-alloc", "gpu-alloc",
"gpu-descriptor", "gpu-descriptor",
"log", "log",
"naga 0.4.0", "naga",
"parking_lot 0.11.1", "parking_lot 0.11.1",
"profiling", "profiling",
"raw-window-handle", "raw-window-handle",

View File

@ -136,8 +136,9 @@ nativeBuildInputs = ["pkg-config"]
vek = { git = "https://gitlab.com/veloren/vek.git", branch = "fix_intrinsics2" } vek = { git = "https://gitlab.com/veloren/vek.git", branch = "fix_intrinsics2" }
# patch wgpu so we can use wgpu-profiler crate # patch wgpu so we can use wgpu-profiler crate
wgpu = { git = "https://github.com/gfx-rs/wgpu.git", rev = "a92b8549a8e2cb9dac781bafc5ed32828f3caf46" } 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) # # 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-hal = { git = "https://github.com/gfx-rs/gfx.git", rev = "e305dcca3557923a6a8810162d8dd09cb45a43a6" }
# gfx-backend-empty = { git = "https://github.com/gfx-rs/gfx.git", rev = "e305dcca3557923a6a8810162d8dd09cb45a43a6" } # gfx-backend-empty = { git = "https://github.com/gfx-rs/gfx.git", rev = "e305dcca3557923a6a8810162d8dd09cb45a43a6" }

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
layout(set = 0, binding = 0) layout(set = 0, binding = 0)
uniform texture2D t_src_color; uniform texture2D t_src_color;

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
layout(location = 0) out vec2 uv; layout(location = 0) out vec2 uv;

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <globals.glsl> #include <globals.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <globals.glsl> #include <globals.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
layout(set = 0, binding = 0) layout(set = 0, binding = 0)
uniform texture2D t_src_color; uniform texture2D t_src_color;

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
layout(set = 0, binding = 0) layout(set = 0, binding = 0)
uniform texture2D t_src_color; uniform texture2D t_src_color;

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
layout(set = 0, binding = 0) layout(set = 0, binding = 0)
uniform texture2D t_src_color; uniform texture2D t_src_color;

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#define FIGURE_SHADER #define FIGURE_SHADER

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -98,5 +98,8 @@ vec4 rand_perm_4(vec4 pos) {
vec3 smooth_rand(vec3 pos, float lerp_axis) { 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))); 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 #endif

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
// #extension ARB_texture_storage : enable // #extension ARB_texture_storage : enable
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
// #extension ARB_texture_storage : enable // #extension ARB_texture_storage : enable
#define FIGURE_SHADER #define FIGURE_SHADER

View File

@ -2,7 +2,7 @@
// //
// However, in the future we might apply some depth transforms here. // However, in the future we might apply some depth transforms here.
#version 460 core #version 420 core
// #extension ARB_texture_storage : enable // #extension ARB_texture_storage : enable
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
// #extension ARB_texture_storage : enable // #extension ARB_texture_storage : enable
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
// #extension GL_ARB_texture_storage : require // #extension GL_ARB_texture_storage : require
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <constants.glsl> #include <constants.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <globals.glsl> #include <globals.glsl>

View File

@ -1,4 +1,4 @@
#version 460 core #version 420 core
#include <globals.glsl> #include <globals.glsl>

View File

@ -55,9 +55,7 @@ winit = {version = "0.25.0", features = ["serde"]}
wgpu = { version = "=0.8.0", features = ["trace", "cross"] } wgpu = { version = "=0.8.0", features = ["trace", "cross"] }
wgpu-profiler = { git = "https://github.com/Imberflur/wgpu-profiler", tag = "wgpu-0.8" } wgpu-profiler = { git = "https://github.com/Imberflur/wgpu-profiler", tag = "wgpu-0.8" }
bytemuck = { version="1.4", features=["derive"] } bytemuck = { version="1.4", features=["derive"] }
naga = { version = "=0.6.0", features = ["glsl-in", "glsl-validate", "spv-out", "codespan-reporting"] } shaderc = "0.6.2"
glsl-include = "0.3.1"
codespan-reporting = "0.11.1"
# Ui # Ui
conrod_core = {git = "https://gitlab.com/veloren/conrod.git", branch="copypasta_0.7"} conrod_core = {git = "https://gitlab.com/veloren/conrod.git", branch="copypasta_0.7"}

View File

@ -6,13 +6,11 @@ pub enum RenderError {
SwapChainError(wgpu::SwapChainError), SwapChainError(wgpu::SwapChainError),
CustomError(String), CustomError(String),
CouldNotFindAdapter, CouldNotFindAdapter,
GlslIncludeError(String, glsl_include::Error), ErrorInitializingCompiler,
ParserError(String), ShaderError(String, shaderc::Error),
ValidationError(String, naga::valid::ValidationError),
SpirvError(String, naga::back::spv::Error),
} }
use std::{error::Error, fmt}; use std::fmt;
impl fmt::Debug for RenderError { impl fmt::Debug for RenderError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self { match self {
@ -27,56 +25,12 @@ impl fmt::Debug for RenderError {
.finish(), .finish(),
Self::CustomError(err) => f.debug_tuple("CustomError").field(err).finish(), Self::CustomError(err) => f.debug_tuple("CustomError").field(err).finish(),
Self::CouldNotFindAdapter => f.debug_tuple("CouldNotFindAdapter").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, f,
"\"{}\" shader contains invalid include directives: {}", "\"{}\" shader failed to compile due to the following error: {}",
shader_name, err 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) } fn from(err: wgpu::SwapChainError) -> Self { Self::SwapChainError(err) }
} }
impl From<(&str, glsl_include::Error)> for RenderError { impl From<(&str, shaderc::Error)> for RenderError {
fn from((shader_name, err): (&str, glsl_include::Error)) -> Self { fn from((shader_name, err): (&str, shaderc::Error)) -> Self {
Self::GlslIncludeError(shader_name.into(), err) Self::ShaderError(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)
} }
} }

View File

@ -12,7 +12,6 @@ use pipeline_creation::{
IngameAndShadowPipelines, InterfacePipelines, PipelineCreation, Pipelines, ShadowPipelines, IngameAndShadowPipelines, InterfacePipelines, PipelineCreation, Pipelines, ShadowPipelines,
}; };
use shaders::Shaders; use shaders::Shaders;
use shadow_map::{ShadowMap, ShadowMapRenderer}; use shadow_map::{ShadowMap, ShadowMapRenderer};
use super::{ use super::{

View File

@ -13,39 +13,6 @@ use super::{
use common_base::prof_span; use common_base::prof_span;
use std::sync::Arc; 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 /// All the pipelines
pub struct Pipelines { pub struct Pipelines {
pub debug: debug::DebugPipeline, pub debug: debug::DebugPipeline,
@ -164,6 +131,7 @@ impl ShaderModules {
has_shadow_views: bool, has_shadow_views: bool,
) -> Result<Self, RenderError> { ) -> Result<Self, RenderError> {
prof_span!(_guard, "ShaderModules::new"); prof_span!(_guard, "ShaderModules::new");
use shaderc::{CompileOptions, Compiler, OptimizationLevel, ResolvedInclude, ShaderKind};
let constants = shaders.get("include.constants").unwrap(); let constants = shaders.get("include.constants").unwrap();
let globals = shaders.get("include.globals").unwrap(); let globals = shaders.get("include.globals").unwrap();
@ -248,30 +216,41 @@ impl ShaderModules {
}) })
.unwrap(); .unwrap();
let mut context = glsl_include::Context::new(); let mut compiler = Compiler::new().ok_or(RenderError::ErrorInitializingCompiler)?;
context.include("constants.glsl", &constants); let mut options = CompileOptions::new().ok_or(RenderError::ErrorInitializingCompiler)?;
context.include("globals.glsl", &globals.0); options.set_optimization_level(OptimizationLevel::Performance);
context.include("shadows.glsl", &shadows.0); options.set_forced_version_profile(430, shaderc::GlslProfile::Core);
context.include("sky.glsl", &sky.0); options.set_include_callback(move |name, _, shader_name, _| {
context.include("light.glsl", &light.0); Ok(ResolvedInclude {
context.include("srgb.glsl", &srgb.0); resolved_name: name.to_string(),
context.include("random.glsl", &random.0); content: match name {
context.include("lod.glsl", &lod.0); "constants.glsl" => constants.clone(),
context.include("anti-aliasing.glsl", &anti_alias.0); "globals.glsl" => globals.0.to_owned(),
context.include("cloud.glsl", &cloud.0); "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, kind| {
let mut create_shader = |name, stage| {
let glsl = &shaders let glsl = &shaders
.get(name) .get(name)
.unwrap_or_else(|| panic!("Can't retrieve shader: {}", name)) .unwrap_or_else(|| panic!("Can't retrieve shader: {}", name))
.0; .0;
let file_name = format!("{}.glsl", name); let file_name = format!("{}.glsl", name);
let source = context create_shader_module(device, &mut compiler, glsl, kind, &file_name, &options)
.expand(glsl)
.map_err(|err| (file_name.as_str(), err))?;
create_shader_module(device, &file_name, &source, stage, &mut compiler)
}; };
let selected_fluid_shader = ["fluid-frag.", match pipeline_modes.fluid { let selected_fluid_shader = ["fluid-frag.", match pipeline_modes.fluid {
@ -281,50 +260,47 @@ impl ShaderModules {
.concat(); .concat();
Ok(Self { 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: create_shader(
"dual-downsample-filtered-frag", "dual-downsample-filtered-frag",
naga::ShaderStage::Fragment, ShaderKind::Fragment,
)?, )?,
dual_downsample_frag: create_shader( dual_downsample_frag: create_shader("dual-downsample-frag", ShaderKind::Fragment)?,
"dual-downsample-frag", dual_upsample_frag: create_shader("dual-upsample-frag", ShaderKind::Fragment)?,
naga::ShaderStage::Fragment, postprocess_vert: create_shader("postprocess-vert", ShaderKind::Vertex)?,
)?, postprocess_frag: create_shader("postprocess-frag", ShaderKind::Fragment)?,
dual_upsample_frag: create_shader("dual-upsample-frag", naga::ShaderStage::Fragment)?, blit_vert: create_shader("blit-vert", ShaderKind::Vertex)?,
skybox_vert: create_shader("skybox-vert", naga::ShaderStage::Vertex)?, blit_frag: create_shader("blit-frag", ShaderKind::Fragment)?,
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)?,
point_light_shadows_vert: create_shader( point_light_shadows_vert: create_shader(
"point-light-shadows-vert", "point-light-shadows-vert",
naga::ShaderStage::Vertex, ShaderKind::Vertex,
)?, )?,
light_shadows_directed_vert: create_shader( light_shadows_directed_vert: create_shader(
"light-shadows-directed-vert", "light-shadows-directed-vert",
naga::ShaderStage::Vertex, ShaderKind::Vertex,
)?, )?,
light_shadows_figure_vert: create_shader( light_shadows_figure_vert: create_shader(
"light-shadows-figure-vert", "light-shadows-figure-vert",
naga::ShaderStage::Vertex, ShaderKind::Vertex,
)?, )?,
}) })
} }
@ -332,57 +308,23 @@ impl ShaderModules {
fn create_shader_module( fn create_shader_module(
device: &wgpu::Device, device: &wgpu::Device,
file_name: &str, compiler: &mut shaderc::Compiler,
source: &str, source: &str,
stage: naga::ShaderStage, kind: shaderc::ShaderKind,
compiler: &mut Compiler, file_name: &str,
options: &shaderc::CompileOptions,
) -> Result<wgpu::ShaderModule, RenderError> { ) -> Result<wgpu::ShaderModule, RenderError> {
prof_span!(_guard, "create_shader_modules"); prof_span!(_guard, "create_shader_modules");
use std::borrow::Cow;
use codespan_reporting::{ let spv = compiler
diagnostic::{Diagnostic, Label}, .compile_into_spirv(source, kind, file_name, "main", Some(options))
files::SimpleFile, .map_err(|e| (file_name, e))?;
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 label = [file_name, "\n\n", source].concat();
Ok(device.create_shader_module(&wgpu::ShaderModuleDescriptor { Ok(device.create_shader_module(&wgpu::ShaderModuleDescriptor {
label: Some(file_name), label: Some(&label),
source: wgpu::ShaderSource::SpirV(spv.into()), source: wgpu::ShaderSource::SpirV(Cow::Borrowed(spv.as_binary())),
flags: wgpu::ShaderFlags::empty(), flags: wgpu::ShaderFlags::empty(),
// TODO: renable // flags: wgpu::ShaderFlags::VALIDATION, // TODO: renable // flags: wgpu::ShaderFlags::VALIDATION,
})) }))