DOESN'T WORK

I made this commit because I've accidentally broke this when rebasing
and deleted the veloren folder and don't want to write this for the 4th
time.

Please ignore this.
This commit is contained in:
João Capucho 2021-06-30 16:10:24 +01:00
parent 269c6171e4
commit 164bb4f87f
No known key found for this signature in database
GPG Key ID: 1AD5CE7CCAEBDA21
35 changed files with 240 additions and 136 deletions

71
Cargo.lock generated
View File

@ -1948,7 +1948,7 @@ dependencies = [
"khronos-egl",
"libloading 0.7.0",
"log",
"naga",
"naga 0.4.0",
"parking_lot 0.11.1",
"raw-window-handle",
"spirv_cross",
@ -1972,7 +1972,7 @@ dependencies = [
"gfx-hal",
"log",
"metal",
"naga",
"naga 0.4.0",
"objc",
"parking_lot 0.11.1",
"profiling",
@ -1995,7 +1995,7 @@ dependencies = [
"inplace_it",
"libloading 0.7.0",
"log",
"naga",
"naga 0.4.0",
"objc",
"parking_lot 0.11.1",
"raw-window-handle",
@ -2010,7 +2010,7 @@ version = "0.8.0"
source = "git+https://github.com/gfx-rs/gfx?rev=27a1dae3796d33d23812f2bb8c7e3b5aea18b521#27a1dae3796d33d23812f2bb8c7e3b5aea18b521"
dependencies = [
"bitflags",
"naga",
"naga 0.4.0",
"raw-window-handle",
"thiserror",
]
@ -2106,6 +2106,16 @@ 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"
@ -3080,6 +3090,22 @@ dependencies = [
"thiserror",
]
[[package]]
name = "naga"
version = "0.5.0"
source = "git+https://github.com/gfx-rs/naga.git?rev=607206f9a5cc33a8b1e7cec84663be6390e3be7f#607206f9a5cc33a8b1e7cec84663be6390e3be7f"
dependencies = [
"bit-set",
"bitflags",
"codespan-reporting",
"fxhash",
"log",
"num-traits",
"pp-rs",
"spirv_headers",
"thiserror",
]
[[package]]
name = "native-dialog"
version = "0.5.5"
@ -3845,6 +3871,15 @@ dependencies = [
"rand 0.8.3",
]
[[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"
@ -4746,26 +4781,6 @@ 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"
@ -6043,6 +6058,7 @@ dependencies = [
"bincode",
"bytemuck",
"chrono",
"codespan-reporting",
"comma",
"conrod_core",
"conrod_winit",
@ -6059,6 +6075,7 @@ dependencies = [
"euc",
"futures-executor",
"gilrs",
"glsl-include",
"glyph_brush",
"guillotiere",
"hashbrown 0.11.2",
@ -6068,6 +6085,7 @@ dependencies = [
"itertools 0.10.0",
"keyboard-keynames",
"lazy_static",
"naga 0.5.0",
"native-dialog",
"num 0.4.0",
"num_cpus",
@ -6078,7 +6096,6 @@ dependencies = [
"rodio",
"ron",
"serde",
"shaderc",
"specs",
"specs-idvs",
"strum",
@ -6680,7 +6697,7 @@ dependencies = [
"arrayvec",
"js-sys",
"log",
"naga",
"naga 0.4.0",
"parking_lot 0.11.1",
"raw-window-handle",
"serde",
@ -6712,7 +6729,7 @@ dependencies = [
"gpu-alloc",
"gpu-descriptor",
"log",
"naga",
"naga 0.4.0",
"parking_lot 0.11.1",
"profiling",
"raw-window-handle",

View File

@ -133,9 +133,8 @@ 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 = "607206f9a5cc33a8b1e7cec84663be6390e3be7f" }
# # 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" }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -98,8 +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);
// 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -53,7 +53,9 @@ 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"] }
shaderc = "0.6.2"
naga = { version = "0.5.0", features = ["glsl-in", "glsl-validate", "spv-out", "codespan-reporting"] }
glsl-include = "0.3.1"
codespan-reporting = "0.11.1"
# Ui
conrod_core = {git = "https://gitlab.com/veloren/conrod.git", branch="copypasta_0.7"}

View File

@ -6,8 +6,10 @@ pub enum RenderError {
SwapChainError(wgpu::SwapChainError),
CustomError(String),
CouldNotFindAdapter,
ErrorInitializingCompiler,
ShaderError(String, shaderc::Error),
GlslIncludeError(String, glsl_include::Error),
ParserError(String, naga::front::glsl::ParseError),
ValidationError(String, naga::valid::ValidationError),
SpirvError(String, naga::back::spv::Error),
}
use std::fmt;
@ -25,10 +27,24 @@ impl fmt::Debug for RenderError {
.finish(),
Self::CustomError(err) => f.debug_tuple("CustomError").field(err).finish(),
Self::CouldNotFindAdapter => f.debug_tuple("CouldNotFindAdapter").finish(),
Self::ErrorInitializingCompiler => f.debug_tuple("ErrorInitializingCompiler").finish(),
Self::ShaderError(shader_name, err) => write!(
Self::GlslIncludeError(shader_name, err) => write!(
f,
"\"{}\" shader failed to compile due to the following error: {}",
"\"{}\" shader contains invalid include directives: {}",
shader_name, err
),
Self::ParserError(shader_name, err) => write!(
f,
"\"{}\" shader failed to parse due to the following error: {}",
shader_name, err
),
Self::ValidationError(shader_name, err) => write!(
f,
"\"{}\" shader failed to validate due to the following error: {}",
shader_name, err
),
Self::SpirvError(shader_name, err) => write!(
f,
"\"{}\" shader failed to emit due to the following error: {}",
shader_name, err
),
}
@ -47,8 +63,24 @@ impl From<wgpu::SwapChainError> for RenderError {
fn from(err: wgpu::SwapChainError) -> Self { Self::SwapChainError(err) }
}
impl From<(&str, shaderc::Error)> for RenderError {
fn from((shader_name, err): (&str, shaderc::Error)) -> Self {
Self::ShaderError(shader_name.into(), 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::front::glsl::ParseError)> for RenderError {
fn from((shader_name, err): (&str, naga::front::glsl::ParseError)) -> Self {
Self::ParserError(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

@ -124,7 +124,6 @@ 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();
@ -191,41 +190,28 @@ impl ShaderModules {
})
.unwrap();
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 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 create_shader = |name, kind| {
let mut create_shader = |name, stage| {
let glsl = &shaders
.get(name)
.unwrap_or_else(|| panic!("Can't retrieve shader: {}", name))
.0;
let file_name = format!("{}.glsl", name);
create_shader_module(device, &mut compiler, glsl, kind, &file_name, &options)
let source = context
.expand(glsl)
.map_err(|err| (file_name.as_str(), err))?;
create_shader_module(device, &file_name, &source, stage)
};
let selected_fluid_shader = ["fluid-frag.", match mode.fluid {
@ -235,41 +221,41 @@ 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)?,
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)?,
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)?,
point_light_shadows_vert: create_shader(
"point-light-shadows-vert",
ShaderKind::Vertex,
naga::ShaderStage::Vertex,
)?,
light_shadows_directed_vert: create_shader(
"light-shadows-directed-vert",
ShaderKind::Vertex,
naga::ShaderStage::Vertex,
)?,
light_shadows_figure_vert: create_shader(
"light-shadows-figure-vert",
ShaderKind::Vertex,
naga::ShaderStage::Vertex,
)?,
})
}
@ -277,23 +263,91 @@ impl ShaderModules {
fn create_shader_module(
device: &wgpu::Device,
compiler: &mut shaderc::Compiler,
source: &str,
kind: shaderc::ShaderKind,
file_name: &str,
options: &shaderc::CompileOptions,
source: &str,
stage: naga::ShaderStage,
) -> Result<wgpu::ShaderModule, RenderError> {
prof_span!(_guard, "create_shader_modules");
use std::borrow::Cow;
let spv = compiler
.compile_into_spirv(source, kind, file_name, "main", Some(options))
.map_err(|e| (file_name, e))?;
use codespan_reporting::{
diagnostic::{Diagnostic, Label},
files::SimpleFile,
term::{
self,
termcolor::{ColorChoice, StandardStream},
},
};
use naga::{
back::spv,
front::glsl,
valid::{Capabilities, ValidationFlags, Validator},
};
use std::error::Error;
// Parse
let mut options = glsl::Options::default();
options.entry_points.insert("main".to_string(), stage);
let module = glsl::parse_str(source, &options).map_err(|err| {
let diagnostic = match err.kind.metadata() {
Some(metadata) => Diagnostic::error()
.with_message(err.kind.to_string())
.with_labels(vec![Label::primary((), metadata.start..metadata.end)]),
None => Diagnostic::error().with_message(err.kind.to_string()),
};
let files = SimpleFile::new(file_name, source);
let config = codespan_reporting::term::Config::default();
let writer = StandardStream::stderr(ColorChoice::Auto);
let _ = term::emit(&mut writer.lock(), &config, &files, &diagnostic);
(file_name, err)
})?;
// Validate
let info = Validator::new(ValidationFlags::all(), Capabilities::all())
.validate(&module)
.map_err(|err| {
eprint!("{}", err);
let mut e = err.source();
if e.is_some() {
eprintln!(": ");
} else {
eprintln!();
}
while let Some(source) = e {
eprintln!("\t{}", source);
e = source.source();
}
(file_name, err)
})?;
// Emit
let spv_options = spv::Options::default();
let spv = spv::write_vec(&module, &info, &spv_options).map_err(|err| {
eprint!("{}", err);
let mut e = err.source();
if e.is_some() {
eprintln!(": ");
} else {
eprintln!();
}
while let Some(source) = e {
eprintln!("\t{}", source);
e = source.source();
}
(file_name, err)
})?;
let label = [file_name, "\n\n", source].concat();
Ok(device.create_shader_module(&wgpu::ShaderModuleDescriptor {
label: Some(&label),
source: wgpu::ShaderSource::SpirV(Cow::Borrowed(spv.as_binary())),
source: wgpu::ShaderSource::SpirV(spv.into()),
flags: wgpu::ShaderFlags::empty(),
// TODO: renable // flags: wgpu::ShaderFlags::VALIDATION,
}))