2024-04-02 18:36:04 +00:00
|
|
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
|
|
|
2021-09-03 17:23:35 +00:00
|
|
|
use deno_core::error::AnyError;
|
|
|
|
use deno_core::ResourceId;
|
|
|
|
use serde::Serialize;
|
|
|
|
use std::convert::From;
|
2022-02-04 19:09:25 +00:00
|
|
|
use std::error::Error;
|
2021-09-03 17:23:35 +00:00
|
|
|
use std::fmt;
|
2024-06-28 11:33:02 +00:00
|
|
|
use std::fmt::Write;
|
2021-09-03 17:23:35 +00:00
|
|
|
use wgpu_core::binding_model::CreateBindGroupError;
|
|
|
|
use wgpu_core::binding_model::CreateBindGroupLayoutError;
|
|
|
|
use wgpu_core::binding_model::CreatePipelineLayoutError;
|
|
|
|
use wgpu_core::binding_model::GetBindGroupLayoutError;
|
2021-11-29 02:22:15 +00:00
|
|
|
use wgpu_core::command::ClearError;
|
2021-09-03 17:23:35 +00:00
|
|
|
use wgpu_core::command::CommandEncoderError;
|
|
|
|
use wgpu_core::command::ComputePassError;
|
|
|
|
use wgpu_core::command::CopyError;
|
|
|
|
use wgpu_core::command::CreateRenderBundleError;
|
|
|
|
use wgpu_core::command::QueryError;
|
|
|
|
use wgpu_core::command::RenderBundleError;
|
|
|
|
use wgpu_core::command::RenderPassError;
|
|
|
|
use wgpu_core::device::queue::QueueSubmitError;
|
|
|
|
use wgpu_core::device::queue::QueueWriteError;
|
|
|
|
use wgpu_core::device::DeviceError;
|
|
|
|
use wgpu_core::pipeline::CreateComputePipelineError;
|
|
|
|
use wgpu_core::pipeline::CreateRenderPipelineError;
|
|
|
|
use wgpu_core::pipeline::CreateShaderModuleError;
|
2023-01-09 15:44:20 +00:00
|
|
|
use wgpu_core::present::ConfigureSurfaceError;
|
2021-09-03 17:23:35 +00:00
|
|
|
use wgpu_core::resource::BufferAccessError;
|
|
|
|
use wgpu_core::resource::CreateBufferError;
|
|
|
|
use wgpu_core::resource::CreateQuerySetError;
|
|
|
|
use wgpu_core::resource::CreateSamplerError;
|
|
|
|
use wgpu_core::resource::CreateTextureError;
|
|
|
|
use wgpu_core::resource::CreateTextureViewError;
|
|
|
|
|
2022-02-04 19:09:25 +00:00
|
|
|
fn fmt_err(err: &(dyn Error + 'static)) -> String {
|
2022-03-19 05:31:10 +00:00
|
|
|
let mut output = err.to_string();
|
2024-06-28 11:33:02 +00:00
|
|
|
let mut level = 0;
|
2022-02-04 19:09:25 +00:00
|
|
|
|
2024-06-28 11:33:02 +00:00
|
|
|
fn print_tree(output: &mut String, level: &mut usize, e: &(dyn Error + 'static)) {
|
|
|
|
let mut print = |e: &(dyn Error + 'static)| {
|
|
|
|
writeln!(output, "{}{}", " ".repeat(*level * 2), e).unwrap();
|
|
|
|
|
|
|
|
if let Some(e) = e.source() {
|
|
|
|
*level += 1;
|
|
|
|
print_tree(output, level, e);
|
|
|
|
*level -= 1;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
if let Some(multi) = e.downcast_ref::<wgpu_core::error::MultiError>() {
|
|
|
|
for e in multi.errors() {
|
|
|
|
print(e);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
print(e);
|
|
|
|
}
|
2022-02-04 19:09:25 +00:00
|
|
|
}
|
|
|
|
|
2024-06-28 11:33:02 +00:00
|
|
|
print_tree(&mut output, &mut level, err);
|
|
|
|
|
2022-02-04 19:09:25 +00:00
|
|
|
output
|
|
|
|
}
|
|
|
|
|
2021-09-03 17:23:35 +00:00
|
|
|
#[derive(Serialize)]
|
|
|
|
pub struct WebGpuResult {
|
|
|
|
pub rid: Option<ResourceId>,
|
|
|
|
pub err: Option<WebGpuError>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl WebGpuResult {
|
2024-08-18 10:38:12 +00:00
|
|
|
#[must_use]
|
2021-09-03 17:23:35 +00:00
|
|
|
pub fn rid(rid: ResourceId) -> Self {
|
|
|
|
Self {
|
|
|
|
rid: Some(rid),
|
|
|
|
err: None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-18 10:38:12 +00:00
|
|
|
#[must_use]
|
2021-09-03 17:23:35 +00:00
|
|
|
pub fn rid_err<T: Into<WebGpuError>>(rid: ResourceId, err: Option<T>) -> Self {
|
|
|
|
Self {
|
|
|
|
rid: Some(rid),
|
2022-03-24 17:20:10 +00:00
|
|
|
err: err.map(Into::into),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-18 10:38:12 +00:00
|
|
|
#[must_use]
|
2021-09-03 17:23:35 +00:00
|
|
|
pub fn maybe_err<T: Into<WebGpuError>>(err: Option<T>) -> Self {
|
|
|
|
Self {
|
|
|
|
rid: None,
|
2022-03-24 17:20:10 +00:00
|
|
|
err: err.map(Into::into),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-18 10:38:12 +00:00
|
|
|
#[must_use]
|
2021-09-03 17:23:35 +00:00
|
|
|
pub fn empty() -> Self {
|
|
|
|
Self {
|
|
|
|
rid: None,
|
|
|
|
err: None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Serialize)]
|
|
|
|
#[serde(tag = "type", content = "value")]
|
|
|
|
#[serde(rename_all = "kebab-case")]
|
|
|
|
pub enum WebGpuError {
|
|
|
|
Lost,
|
|
|
|
OutOfMemory,
|
|
|
|
Validation(String),
|
2024-04-02 18:36:04 +00:00
|
|
|
Internal,
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateBufferError> for WebGpuError {
|
|
|
|
fn from(err: CreateBufferError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateBufferError::Device(err) => err.into(),
|
|
|
|
CreateBufferError::AccessError(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<DeviceError> for WebGpuError {
|
|
|
|
fn from(err: DeviceError) -> Self {
|
|
|
|
match err {
|
|
|
|
DeviceError::Lost => WebGpuError::Lost,
|
|
|
|
DeviceError::OutOfMemory => WebGpuError::OutOfMemory,
|
2023-11-20 07:41:52 +00:00
|
|
|
_ => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<BufferAccessError> for WebGpuError {
|
|
|
|
fn from(err: BufferAccessError) -> Self {
|
|
|
|
match err {
|
|
|
|
BufferAccessError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateBindGroupLayoutError> for WebGpuError {
|
|
|
|
fn from(err: CreateBindGroupLayoutError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateBindGroupLayoutError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreatePipelineLayoutError> for WebGpuError {
|
|
|
|
fn from(err: CreatePipelineLayoutError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreatePipelineLayoutError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateBindGroupError> for WebGpuError {
|
|
|
|
fn from(err: CreateBindGroupError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateBindGroupError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<RenderBundleError> for WebGpuError {
|
|
|
|
fn from(err: RenderBundleError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateRenderBundleError> for WebGpuError {
|
|
|
|
fn from(err: CreateRenderBundleError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CopyError> for WebGpuError {
|
|
|
|
fn from(err: CopyError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CommandEncoderError> for WebGpuError {
|
|
|
|
fn from(err: CommandEncoderError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<QueryError> for WebGpuError {
|
|
|
|
fn from(err: QueryError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<ComputePassError> for WebGpuError {
|
|
|
|
fn from(err: ComputePassError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateComputePipelineError> for WebGpuError {
|
|
|
|
fn from(err: CreateComputePipelineError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateComputePipelineError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<GetBindGroupLayoutError> for WebGpuError {
|
|
|
|
fn from(err: GetBindGroupLayoutError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateRenderPipelineError> for WebGpuError {
|
|
|
|
fn from(err: CreateRenderPipelineError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateRenderPipelineError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<RenderPassError> for WebGpuError {
|
|
|
|
fn from(err: RenderPassError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateSamplerError> for WebGpuError {
|
|
|
|
fn from(err: CreateSamplerError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateSamplerError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateShaderModuleError> for WebGpuError {
|
|
|
|
fn from(err: CreateShaderModuleError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateShaderModuleError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateTextureError> for WebGpuError {
|
|
|
|
fn from(err: CreateTextureError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateTextureError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateTextureViewError> for WebGpuError {
|
|
|
|
fn from(err: CreateTextureViewError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CreateQuerySetError> for WebGpuError {
|
|
|
|
fn from(err: CreateQuerySetError) -> Self {
|
|
|
|
match err {
|
|
|
|
CreateQuerySetError::Device(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<QueueSubmitError> for WebGpuError {
|
|
|
|
fn from(err: QueueSubmitError) -> Self {
|
|
|
|
match err {
|
|
|
|
QueueSubmitError::Queue(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<QueueWriteError> for WebGpuError {
|
|
|
|
fn from(err: QueueWriteError) -> Self {
|
|
|
|
match err {
|
|
|
|
QueueWriteError::Queue(err) => err.into(),
|
2022-02-04 19:09:25 +00:00
|
|
|
err => WebGpuError::Validation(fmt_err(&err)),
|
2021-09-03 17:23:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-29 02:22:15 +00:00
|
|
|
impl From<ClearError> for WebGpuError {
|
|
|
|
fn from(err: ClearError) -> Self {
|
2022-02-04 19:09:25 +00:00
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
2021-11-29 02:22:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-09 15:44:20 +00:00
|
|
|
impl From<ConfigureSurfaceError> for WebGpuError {
|
|
|
|
fn from(err: ConfigureSurfaceError) -> Self {
|
|
|
|
WebGpuError::Validation(fmt_err(&err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-03 17:23:35 +00:00
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct DomExceptionOperationError {
|
|
|
|
pub msg: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl DomExceptionOperationError {
|
2024-08-18 10:38:12 +00:00
|
|
|
#[must_use]
|
2021-09-03 17:23:35 +00:00
|
|
|
pub fn new(msg: &str) -> Self {
|
|
|
|
DomExceptionOperationError {
|
|
|
|
msg: msg.to_string(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for DomExceptionOperationError {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
f.pad(&self.msg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::error::Error for DomExceptionOperationError {}
|
|
|
|
|
2024-08-18 10:38:12 +00:00
|
|
|
#[must_use]
|
2021-09-03 17:23:35 +00:00
|
|
|
pub fn get_error_class_name(e: &AnyError) -> Option<&'static str> {
|
|
|
|
e.downcast_ref::<DomExceptionOperationError>()
|
|
|
|
.map(|_| "DOMExceptionOperationError")
|
|
|
|
}
|