diff options
author | Martin Robinson <mrobinson@igalia.com> | 2025-04-04 10:06:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-04 08:06:07 +0000 |
commit | 0d693114ad4f27a07a3cd18c4c34da53be55d1bc (patch) | |
tree | 35d4382e088703434cb6b109b3a4bd9476c8ccf6 /components/shared/webgpu/error.rs | |
parent | df9efde1c377f0ff701fdd72814b628e73397464 (diff) | |
download | servo-0d693114ad4f27a07a3cd18c4c34da53be55d1bc.tar.gz servo-0d693114ad4f27a07a3cd18c4c34da53be55d1bc.zip |
webgpu: Add a `webgpu_traits` crate (#36320)
This breaks the `script_traits` dependency on `webgpu`. In general, the
`traits` crates shouldn't depend on Servo non-`traits` crates. This is
necessary to move "script to constellation" messages to the
`constellation_traits` crate, making it the entire API for talking to
the
constellation. This will break a circular dependency when that happens.
Testing: Successfully building is enough of a test for this one as
it is mainly moving types around.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Diffstat (limited to 'components/shared/webgpu/error.rs')
-rw-r--r-- | components/shared/webgpu/error.rs | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/components/shared/webgpu/error.rs b/components/shared/webgpu/error.rs new file mode 100644 index 00000000000..4669a605840 --- /dev/null +++ b/components/shared/webgpu/error.rs @@ -0,0 +1,97 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +//! Error scopes and GPUError types + +use std::fmt; + +use serde::{Deserialize, Serialize}; +use wgpu_core::device::DeviceError; + +/// <https://www.w3.org/TR/webgpu/#gpu-error-scope> +#[derive(Clone, Debug, Eq, Hash, PartialEq)] +pub struct ErrorScope { + pub errors: Vec<Error>, + pub filter: ErrorFilter, +} + +impl ErrorScope { + pub fn new(filter: ErrorFilter) -> Self { + Self { + filter, + errors: Vec::new(), + } + } +} + +/// <https://www.w3.org/TR/webgpu/#enumdef-gpuerrorfilter> +#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] +pub enum ErrorFilter { + Validation, + OutOfMemory, + Internal, +} + +/// <https://www.w3.org/TR/webgpu/#gpuerror> +#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] +pub enum Error { + Validation(String), + OutOfMemory(String), + Internal(String), +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + None + } +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.message()) + } +} + +impl Error { + pub fn filter(&self) -> ErrorFilter { + match self { + Error::Validation(_) => ErrorFilter::Validation, + Error::OutOfMemory(_) => ErrorFilter::OutOfMemory, + Error::Internal(_) => ErrorFilter::Internal, + } + } + + pub fn message(&self) -> &str { + match self { + Error::Validation(m) => m, + Error::OutOfMemory(m) => m, + Error::Internal(m) => m, + } + } + + // TODO: labels + // based on https://github.com/gfx-rs/wgpu/blob/trunk/wgpu/src/backend/wgpu_core.rs#L289 + pub fn from_error<E: std::error::Error + 'static>(error: E) -> Self { + let mut source_opt: Option<&(dyn std::error::Error + 'static)> = Some(&error); + while let Some(source) = source_opt { + if let Some(DeviceError::OutOfMemory) = source.downcast_ref::<DeviceError>() { + return Self::OutOfMemory(error.to_string()); + } + source_opt = source.source(); + } + // TODO: This hack is needed because there are + // multiple OutOfMemory error variant in wgpu-core + // and even upstream does not handle them correctly + if format!("{error:?}").contains("OutOfMemory") { + return Self::OutOfMemory(error.to_string()); + } + Self::Validation(error.to_string()) + } +} + +#[derive(Clone, Copy, Debug, Deserialize, Serialize)] +pub enum PopError { + Lost, + Empty, +} |