Skip to content

Commit 2722999

Browse files
WIP: fix(deno)!: make create*PipelineAsync errors reject on the Promise
1 parent 7b3da03 commit 2722999

1 file changed

Lines changed: 38 additions & 10 deletions

File tree

deno_webgpu/device.rs

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ use std::num::NonZeroU64;
66
use std::rc::Rc;
77

88
use deno_core::cppgc::{make_cppgc_object, SameObject};
9-
use deno_core::op2;
109
use deno_core::v8;
1110
use deno_core::webidl::WebIdlInterfaceConverter;
1211
use deno_core::GarbageCollected;
12+
use deno_core::{anyhow, op2};
1313
use deno_error::JsErrorBox;
1414
use wgpu_core::binding_model::BindingResource;
15-
use wgpu_core::pipeline::ProgrammableStageDescriptor;
15+
use wgpu_core::pipeline::{
16+
CreateRenderPipelineError, ProgrammableStageDescriptor,
17+
};
1618
use wgpu_types::BindingType;
1719

1820
use super::bind_group::GPUBindGroup;
@@ -29,7 +31,10 @@ use crate::adapter::GPUAdapterInfo;
2931
use crate::adapter::GPUSupportedFeatures;
3032
use crate::adapter::GPUSupportedLimits;
3133
use crate::command_encoder::GPUCommandEncoder;
32-
use crate::error::{GPUError, GPUGenericError};
34+
use crate::error::{
35+
GPUError, GPUGenericError, GPUPipelineError, GPUPipelineErrorInit,
36+
GPUPipelineErrorReason,
37+
};
3338
use crate::query_set::GPUQuerySet;
3439
use crate::render_bundle::GPURenderBundleEncoder;
3540
use crate::render_pipeline::GPURenderPipeline;
@@ -509,7 +514,9 @@ impl GPUDevice {
509514
&self,
510515
#[webidl] descriptor: super::render_pipeline::GPURenderPipelineDescriptor,
511516
) -> Result<GPURenderPipeline, JsErrorBox> {
512-
self.new_render_pipeline(descriptor)
517+
let (render_pipeline, err) = self.new_render_pipeline(descriptor)?;
518+
self.error_handler.push_error(err);
519+
Ok(render_pipeline)
513520
}
514521

515522
#[async_method]
@@ -529,7 +536,27 @@ impl GPUDevice {
529536
&self,
530537
#[webidl] descriptor: super::render_pipeline::GPURenderPipelineDescriptor,
531538
) -> Result<GPURenderPipeline, JsErrorBox> {
532-
self.new_render_pipeline(descriptor)
539+
let (render_pipeline, err) = self.new_render_pipeline(descriptor)?;
540+
if let Some(err) = err {
541+
use wgpu_types::error::ErrorType;
542+
use wgpu_types::error::WebGpuError as _;
543+
544+
let reason = match err.webgpu_error_type() {
545+
ErrorType::Internal => GPUPipelineErrorReason::Internal,
546+
ErrorType::Validation => GPUPipelineErrorReason::Validation,
547+
ErrorType::OutOfMemory | ErrorType::DeviceLost => {
548+
self.error_handler.push_error(Some(err));
549+
return Ok(render_pipeline);
550+
}
551+
};
552+
Err(JsErrorBox::from_err(GPUPipelineError::new(
553+
GPUPipelineErrorInit { reason },
554+
anyhow::Error::new(err),
555+
)))
556+
// NOTE: `render_pipeline` gets dropped.
557+
} else {
558+
Ok(render_pipeline)
559+
}
533560
}
534561

535562
fn create_command_encoder<'a>(
@@ -773,7 +800,8 @@ impl GPUDevice {
773800
fn new_render_pipeline(
774801
&self,
775802
descriptor: super::render_pipeline::GPURenderPipelineDescriptor,
776-
) -> Result<GPURenderPipeline, JsErrorBox> {
803+
) -> Result<(GPURenderPipeline, Option<CreateRenderPipelineError>), JsErrorBox>
804+
{
777805
let vertex = wgpu_core::pipeline::VertexState {
778806
stage: ProgrammableStageDescriptor {
779807
module: descriptor.vertex.module.id,
@@ -934,14 +962,14 @@ impl GPUDevice {
934962
None,
935963
);
936964

937-
self.error_handler.push_error(err);
938-
939-
Ok(GPURenderPipeline {
965+
let render_pipeline = GPURenderPipeline {
940966
instance: self.instance.clone(),
941967
error_handler: self.error_handler.clone(),
942968
id,
943969
label: descriptor.label,
944-
})
970+
};
971+
972+
Ok((render_pipeline, err))
945973
}
946974
}
947975

0 commit comments

Comments
 (0)