diff --git a/wgpu/src/backend/direct.rs b/wgpu/src/backend/direct.rs index b417c2c248..7d742fd891 100644 --- a/wgpu/src/backend/direct.rs +++ b/wgpu/src/backend/direct.rs @@ -1410,7 +1410,9 @@ where fn unwrap_error_sink(self, error_sink: &ErrorSink, fallback: impl FnOnce() -> T) -> T { self.unwrap_or_else(|err| { let error_sink = error_sink.lock(); - error_sink.handle_error(crate::Error::from(err)); + error_sink.handle_error(crate::Error::ValidationError { + source: Box::new(err), + }); fallback() }) } @@ -1418,12 +1420,6 @@ where type ErrorSink = Arc>; -impl From for crate::Error { - fn from(err: E) -> Self { - crate::Error::ValidationError { source: err.into() } - } -} - struct ErrorSinkRaw { uncaptured_handler: Box, } @@ -1446,6 +1442,17 @@ impl Debug for ErrorSinkRaw { } fn default_error_handler(err: crate::Error) { - eprintln!("WGPU Error: {}", err); + eprintln!("wgpu error: {}\n", err); + + if err.source().is_some() { + eprintln!("Caused by:"); + let mut source_opt = err.source(); + while let Some(source) = source_opt { + eprintln!(" {}", source); + source_opt = source.source(); + } + eprintln!(); + } + panic!("Handling wgpu errors as fatal by default"); } diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 34d3e77178..e745a0bca3 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -2636,11 +2636,21 @@ pub enum Error { source: Box, }, } + +impl error::Error for Error { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + match self { + Error::OutOfMemoryError => None, + Error::ValidationError { source } => Some(source.as_ref()), + } + } +} + impl Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Error::OutOfMemoryError => f.write_str("Out of Memory"), - Error::ValidationError { source } => std::fmt::Display::fmt(source, f), + Error::ValidationError { .. } => f.write_str("Validation error"), } } }