From bd33d1d90247d7f6b110eaa14658eff5b75e8956 Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Tue, 13 Apr 2021 02:56:30 +0000 Subject: [PATCH] Error message improvements for shader compilation/gltf loading (#1786) - prints glsl compile error message in multiple lines instead of `thread 'main' panicked at 'called Result::unwrap() on an Err value: Compilation("glslang_shader_parse:\nInfo log:\nERROR: 0:335: \'assign\' : l-value required \"anon@7\" (can\'t modify a uniform)\nERROR: 0:335: \'\' : compilation terminated \nERROR: 2 compilation errors. No code generated.\n\n\nDebug log:\n\n")', crates/bevy_render/src/pipeline/pipeline_compiler.rs:161:22` - makes gltf error messages have more context New error: ```rust thread 'Compute Task Pool (5)' panicked at 'Shader compilation error: glslang_shader_parse: Info log: ERROR: 0:12: 'assign' : l-value required "anon@1" (can't modify a uniform) ERROR: 0:12: '' : compilation terminated ERROR: 2 compilation errors. No code generated. ', crates/bevy_render/src/pipeline/pipeline_compiler.rs:364:5 ``` These changes are a bit unrelated. I can open separate PRs if someone wants that. --- crates/bevy_gltf/src/loader.rs | 8 ++++---- .../bevy_render/src/pipeline/pipeline_compiler.rs | 13 +++++++++++-- crates/bevy_render/src/shader/shader.rs | 4 ++-- crates/bevy_render/src/texture/texture.rs | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/crates/bevy_gltf/src/loader.rs b/crates/bevy_gltf/src/loader.rs index 7631686b9f044b..c9ff4becb68b2b 100644 --- a/crates/bevy_gltf/src/loader.rs +++ b/crates/bevy_gltf/src/loader.rs @@ -39,7 +39,7 @@ use crate::{Gltf, GltfNode}; pub enum GltfError { #[error("unsupported primitive mode")] UnsupportedPrimitive { mode: Mode }, - #[error("invalid GLTF file")] + #[error("invalid GLTF file: {0}")] Gltf(#[from] gltf::Error), #[error("binary blob is missing")] MissingBlob, @@ -47,11 +47,11 @@ pub enum GltfError { Base64Decode(#[from] base64::DecodeError), #[error("unsupported buffer format")] BufferFormatUnsupported, - #[error("invalid image mime type")] + #[error("invalid image mime type: {0}")] InvalidImageMimeType(String), - #[error("failed to load an image")] + #[error("{0}")] ImageError(#[from] TextureError), - #[error("failed to load an asset path")] + #[error("failed to load an asset path: {0}")] AssetIoError(#[from] AssetIoError), } diff --git a/crates/bevy_render/src/pipeline/pipeline_compiler.rs b/crates/bevy_render/src/pipeline/pipeline_compiler.rs index b09d7ce8f2af28..d8cc2575c41b01 100644 --- a/crates/bevy_render/src/pipeline/pipeline_compiler.rs +++ b/crates/bevy_render/src/pipeline/pipeline_compiler.rs @@ -143,7 +143,7 @@ impl PipelineCompiler { &specialized_descriptor.shader_stages.vertex, &pipeline_specialization.shader_specialization, ) - .unwrap(); + .unwrap_or_else(|e| panic_shader_error(e)); specialized_descriptor.shader_stages.vertex = specialized_vertex_shader.clone_weak(); let mut specialized_fragment_shader = None; specialized_descriptor.shader_stages.fragment = specialized_descriptor @@ -158,7 +158,7 @@ impl PipelineCompiler { fragment, &pipeline_specialization.shader_specialization, ) - .unwrap(); + .unwrap_or_else(|e| panic_shader_error(e)); specialized_fragment_shader = Some(shader.clone_weak()); shader }); @@ -356,3 +356,12 @@ impl PipelineCompiler { Ok(()) } } + +fn panic_shader_error(error: ShaderError) -> ! { + let msg = error.to_string(); + let msg = msg + .trim_end() + .trim_end_matches("Debug log:") // if this matches, then there wasn't a debug log anyways + .trim_end(); + panic!("{}\n", msg); +} diff --git a/crates/bevy_render/src/shader/shader.rs b/crates/bevy_render/src/shader/shader.rs index 9672dfdfac1c6e..2e1d5b5f3611d8 100644 --- a/crates/bevy_render/src/shader/shader.rs +++ b/crates/bevy_render/src/shader/shader.rs @@ -24,12 +24,12 @@ pub enum ShaderStage { #[derive(Error, Debug)] pub enum ShaderError { /// Shader compilation error. - #[error("Shader compilation error: {0}")] + #[error("Shader compilation error:\n{0}")] Compilation(String), #[cfg(any(target_os = "ios", all(target_arch = "aarch64", target_os = "macos")))] /// shaderc error. - #[error("shaderc error")] + #[error("shaderc error: {}")] ShaderC(#[from] shaderc::Error), #[cfg(any(target_os = "ios", all(target_arch = "aarch64", target_os = "macos")))] diff --git a/crates/bevy_render/src/texture/texture.rs b/crates/bevy_render/src/texture/texture.rs index ecaad4f7dbf03c..8e0494244bbc91 100644 --- a/crates/bevy_render/src/texture/texture.rs +++ b/crates/bevy_render/src/texture/texture.rs @@ -287,7 +287,7 @@ pub enum TextureError { InvalidImageMimeType(String), #[error("invalid image extension")] InvalidImageExtension(String), - #[error("failed to load an image")] + #[error("failed to load an image: {0}")] ImageError(#[from] image::ImageError), }