@@ -6,13 +6,15 @@ use std::num::NonZeroU64;
66use std:: rc:: Rc ;
77
88use deno_core:: cppgc:: { make_cppgc_object, SameObject } ;
9- use deno_core:: op2;
109use deno_core:: v8;
1110use deno_core:: webidl:: WebIdlInterfaceConverter ;
1211use deno_core:: GarbageCollected ;
12+ use deno_core:: { anyhow, op2} ;
1313use deno_error:: JsErrorBox ;
1414use wgpu_core:: binding_model:: BindingResource ;
15- use wgpu_core:: pipeline:: ProgrammableStageDescriptor ;
15+ use wgpu_core:: pipeline:: {
16+ CreateRenderPipelineError , ProgrammableStageDescriptor ,
17+ } ;
1618use wgpu_types:: BindingType ;
1719
1820use super :: bind_group:: GPUBindGroup ;
@@ -29,7 +31,10 @@ use crate::adapter::GPUAdapterInfo;
2931use crate :: adapter:: GPUSupportedFeatures ;
3032use crate :: adapter:: GPUSupportedLimits ;
3133use crate :: command_encoder:: GPUCommandEncoder ;
32- use crate :: error:: { GPUError , GPUGenericError } ;
34+ use crate :: error:: {
35+ GPUError , GPUGenericError , GPUPipelineError , GPUPipelineErrorInit ,
36+ GPUPipelineErrorReason ,
37+ } ;
3338use crate :: query_set:: GPUQuerySet ;
3439use crate :: render_bundle:: GPURenderBundleEncoder ;
3540use 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